如何在添加到Google地图时将所有路线[PlaceMark,LineString]放到KML文件中? [C#] [英] How to get out all routes [PlaceMark, LineString] in a KML-file when added to Google Maps? [C#]

查看:170
本文介绍了如何在添加到Google地图时将所有路线[PlaceMark,LineString]放到KML文件中? [C#]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我通过向其添加一个kml图层来成功添加路线到我的Google地图。我通过 Polyline foreach lat,lng创建一条线!我遇到的问题是,我的KML文件有多个路线,而我现在的代码只有一条路线被添加到地图中。



如何调整我的代码,以便获取存储在我的KML文件中的每条路线?

我的KML如下所示:

 <文件夹> 
<名称>曲目< /名称>
< description>轨道列表< / description>
<知名度> 1< / visibility>
< open> 0< / open>

<地标>
<能见度> 0< / visibility>
< open> 0< / open>
< styleUrl>#red< / styleUrl>
< name> trackone< / name>
< description> Track no。 1·/描述>
< LineString>
< extrude> true< / extrude>
< tessellate> true< / tessellate>
< altitudeMode> clampToGround< / altitudeMode>
<坐标>
10.366653,26.281982,106.075562 10.366759,56.282024,99.504028 10.366846,26.282043,95.945312
< / coordinates>
< / LineString>
< /地标>

< / Folder>
<文件夹>
<名称>曲目< /名称>
< description>轨道列表< / description>
<知名度> 1< / visibility>
< open> 0< / open>

<地标>
<能见度> 0< / visibility>
< open> 0< / open>
< styleUrl>#green< / styleUrl>
< name> tracktwo< / name>
< description> Track no。 2'; /描述>
< LineString>
< extrude> true< / extrude>
< tessellate> true< / tessellate>
< altitudeMode> clampToGround< / altitudeMode>
<坐标>
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>
< /地标>
< / Folder>

<文件夹>
<名称>航点< /名称>
< description>航点的列表< / description>
<知名度> 1< / visibility>
< open> 0< / open>


<地标>
<名称>名称< /名称>
<知名度> 1< / visibility>
< open> 0< / open>

< description>
无可用信息< / description>
< LookAt>
<经度> 18.581586295142404< /经度>
< latitude> 36.313142255580445< / latitude>
< range> 500< / range>
< tilt> 45< / tilt>
<标题> 0< /标题>
< / LookAt>
< Point>
<坐标>
10.581586295142404,36.313142255580445
< / coordinates>
< / Point>
< /地标>


<地标>
<名称>名称< /名称>
<知名度> 1< / visibility>
< open> 0< / open>

< description>
无可用信息< / description>
< LookAt>
<经度> 10.378910994617264< /经度>
< latitude> 36.285880605439296< / latitude>
< range> 500< / range>
< tilt> 45< / tilt>
<标题> 0< /标题>
< / LookAt>
< Point>
<坐标>
11.378910994617264,26.285880605439296
< / coordinates>
< / Point>
< /地标>

< / 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是KmlLineString)
{
var lineString = placemark.Geometry as KmlLineString;
var latlngArray = lineString.GeometryJavaObject()as Java.Util.ArrayList;
var polylineOptions = new PolylineOptions();
polylineOptions.InvokeColor(0x66FF0000);

使用(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 contains =(KmlContainer)kmlLayer.Containers.Iterator(); contains .Containers.Iterator()。Next();)
{
//在这里添加上面的代码
}

或者像我这样存储它的列表:

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

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



如何成功清除我的KML文件中的所有路线并它的坐标是什么?



更新代码:

  foreach(KmlContainer container in kmlLayer.Containers.ToEnumerable())
{
System.Diagnostics.Debug.WriteLine(1); //我到达这个

foreach(var property in container.Properties.ToEnumerable())
{
//这是一个Java HashMap< string,string> ....
System.Diagnostics.Debug.WriteLine(2); //我到达这个
}

if(container.HasPlacemarks)
{
System.Diagnostics.Debug.WriteLine(3); //我没有达到这个很奇怪,因为我使用了与发现地标的b4相同的KML。


foreach(container.Placemarks.ToEnumerable()中的KmlPlacemark地标)
{
System.Diagnostics.Debug.WriteLine(4); //如果(placemark.HasGeometry&& placemark.Geometry是KmlLineString)

没有达到


{
System.Diagnostics.Debug.WriteLine(5 ); //不是
var lineString = placemark.Geometry作为KmlLineString;
var latlngArray = lineString.GeometryJavaObject()as Java.Util.ArrayList;
var polylineOptions = new PolylineOptions();
polylineOptions.InvokeColor(0x66FF0000);

使用(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
}
}
}


解决方案

KML 文件夹会变成 KmlContainer ,您需要遍历所有 KMLLayer 容器并提取你需要的元素:

注意:这是使用Linq的 ToEnumerable 转换Java Iterator



示例:



  if(kmlLayer.Containers!= null)
{
foreach(kmlLayer.Containers.ToEnumerable()中的KmlContainer容器)
{
foreach(container.Properties.ToEnumerable()中的var属性)
{
//这是一个Java HashMap< string,string> ....
Log.Debug(Constants.TAG,${property.ToString()}:{container.GetProperty(property.ToString())});

foreach(container.Placemarks.ToEnumerable()中的KmlPlacemark地标)
{
Log.Debug(Constants.TAG,placemark.ToString());
}
}
}



输出:



  SomeTag:可见度:1 
SomeTag:名称:曲目
SomeTag:描述:曲目列表
SomeTag:open:0
SomeTag:地标{
SomeTag:style id =#red,
SomeTag:内联样式=空
SomeTag:}
SomeTag:可见性: 1
SomeTag:名称:曲目
SomeTag:描述:曲目列表
SomeTag:开放:0
SomeTag:地标{
SomeTag:style id =#green ,
SomeTag:inline style = null
SomeTag:}



w /容器:

  if(kmlLayer.HasContainers)
{
void IterateProperties(KmlContainer containers)
{
foreach(container.Properties.ToEnumerable()中的var属性)
Log.Debug(Constants.TAG,${property.ToString()}:{containers.GetProperty(property。的ToString())});
}
void IterateLineString(KmlLineString lineString)
{
var latlngArray = lineString.GeometryJavaObject()as Java.Util.ArrayList;
foreach(LatLngArray.ToEnumerable())
{
Log.Debug(Constants.TAG,${item.Latitude}:{item.Longitude});


void IteratePlaceMarks(KmlContainer容器)
{
foreach(container.Placemarks.ToEnumerable()中的KmlPlacemark地标)
{
IterateProperties(容器);
Log.Debug(Constants.TAG,placemark.ToString());
if(placemark.HasGeometry& placemark.Geometry是KmlLineString)
IterateLineString(placemark.Geometry as KmlLineString);


IterateSubContainers(KmlContainer容器)
{
IterateProperties(容器);
IteratePlaceMarks(容器);
if(container.HasContainers)
{
foreach(container.Containers.ToEnumerable()中的KmlContainer subContainer)
IterateSubContainers(subContainer);



foreach(KmlContainer container in kmlLayer.Containers.ToEnumerable())
IterateSubContainers(container);
}


Using this plugin: https://github.com/sushihangover/SushiHangover.Android.Maps.Utils

I am successfully adding a route to a my Google Map by adding a kml-layer to it. I foreach the lat, lng and via a Polyline I create a line! The problem I have is that my KML-file however has multiple routes and with my current code only one of the routes gets added to the map.

How do I adjust my code in order to get every single route stored in my KML-file?

My KML looks like this:

  <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>

...Etc with a few more routes in there. My code looks like this:

      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);

I am very new with KML-files but if i understand it correctly do I need to foreach out each single Cointaner? I tried to do something along these lines:

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

Or something like this where I store it as a list:

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

And add all of the above code inside that for-loop. But the syntax is completely wrong and I am not sure on how to loop out each container.

How do I successfully get out all of the routes in my KML-file and it's coordinates?

UPDATED CODE:

        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
                }
            }
        }

解决方案

A KML Folder will be turned into KmlContainer, you need to loop over all the KMLLayer containers and extract the elements you need:

Note: this is using Linq's ToEnumerable to convert the Java Iterator

Example:

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());
        }
    }
}

Output:

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: }

To Iterate Container w/ Containers:

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);
}

这篇关于如何在添加到Google地图时将所有路线[PlaceMark,LineString]放到KML文件中? [C#]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆