[英]How to get out all routes [PlaceMark, LineString] in a KML-file when added to Google Maps? [C#]
[英]Delete a Placemark and save the whole kml minus the placemark into a new file
我的目標是刪除使用 sharpkml 讀取的 kml 文件中的地標,並將 xml 保存為新的 kml。
我試過的
和
using SharpKml.Base;
using SharpKml.Dom;
using SharpKml.Engine;
TextReader i_test = File.OpenText(@"test.kml");
KmlFile k_test = KmlFile.Load(i_test);
Kml l_test = k_test.Root as Kml;
var serializer = new Serializer();
if (l_test != null)
{
foreach (var ort_u in l_test.Flatten().OfType<Placemark>())
{
Placemark p_u = ort_u;
foreach(var einh in ort_u.ExtendedData.Data)
{
if (einh.Name == "teststring")
{
var update = new Update();
update.AddUpdate(new DeleteCollection(){ p_u });
serializer.Serialize(l_test);
Console.WriteLine(serializer.Xml.Length);
}
}
}
}
它們都不起作用。
如何使用 SharpKml 刪除地標並將整個 kml 減去地標保存在新文件中?
好的... Placemark
是Feature
,並且Feature
s go 在Container
s 中...在Container
s 中有一個恰當命名的.RemoveFeature()
... 遺憾的是,該方法使用.Id
來查找Feature
,但不是所有Feature
都有一個Id
...但是我們可以解決這個問題。 我們設置了一個臨時Id
( Guid.NewGuid().ToString()
),它或多或少保證是唯一的( Guid
或多或少保證是唯一的),我們使用這個Id
來刪除Feature
。
請注意,我必須在foreach
中添加一個.ToArray()
,因為您不能修改您正在經歷的集合,但是使用.ToArray()
我們 go 通過集合的“副本”,而我們刪除原作中的元素。
foreach (var placemark in kml.Flatten().OfType<Placemark>().ToArray())
{
if (placemark.Name == "Simple placemark")
{
placemark.Id = Guid.NewGuid().ToString();
((Container)placemark.Parent).RemoveFeature(placemark.Id);
}
Console.WriteLine(placemark.Name);
}
我在 SharpKml 的 github 上打開了一個關於這件事的錯誤。
為了節省:
using (var stream = File.Create("output.kml"))
{
var ser = new Serializer();
ser.Serialize(kml, stream);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.