GeoJson文件使用示例
本节提供了几个读取GeoJson文件生成地图的文件。
关于json数据的解析,可参考:
json解析
Map控件提供了一个CreatFromJsonObject方法,用于根据Feature节点生成对应的地图对象,其语法为:
CreatFromJsonObject(Feature,MaxCount)
Feature: JObject类型,GeoJson文件中的一个Feature节点。
MaxCount:可选参数,对于MultiLineString和MultiPolygon类型的数据,可用此参数设置生成的线条和多边形的最大数量。
示例一
本示例内容可以参考CaseStudy目录下的文件"地图.Table"的示例二十。
本示例使用了CaseStudy目录下的GeoJson文件"中国.json"
1、将Map控件的"地图来源"属性设置为"None"
2、将窗口的AfterLoad事件代码设置为:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
New
VectorLayer()
layer.Style.Stroke.Color = Color.DarkGray
layer.LabelVisibility = LabelVisibility.AutoHide
map.Layers.Add(layer)
Dim
file
As
String
= ProjectPath &
"中国.json"
Dim
jo
As
JObject = JObject.Parse(FileSys.ReadAllText(file))
For
Each
jt
As
JToken
In
jo("features")
'遍历feature节点
Dim
data
As
JToken = jt("properties")
'获取属性节点
Dim
type
As
String
= jt("geometry")("type")
'获取节点数据类型
If
type =
"MultiPolygon"
OrElse
type =
"Polygon"
Then
'如果类型为多边形
Dim
polygon
As
VectorPolygon = map.CreatFromJsonObject(jt)
'创建多边形
polygon.Tag = data("name")
If
data("name")
=
"安徽省"
Then
polygon.Style.BackColor = Color.BlueViolet
Else
If
data("name")
=
"北京市"
Then
Dim
mark
As
New
VectorPlacemark()
mark.Marker.Size =
New
Size(16, 16)
mark.Geometry =
New
GeoPoint(data("center")(0),
data("center")(1))
mark.Marker.Shape = MarkerShape.Star
Mark.Style.BackColor = Color.Red
mark.Style.Stroke.Color = Color.Red
mark.Marker.Caption =
"北京"
mark.LabelStyle.ForeColor = Color.Green
mark.Marker.LabelPosition = LabelPosition.Right
layer.Items.Add(mark)
End
If
layer.Items.Add(polygon)
End
If
Next
生成的地图为:

示例二
本示例内容可以参考CaseStudy目录下的文件"地图.Table"的示例二十一。
本示例使用了CaseStudy目录下的GeoJson文件:
中国.json
省会,json
长江.json
G65.json
其中“省会.json”为中国给省会城市的经纬度坐标,“长江.json”为长江干流的走向,"G65.json"为G65高速(茂名方向)的走向。
1、将Map控件的"地图来源"属性设置为"None"
2、将窗口的AfterLoad事件代码设置为:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer
As
New
VectorLayer()
layer.Style.Stroke.Color = Color.DarkGray
layer.LabelVisibility = LabelVisibility.AutoHide
map.Layers.Add(layer)
Dim
files()
As
String
= {"中国.json",
"省会.json",
"长江.json",
"G65.json"}
For
Each
file
As
String
In
files
Dim
jo
As
JObject = JObject.Parse(FileSys.ReadAllText(ProjectPath & file))
For
Each
jt
As
JToken
In
jo("features")
'遍历feature节点
Dim
data
As
JToken = jt("properties")
'获取属性节点
Dim
type
As
String
= jt("geometry")("type")
'获取节点数据类型
Select
Case
type
Case
"MultiPolygon"
,
"Polygon"
layer.Items.Add(map.CreatFromJsonObject(jt))
Case
"Point",
"MultiPoint"
Dim
mark
As
VectorPlacemark = map.CreatFromJsonObject(jt)
mark.Marker.Caption = data("name")
mark.Marker.LabelPosition = LabelPosition.Right
If
data("name")
=
"北京"
Then
mark.Marker.Shape = MarkerShape.Star
mark.Style.Stroke.Color = Color.Red
mark.Style.BackColor = Color.Red
mark.Marker.Size =
New
Size(16, 16)
Else
mark.Marker.Shape = MarkerShape.Circle
mark.Style.Stroke.Color = Color.Green
mark.Style.BackColor = Color.Green
mark.Marker.Size =
New
Size(6, 6)
End
If
layer.Items.Add(mark)
Case
"LineString",
"MultiLineString"
Dim
line
As
VectorPolyline = map.CreatFromJsonObject(jt)
line.Style.Stroke.Width = 2
If
data("type")
=
"river"
Then'如果是河流
line.Style.Stroke.Color = Color.Blue
ElseIf
data("type")
=
"highway"
Then'如果是高速公路
line.Style.Stroke.Color = Color.Red
line.Style.Stroke.Style = GeoDashStyle.Dash
End
if
layer.Items.Add(line)
End
Select
Next
Next
生成的地图为:

示例三
本示例内容可以参考CaseStudy目录下的文件"地图.Table"的示例二十二。
各种地图数据可以混用,我们可以基于行政区域表绘制地图,然后基于GeoJso绘制高速或河流:
1、将Map控件的"地图来源"属性设置为"None"
2、将窗口的AfterLoad事件代码设置为:
Dim
map
As
GeoMap = e.Form.Controls("Map1").GeoMap
'基于GeoJson文件绘制一条高速
Dim
layer
As
New
VectorLayer()
map.Layers.Add(layer)
Dim
jo
As
JObject = JObject.Parse(FileSys.ReadAllText(ProjectPath &
"G65.json"))
For
Each
jt
As
JToken
In
jo("features")
'遍历feature节点
Dim
data
As
JToken = jt("properties")
'获取属性节点
Dim
line
As
VectorPolyline = map.CreatFromJsonObject(jt)
line.Style.Stroke.Width = 2
line.Style.Stroke.Color = Color.Blue
line.Style.Stroke.Style = GeoDashStyle.Dash
layer.Items.Add(line)
Next
'基于行政区域表绘制地图
For
level
As
Integer
= 1
To
2
layer =
New
VectorLayer()
'每一级行政区一个图层
map.Layers.Add(layer)
layer.Style.Stroke.Color = Color.FromArgb(50, 255, 0, 0)
layer.LabelVisibility = LabelVisibility.AutoHide
layer.LabelStyle.ForeColor = Color.Green
If
level = 1
Then
layer.MaxZoom = 4.5
'缩放比例小于4.5时显示省级行政区
ElseIf
level = 2
Then
layer.MinZoom = 4.5
'缩放比例超过4.5之后显示市级行政区
End
If
For
Each
dr
As
DataRow
In
DataTables("行政区域").Select("level=
"
& level)
layer.Items.Add(map.CreatePolygon(dr("geometry"),
5))
If
level = 2
OrElse
"北京市天津市上海市重庆市".Contains(dr("name"))
Then
'如果是地级市或直辖市
Dim
mark
As
New
VectorPlacemark()
mark.Marker.Shape = MarkerShape.Circle
mark.Style.BackColor = Color.Blue
mark.Marker.Size =
New
Size(6, 6)
mark.Marker.LabelPosition = LabelPosition.Right
mark.Marker.Caption = dr("name")
mark.Geometry =
New
GeoPoint(dr("centerX"),
dr("centerY"))
layer.Items.Add(mark)
End
If
Next
Next
生成的地图为:

放大地图后会显示G65经过的城市:
