澳门地图

本示例内容可以参考CaseStudy目录下的文件"地图.Table"的示例二十三。

本示例基于18个GeoJson生成了完整的澳门的地图,每一个GeoJson对应一种地理元素,例如道路、河流、公园等等,且单独一个矢量层,你可以勾选需要在地图生显示什么内容:

所有GeoJson文件都来自OpenStreetMap (OSM) 数据导出的标准SHP文件,然后我将其转换成了GeoJson文件。

示例

1、将Map控件的"地图来源"属性设置为"None"

2、将窗口的AfterLoad事件代码设置为:

Dim chkLayers As WinForm.CheckedListBox = e.Form.Controls("chkLayers")
Dim
map As GeoMap = e.Form.Controls("Map1").GeoMap
For
Each file As String In FileSys.GetFiles(ProjectPath & "澳门")
   
Dim layer As New VectorLayer()
    layer.Name = System.IO.Path.GetFileNameWithoutExtension(file)
'layer指定名称
    layer.Style.Stroke.Color = Color.DarkGray
    layer.LabelVisibility = LabelVisibility.AutoHide
    layer.Style.Stroke.Color = Color.DarkBlue
    layer.Style.BackColor = Color.WhiteSmoke
    map.Viewport.Margin =
New Padding(0, 0, 200, 0) '地图右侧留空200个像素用于显示复选框
    map.Layers.Add(layer)
   
Dim jo As JObject = JObject.Parse(FileSys.ReadAllText(file))
   
For Each jt As JToken In jo("features")
        layer.Items.Add(map.CreatFromJsonObject(jt))
   
Next
    chkLayers.Items.Add(layer.Name, System.Windows.Forms.CheckState.Checked)

Next

3、CheckedListBox的ItemChecked事件代码设置为:

Dim name As String = e.Sender.Items(e.Index).ToString()
Dim
map As GeoMap = e.Form.Controls("Map1").GeoMap
For
Each layer As VectorLayer In map.Layers
   
If layer.Name = name Then
        layer.Visible = e.Checked
   
End If    
Next

为了不分散大家的注意力,这里的代码很简单,没有对地理元素进行颜色区分,也没有进行标记。

如果你想进行标记和区分,也很简单,当然你要提前熟悉一下这些GeoJson文件的结构。

例如我们希望用不同的背景颜色显示水域,并标记出澳门的餐饮点,可以修改代码为:

Dim chkLayers As WinForm.CheckedListBox = e.Form.Controls("chkLayers")
Dim
map As GeoMap = e.Form.Controls("Map1").GeoMap
Dim
files() As String = {}
For
Each file As String In FileSys.GetFiles(ProjectPath & "澳门")
   
Dim layer As New VectorLayer()
    layer.Name = System.IO.Path.GetFileNameWithoutExtension(file)
'layer指定名称
    layer.Style.Stroke.Color = Color.DarkGray
    layer.LabelVisibility = LabelVisibility.AutoHide
    layer.Style.Stroke.Color = Color.DarkBlue
    layer.Style.BackColor = Color.WhiteSmoke
    layer.LabelStyle.ForeColor = Color.SeaGreen
    map.Viewport.Margin =
New Padding(0, 0, 200, 0) '地图右侧留空200个像素用于显示复选框
    map.Layers.Add(layer)
   
Select Case layer.Name
       
Case "gis_osm_water_a_free_1", "gis_osm_water_a_free_1" '水域用不同的颜色标记
            layer.Style.BackColor = Color.CadetBlue
       
Case "gis_osm_railways_free_1" ' 铁路用红色虚线表示
            layer.Style.Stroke.Color = Color.Red

            layer.Style.Stroke.Style = GeoDashStyle.Dash

        
'其他的
   
End Select
   
Dim jo As JObject = JObject.Parse(FileSys.ReadAllText(file))
   
For Each jt As JToken In jo("features")
       
Dim data As JToken = jt("properties") '获取属性节点
       
Dim item As VectorItem = map.CreatFromJsonObject(jt)
        layer.Items.Add(item)
       
If layer.Name = "gis_osm_pois_free_1" Then '如果是兴趣点数据
            layer.MinZoom = 14
 '兴趣点层只有缩放比例达到14才显示
           
If TypeOf item Is VectorPlacemark Then
               
Dim mark As VectorPlacemark = item
               
Select Case data("fclass").ToString()
                   
Case "Restaurant", "Fast Food", "Cafe", "Bar“, ”Pub" '如果兴趣点是餐饮相关
                        mark.Marker.Shape = MarkerShape.Circle
                        mark.Marker.Size =
New Size(6, 6)
                        mark.Marker.Caption = data(
"name")
                        mark.Marker.LabelPosition = LabelPosition.Right
               
End Select
           
End If
       
End If
   
Next
    chkLayers.Items.Add(layer.Name, System.Windows.Forms.CheckState.Checked)

Next

重要提示:

1、不同图层的形状出现重叠的时候,后绘制图层的形状会优先显示,所以请根据需要调整数据文件的绘制顺序。

2、其实没有必要将所有的数据文件绘制出来,选择自己需要的绘制即可。


本页地址:http://www.foxtable.com/webhelp/topics/6159.htm