c# - 尝试在 Google 地球插件中创建组选择框

标签 c# javascript google-earth-plugin

我正在构建一个通过 Web 浏览器控件使用 Google 地球插件的 C# 应用程序。作为应用程序的一部分,我需要能够在地球上的某个区域周围创建一个多选框(想想类似于在文件浏览器中拖动选择多个文件的东西)。

我现在设置它的方式是,C# 代码会跟踪我何时处于选择模式,如果我处于选择模式,则第一次左键单击会从 google earth 插件中拉出该点的经纬度。之后,鼠标移动得到对 Angular 的经纬度,然后c#代码调用以下2个javascript函数:

function clearHighlightBox(){
    var placemark = ge.getElementById('DARTselectBox');
    if(placemark)
    {
        ge.getFeatures().removeChild(placemark);
    }
}

function setHighlightBox(lat1, long1, lat2, long2){
    clearHighlightBox();
    var placemark = ge.createPlacemark('DARTselectBox');
    var lineString = ge.createLineString('');
    var coords = lineString.getCoordinates();
    coords.pushLatLngAlt(lat1, long1, 5000);
    coords.pushLatLngAlt(lat1, long2, 5000);
    coords.pushLatLngAlt(lat2, long2, 5000);
    coords.pushLatLngAlt(lat2, long1, 5000);
    coords.pushLatLngAlt(lat1, long1, 5000);
    placemark.setGeometry(lineString);
    ge.getFeatures().appendChild(placemark);
}

首先,以这种方式为地标创建 ID 似乎不起作用 (ge.createPlacemark('DARTselectBox');)。如果我切换它以清除所有内容并从创建地标调用中删除 ID,这至少不会崩溃。但是,即使这样做,我也只能看到矩形的右垂直边。

最佳答案

If I switch this to clear everything and remove the ID from the create Placemark call, this at least doesn't crash.

问题是您无法快速删除然后添加具有相同 ID 的对象。简单来说,是对 ge.createPlacemark('DARTselectBox') 的调用导致了崩溃,因为 ID DARTselectBox 仍在内部使用。您最终可以再次使用它,但时间取决于 WebBrowser 控件的垃圾回收。

为避免崩溃,您可以尝试 calling release在地标上,以便立即释放 ID。请参阅此注释,了解调用 release 的作用(我的重点)

Permanently deletes an object, allowing its ID to be reused. Attempting to access the object once it is released will result in an error.

如果失败,您可以简单地切换地标的可见状态,而不是每次都添加和删除它。

ID 重用的实际问题被列为错误,并且有一些 more information on the problem here

编辑:

看起来发布方法可能存在错误。

如果您阅读了我发布的链接 code.google.com/p/earth-api-samples/issues/detail?id=253,底部的一些评论似乎暗示了这一点。

无论如何,散列可以工作,增量计数器也可以。但我不明白你为什么不简单地将可见性设置为 false,或者创建一个根本没有 ID 的地标,并在操作期间简单地保留对它的引用。

显示问题可能是由于曲面分割和海拔模式。

尝试在 Placemarks 几何对象上调用 setTessellate(true) 并确保高度模式设置为 clampToGround - 为此,您调用 setAltitudeMode( ge.ALTITUDE_CLAMP_TO_GROUND) - 再次在 Placemarks 几何对象上。

所以你有

var lineString = ge.createLineString('');
lineString.getCoordinates().pushLatLngAlt( ... );
lineString.setTessellate(true);
lineString.setAltitudeMode(ge.ALTITUDE_CLAMP_TO_GROUND);

如果这不起作用,您能否尝试关闭地形图层并检查线条是否存在?

此外,我还编写了一个免费的控件库,它使用 API 做很多事情 - 它是 GPL,因此您可以随心所欲地使用它。它确实涵盖了很多这样的事情。 http://code.google.com/p/winforms-geplugin-control-library/

关于c# - 尝试在 Google 地球插件中创建组选择框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17662404/

相关文章:

javascript - jQuery on click 功能不能通过一个类多次工作

google-earth-plugin - 获取GE Plugin客户端坐标

c# - 使用 Roslyn API 编译 .NET Core 应用程序

c# - 从不受信任的域生成 GPO 报告

c# - 无法定义两个对象之间的关系

JavaScript 在两个不同的上下文中调用数组值

javascript - 三个 JS - 找到网格与平面相交的所有点

javascript - 调整api中google Earth版权信息的大小

javascript - Google 地球插件点击时崩溃

javascript - Nservicekit反序列化