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经过的城市:


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