0

使用 Visual Studio C# Winforms Google Earth 插件,已将 4 个地标添加到地球,如下图所示:

在此处输入图像描述

我的目标是能够删除线串地标。这些步骤似乎是获取所有地标,找到线串并将其删除。

这是用于创建线串地标的代码(或多或少来自 API 网站)

    var lineStringPlacemark = ge2.createPlacemark("Line_" + name);
    // create the line string geometry
    var lineString = ge2.createLineString("");
    lineStringPlacemark.setGeometry(lineString);
    // add the the points to the line string geometry
    double dlat1 = Convert.ToDouble(lat1) / 100000;
    double dlon1 = Convert.ToDouble(lon1) / 100000;
    double dlat2 = Convert.ToDouble(lat2) / 100000;
    double dlon2 = Convert.ToDouble(lon2) / 100000;
    lineString.getCoordinates().pushLatLngAlt(dlat1, dlon1, 0);
    lineString.getCoordinates().pushLatLngAlt(dlat2, dlon2, 0);

    // Create a style and set width and color of line
    lineStringPlacemark.setStyleSelector(ge2.createStyle(""));
    var lineStyle = lineStringPlacemark.getStyleSelector().getLineStyle();
    lineStyle.setWidth(5);
    lineStyle.getColor().set("9900ffff");  // aabbggrr format
    // Add the feature to Earth
    ge2.getFeatures().appendChild(lineStringPlacemark);

这是我最终用来删除该行的代码。请注意 GEHelpers.RemoveFeatureById(ge2, s); 由于某种原因它对我不起作用,因此被注释掉了。

for (int i = 0; i < ge2.getFeatures().getChildNodes().getLength(); i++)
{
   var kmlobject = ge2.getFeatures().getChildNodes().item[i];
   string s = kmlobject.getId();

   if (s.Contains("Line_"))
   {                
      ge2.getFeatures().removeChild(kmlobject);
      kmlobject.release();
      //GEHelpers.RemoveFeatureById(ge2, s);
   }
}
4

1 回答 1

0

您拥有的行应该可以工作并删除所有当前加载的内容。

GEHelpers.RemoveAllFeatures(ge); // removes all loaded features from 'ge'

如果您希望删除特定地标或任何其他功能,只需将其 ID 指定为RemoveFeatureById方法的参数即可。

GEHelpers.RemoveFeatureById(ge, 'foo'); // remove the feature with the id 'foo'

可以在通过 api 创建特征或在 kml 中定义特征时设置 ID。例如

// api
ge.createPlacemark('foo');

//kml id
<Document id="foo">
</Document>

编辑:

你不应该做任何事情,除了...

for (int i = 0; i < ge2.getFeatures().getChildNodes().getLength(); i++)
{
   var kmlobject = ge2.getFeatures().getChildNodes().item[i];
   if (kmlobject.getId().Contains("Line_"))
   {                
      ge2.getFeatures().removeChild(kmlobject);
   }
}

我认为您的设置可能还有其他问题,可能与同时运行插件的多个实例有关。

于 2013-02-26T21:48:21.570 回答