关于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。