【问题标题】:Delete a Placemark and save the whole kml minus the placemark into a new file删除地标并将减去地标的整个 kml 保存到新文件中
【发布时间】:2021-01-02 12:31:28
【问题描述】:

我的目标是删除使用 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 减去地标保存在新文件中?

【问题讨论】:

    标签: c# sharpkml


    【解决方案1】:

    好吧...PlacemarkFeatureFeatures 进入Containers...在Containers 中有一个恰当地命名为.RemoveFeature()...可悲的是方法使用.Id 来查找Feature,但并非所有Features 都有Id...但这我们可以解决。我们设置了一个临时的Id (Guid.NewGuid().ToString()),它或多或少保证是唯一的 (Guid are more or less guaranteed to be unique),我们使用这个Id 来删除Feature

    请注意,我必须在foreach 中添加.ToArray(),因为您无法修改您正在浏览的集合,但使用.ToArray(),我们会浏览该集合的“副本”,而我们从原始元素中删除元素。

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

    我已经为这件事打开了bug on the github of SharpKml

    为了节省:

    using (var stream = File.Create("output.kml"))
    {
        var ser = new Serializer();
        ser.Serialize(kml, stream);
    }
    

    【讨论】:

    • 好的,这行得通。但是我的地图不接受该文件。可能的原因?
    • @AureliusSchnitzler 序列化程序更改文件。我建议你下载 Winmerge 并比较前后。比如我用了google官方的示例文件,把&lt;open&gt;1&lt;/open&gt;改成&lt;open&gt;true&lt;/open&gt;等等。
    • 使用File.Create 而不是File.Write 来保存文件。 github中的不良示例。 File.Write 不会删除文件,它只会从第一个字节开始覆盖,所以如果已经有更大的文件,你将覆盖第一部分并保留最后一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2017-01-08
    • 1970-01-01
    • 2013-04-14
    • 2017-06-30
    • 2014-03-18
    相关资源
    最近更新 更多