簡體   English   中英

刪除地標並將減去地標的整個 kml 保存到新文件中

[英]Delete a Placemark and save the whole kml minus the placemark into a new file

我的目標是刪除使用 sharpkml 讀取的 kml 文件中的地標,並將 xml 保存為新的 kml。

我試過的

  • RemoveChildren -> 未找到
  • AddUpdate 與 DeleteCollection -> 不工作

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 減去地標保存在新文件中?

好的... PlacemarkFeature ,並且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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM