关于KML文件

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

KML文件利用XML语法格式描述地理空间数据(如点、线、面、多边形和模型等),适合网络环境下的地理信息协作与共享。

Map控件的方法CreateRecordsFromKML用于读取KML文件,返回的结果为一个VectorRecord集合。

VectorRecord有两个属性:

VectorItem:返回生成的形状。
Data:      返回形状的附加属性集。

提示:

1、KML有个压缩格式KMZ,Foxtable暂时不支持,不过KMZ就是zip文件,你可以将解压得到KML文件后使用即可。

2、KML文件就是XML格式的文本文件,如果你需要修改,建议将其后缀名改为XML,然后使用专门的软件(例如vscode)编辑。

3、Foxtable对GeoJson的支持更完善,通常我建议将KML和KMZ文件转换为GeoJson格式使用,可以使用QGIS转换,也可是使用在线转换工具:

https://mapshaper.org/
 

在Foxtable读取KML文件生成一个地图的代码可以非常简单。

例如
Foxtable的CaseStudy目录有个KML文件"WorldMap.kml",这是一个世界地图,请将其复制到自己的项目文件夹中,然后新建一个窗口,插入地图控件,在AfterLoad事件加上代码:

Dim map As GeoMap = e.Form.Controls("Map1").GeoMap
Dim
layer As New VectorLayer()
map.Layers.Add(layer)

For
Each kr As VectorRecord In map.CreateRecordsFromKML(ProjectPath & "WorldMap.kml")
    layer.Items.Add(kr.VectorItem)
Next

短短几行代码即可生成一副世界地图:

更多的时候,我们需要从Data中读取属性,然后对VectorItem惊进行设置,大概的代码逻辑为:

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)

For
Each kr As VectorRecord In map.CreateRecordsFromKML(ProjectPath & "WorldMap.kml")
    layer.Items.Add(kr.VectorItem)
   
If TypeOf kr.VectorItem Is VectorPlacemark Then
       
Dim mark As VectorPlacemark = kr.VectorItem
       
'设置标记的属性:
        mark.Marker.Caption = kr.Data(
"name")
        mark.Marker.LabelPosition = LabelPosition.Center
        mark.LabelStyle.ForeColor = Color.Green
        mark.Lod =
New LOD(0, 0, 2, 20)
       
If kr.Data("name") = "China" Then
            mark.LabelStyle.ForeColor = Color.White
       
End If
   
ElseIf TypeOf kr.VectorItem Is VectorPolyline Then
       
Dim line As VectorPolyline = kr.VectorItem
       
'设置线条属性:
       
If kr.Data("style-strokecolor") IsNot Nothing Then 'KML文件取线条颜色,如果有的话
            line.Style.Stroke.Color = map.GetKmlStyleColor(kr.Data(
"style-strokecolor"))
       
End If
   
ElseIf TypeOf kr.VectorItem Is VectorPolygon Then
       
Dim polygon As VectorPolygon = kr.VectorItem
       
'设置多边形属性:
       
If kr.Data("name") = "China" Then '如果是中国
            polygon.Style.BackColor = Color.Red
'红色背景
       
ElseIf kr.Data("style-fillcolor") IsNot Nothing Then '其他国家从KML取得颜色设置,如果有的话
            polygon.Style.BackColor = map.GetKmlStyleColor(kr.Data(
"style-fillcolor"))
       
End If
   
End If
Next

生成的地图为:

缩放比例为超过2之后,会显示标签:

提醒:

KML文件中的颜色是16进制字符串,需要用GetKmlStyleColor将其转换为实际的Color。


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