我的目标是删除使用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保存到新文件中?
好吧... APlacemark
是Feature
,而Feature
s进入Container
s ...并且Container
s中有一个恰当的名称.RemoveFeature()
...可悲的是,该方法使用.Id
来查找Feature
,但并非所有Feature
s都有Id
...。但这可以解决。我们设置一个临时Id
(Guid.NewGuid().ToString()
),它或多或少地保证是唯一的(Guid
或多或少地保证是唯一的),并且我们使用它Id
来删除Feature
。
请注意,我不得不添加.ToArray()
的foreach
,因为你不能修改的集合,你正在经历,但与.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);
}
我已经在SharpKml的github上打开了一个关于此问题的错误。
为了保存:
using (var stream = File.Create("output.kml"))
{
var ser = new Serializer();
ser.Serialize(kml, stream);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句