删除地标并将整个 kml 减去地标保存到新文件中
Delete a Placemark and save the whole kml minus the placemark into a new file
我的目标是删除使用 sharpkml 读取的 kml 文件中的地标,并将 xml 另存为新的 kml。
我试过的
- 删除子项 -> 未找到
- 使用 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);
}
}
}
}
None 有效。
如何使用 SharpKml 删除地标并将整个 kml 减去地标保存到新文件中?
Ok... Placemark
是 Feature
,Feature
s 进入 Container
s... 在 Container
s 那里是一个恰当命名的 .RemoveFeature()
... 可悲的是,该方法使用 .Id
来查找 Feature
,但并非所有 Feature
都有 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);
}
我的目标是删除使用 sharpkml 读取的 kml 文件中的地标,并将 xml 另存为新的 kml。
我试过的
- 删除子项 -> 未找到
- 使用 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);
}
}
}
}
None 有效。
如何使用 SharpKml 删除地标并将整个 kml 减去地标保存到新文件中?
Ok... Placemark
是 Feature
,Feature
s 进入 Container
s... 在 Container
s 那里是一个恰当命名的 .RemoveFeature()
... 可悲的是,该方法使用 .Id
来查找 Feature
,但并非所有 Feature
都有 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);
}