澳门地图
本示例内容可以参考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、其实没有必要将所有的数据文件绘制出来,选择自己需要的绘制即可。