当添加到谷歌地图时,如何取出KML文件中的所有路线[PlaceMark,LineString]?[C#]



使用此插件: https://github.com/sushihangover/SushiHangover.Android.Maps.Utils

我通过向我的谷歌地图添加 kml 图层成功地将路线添加到我的 Google 地图中。我为纬度,液化天然气,并通过Polyline创建一条线!我遇到的问题是我的 KML 文件具有多条路线,并且使用我当前的代码,只有一条路线被添加到地图中。

如何调整代码以将每个路由存储在我的 KML 文件中?

我的 KML 如下所示:

<Folder>
<name>Tracks</name>
<description>A list of tracks</description>
<visibility>1</visibility>            
<open>0</open>
<Placemark>
<visibility>0</visibility>            
<open>0</open> 
<styleUrl>#red</styleUrl>
<name>trackone</name>
<description>Track no. 1</description>
<LineString>
<extrude>true</extrude>
<tessellate>true</tessellate>
<altitudeMode>clampToGround</altitudeMode> 
<coordinates>
10.366653,26.281982,106.075562 10.366759,56.282024,99.504028 10.366846,26.282043,95.945312                            
</coordinates>
</LineString>
</Placemark>
</Folder>
<Folder>
<name>Tracks</name>
<description>A list of tracks</description>
<visibility>1</visibility>            
<open>0</open>
<Placemark>
<visibility>0</visibility>            
<open>0</open> 
<styleUrl>#green</styleUrl>
<name>tracktwo</name>
<description>Track no. 2</description>
<LineString>
<extrude>true</extrude>
<tessellate>true</tessellate>
<altitudeMode>clampToGround</altitudeMode> 
<coordinates>
10.299386,26.278042,84.550720 
10.299453,26.278004,83.942444 
10.299522,26.277962,85.036560 
10.299572,26.277916,85.828735         
</coordinates>
</LineString>
</Placemark>
</Folder>  
<Folder>
<name>Waypoints</name>
<description>A list of waypoints</description>
<visibility>1</visibility>
<open>0</open>

<Placemark>
<name>name</name>                      
<visibility>1</visibility>            
<open>0</open>                        
<description>
No info available                </description>       
<LookAt>
<longitude>18.581586295142404</longitude>
<latitude>36.313142255580445</latitude>
<range>500</range>
<tilt>45</tilt>
<heading>0</heading>
</LookAt>
<Point>
<coordinates>
10.581586295142404,36.313142255580445                        
</coordinates>
</Point>
</Placemark>

<Placemark>
<name>name</name>                      
<visibility>1</visibility>            
<open>0</open>                        
<description>
No info available                </description>       
<LookAt>
<longitude>10.378910994617264</longitude>
<latitude>36.285880605439296</latitude>
<range>500</range>
<tilt>45</tilt>
<heading>0</heading>
</LookAt>
<Point>
<coordinates>
11.378910994617264,26.285880605439296                        
</coordinates>
</Point>
</Placemark>
</Folder>

。等等,那里还有几条路线。我的代码如下所示:

var container = (KmlContainer)kmlLayer.Containers.Iterator().Next();
container = (KmlContainer)container.Containers.Iterator().Next();
var placemark = (KmlPlacemark)container.Placemarks.Iterator().Next();
if (placemark.HasGeometry && placemark.Geometry is KmlLineString)
{
var lineString = placemark.Geometry as KmlLineString;
var latlngArray = lineString.GeometryJavaObject() as Java.Util.ArrayList;
var polylineOptions = new PolylineOptions();
polylineOptions.InvokeColor(0x66FF0000);
using (var builder = new LatLngBounds.Builder())
{
foreach (LatLng latLng in latlngArray.ToEnumerable())
{
builder.Include(latLng);
polylineOptions.Add(new LatLng(latLng.Latitude, latLng.Longitude));
}
}
map.AddPolyline(polylineOptions);

我对KML文件很陌生,但是如果我理解正确,我是否需要找出每个Cointaner?我试图按照这些思路做一些事情:

for (var contain = (KmlContainer)kmlLayer.Containers.Iterator(); contain.Containers.Iterator().Next();)
{
//add above code in here
}

或者像这样的东西,我将其存储为列表:

List<KmlContainer> cointainers = kmlLayer.Containers.Iterator().Next() as List<KmlContainer>;

并将上述所有代码添加到该 for 循环中。但是语法是完全错误的,我不确定如何循环每个容器。

如何成功获取 KML 文件中的所有路径及其坐标?

更新的代码:

foreach (KmlContainer container in kmlLayer.Containers.ToEnumerable())
{
System.Diagnostics.Debug.WriteLine("1"); // i reach this
foreach (var property in container.Properties.ToEnumerable())
{
//This is a Java HashMap<string, string> ....
System.Diagnostics.Debug.WriteLine("2"); //i reach this
}
if (container.HasPlacemarks)
{
System.Diagnostics.Debug.WriteLine("3"); //i do not reach this which is strange since I use the same KML as b4 that found placemarks.
}
foreach (KmlPlacemark placemark in container.Placemarks.ToEnumerable())
{
System.Diagnostics.Debug.WriteLine("4"); // i do not reach this
if (placemark.HasGeometry && placemark.Geometry is KmlLineString)
{
System.Diagnostics.Debug.WriteLine("5"); //not this
var lineString = placemark.Geometry as KmlLineString;
var latlngArray = lineString.GeometryJavaObject() as Java.Util.ArrayList;
var polylineOptions = new PolylineOptions();
polylineOptions.InvokeColor(0x66FF0000);
using (var builder = new LatLngBounds.Builder())
{
foreach (LatLng latLng in latlngArray.ToEnumerable())
{
builder.Include(latLng);
polylineOptions.Add(new LatLng(latLng.Latitude, latLng.Longitude));
}
}
map.AddPolyline(polylineOptions);
}
else
{
System.Diagnostics.Debug.WriteLine("6"); //not this
}
}
}

一个 KMLFolder将被转换为KmlContainer,您需要遍历所有KMLLayer容器并提取所需的元素:

注意:这是使用 Linq 的ToEnumerable来转换 JavaIterator

例:

if (kmlLayer.Containers != null)
{
foreach (KmlContainer container in kmlLayer.Containers.ToEnumerable())
{
foreach (var property in container.Properties.ToEnumerable())
{
//This is a Java HashMap<string, string> ....
Log.Debug(Constants.TAG, $"{property.ToString()} : {container.GetProperty(property.ToString())}"); 
}
foreach (KmlPlacemark placemark in container.Placemarks.ToEnumerable())
{
Log.Debug(Constants.TAG, placemark.ToString());
}
}
}

输出:

SomeTag: visibility : 1
SomeTag: name : Tracks
SomeTag: description : A list of tracks
SomeTag: open : 0
SomeTag: Placemark{
SomeTag:  style id=#red,
SomeTag:  inline style=null
SomeTag: }
SomeTag: visibility : 1
SomeTag: name : Tracks
SomeTag: description : A list of tracks
SomeTag: open : 0
SomeTag: Placemark{
SomeTag:  style id=#green,
SomeTag:  inline style=null
SomeTag: }

要迭代带容器的容器:

if (kmlLayer.HasContainers)
{
void IterateProperties(KmlContainer containers)
{
foreach (var property in containers.Properties.ToEnumerable())
Log.Debug(Constants.TAG, $"{property.ToString()} : {containers.GetProperty(property.ToString())}");
}
void IterateLineString(KmlLineString lineString)
{
var latlngArray = lineString.GeometryJavaObject() as Java.Util.ArrayList;
foreach (LatLng item in latlngArray.ToEnumerable())
{
Log.Debug(Constants.TAG, $"{item.Latitude}:{item.Longitude}");
}
}
void IteratePlaceMarks(KmlContainer container)
{
foreach (KmlPlacemark placemark in container.Placemarks.ToEnumerable())
{
IterateProperties(container);
Log.Debug(Constants.TAG, placemark.ToString());
if (placemark.HasGeometry & placemark.Geometry is KmlLineString)
IterateLineString(placemark.Geometry as KmlLineString);
}
}
void IterateSubContainers(KmlContainer container)
{
IterateProperties(container);
IteratePlaceMarks(container);
if (container.HasContainers)
{
foreach (KmlContainer subContainer in container.Containers.ToEnumerable())
IterateSubContainers(subContainer);
}
}
foreach (KmlContainer container in kmlLayer.Containers.ToEnumerable())
IterateSubContainers(container);
}

最新更新