快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

葡京娱乐场网址所有平台:SharpMap学习(3)



我写的器械内容浅近,盼望能给初学者一些赞助。至于深入钻研sharpmap和GIS技巧的大年夜牛,请不吝见示,给我们这些菜鸟多一些指示。

本日我们接着来聊sharpmap的基础应用技术,根据attribute来添补舆图工具的颜色,让用户更清晰的看到重点的营业工具对应在舆图上的表示,以及若何自定义label层的显示内容,字体的大年夜小等。以是,本日的主题主如果自定义:自定义theme,自定义label以及label字体。

首先,我们要为舆图添补上不合的色彩,让他们看起来五颜六色,轻易分辨。比如河流和湖泊要填成蓝色,草地要添补上绿色,屋子要添补上白色,蹊径要添补上青色等等。怎么做呢?很简单,先看下代码:

SharpMap.Rendering.Thematics.Cus葡京娱乐场网址所有平台tomTheme iThe葡京娱乐场网址所有平台me = new SharpMap.Rendering.Thematics.CustomTheme(GetMyStyle);

在初始化Map的时刻,加上上面的一行代码。它定义了一个自定义的Theme工具,这个工具的构造函数必要传入一个我们自己写的措施(委托),这个措施里面详细阐清楚明了这个 theme是若何定义的,措施代码如下:

private static SharpMap.Styles.VectorStyle GetMyStyle(SharpMap.Data.FeatureDataRow row)

{

SharpMap.Styles.VectorStyle style = new SharpMap.Styles.VectorStyle();

switch (row["Status"].ToString().ToLower())

{

case "available": //If status is interred, fill it with yellow

style.Fill = Brushes.Yellow;

return style;

default:

style.Fill = Brushes.Green;

return style;

}

}

这段简单代码大年夜家都看得懂,这个委托定义必要传入一个FeatureDataRow,它的感化便是在初始化舆图的历程中,每处置惩罚一个工具,都要到这个措施中来考察一下feature的值是若干以抉择详细要添补哪些颜色。在这里,当status为available时,就添补黄色,否则就添补绿色。定义的VectorStyle用来返回给舆图。是不是很简单呢?

舆图添补完了,我们要在上面显示出到底他们是什么。在第一篇中,我们已经可以把工具的一个属性显示出来,然则当舆图扩大年夜到必然比例时,仅仅显示名字这一种信息已经不够以满意用户的必要了。比如说一栋屋子,在很远处看它时,我们只必要看到他的颜色就行了。然则当我们离的很近的时刻,难道看到的是全白色吗?显然不是,我们还可以看到门商标,窗户上的贴纸以及其它具体信息。舆图也一样,当比例尺改变今后,应该有更具体的信息被列出来。惯例子,先贴代码:

SharpMap.Layers.LabelLayer myLabel = new SharpMap.Layers.LabelLayer("labels");

myLabel .DataSource = myLayer.DataSource;

myLabel.LabelStringDelegate= new SharpMap.Layers.LabelLayer.GetLabelMethod(GetLabelString);

在这里,首先定义了一个label(就像在初始化舆图里一样,或者就在初始化舆图里做),然后把你所要显示的图葡京娱乐场网址所有平台层的数据源赋值给这个label的数据源,接着为label层的LabelStringDelegate指定一个措施(这个措施传入一个FeatureDataRow,返回一个字符串),着末去实现这个措施,代码如下:

然后,新的问题又来了,字体不停都是那么大年夜,或者不停都是那么小,这可怎么办呢?看起来也相称不惬意啊。假如字体能跟着比例尺的变更而变更就好了。这个没问题,我们顿时就搞定它。看代码:

public void ChangeFontSize(double Zoom, SharpMap.Layers.ILayer iLayer)

{

SharpMap.Layers.LabelLayer labelLayer = (SharpMap.Layers.LabelLayer)iLayer;

if (Zoom  400)

{

((SharpMap.Layers.LabelLayer)labelLayer).Style.Font = new System.Drawing.Font(System.Drawing.FontFamily.GenericSerif, 6);

}

else if (Zoom  140)

{

((SharpMap.Layers.LabelLayer)labelLayer).Style.Font = new System.Drawing.Font(System.Drawing.FontFamily.GenericSerif, 8);

}

else if (Zoom  20)

{

((SharpMap.Layers.LabelLayer)labelLayer).Style.Font = new System.Drawing.Font(Sy葡京娱乐场网址所有平台stem.Drawing.FontFamily.GenericSerif, 16);

}

else if (Zoom

这个措施传入了一个Zoom值和一个ILayer,没有返回值,直接改动ILayer就可以了。

信托大年夜家都看得懂吧?值得留意的问题是:AjaxMap上面的map工具有个属性叫做zoomAmount,这是个javascript的属性必要在前台指定,它阐清楚明了舆图放大年夜或缩小的比例尺倍数。Demo中是在RadioButtonList的ListItem中指定的。这个历程是这样的:当点击Zoom In这个button,自动履行了一段javascript:

ajaxMapObj.disableClickEvent(); ajaxMapObj.zoomAmount = 3;

然后当我们点击舆图,click事故已经被禁止,系统刷新舆图,此时在handler里吸收到了舆图的新的参数(zoom等),然后从新绘制了舆图。以是,我们在handler里取得zoom参数,并且应用GetLayerByName(“”)措施来取得label层

ChangeFontSize(Zoom, map.GetLayerByName("mylabels"));

这样,就实现了字体跟着比例尺变更儿变更。有同砚可能问:那若何让label的内容跟着比例尺变更而变更呢?只必要把刚才那句话

myLabel.LabelStringDelegate= new SharpMap.Layers葡京娱乐场网址所有平台.LabelLayer.GetLabelMethod(GetLabelString);

放到响应的if。。else语句里就行了。简单吧?

您可能还会对下面的文章感兴趣: