试图在谷歌地球插件中创建一个组选择框

Trying to create a Group Selection Box in Google Earth Plugin

本文关键字:一个 选择 谷歌地球 插件 创建      更新时间:2023-09-26

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

按照我现在的设置方式,c#代码会跟踪我何时处于选择模式,如果我处于选择模式的话,第一次左键点击会从谷歌地球插件中提取该点的纬度。之后,鼠标移动得到对角的lat-long,然后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');)。如果我切换到清除所有内容并从create Placemark调用中删除ID,这至少不会崩溃。然而,即使我这样做,我也只能看到矩形的右垂直边。

如果我切换到清除所有内容并从createPlacemark调用,这至少不会崩溃。

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

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

永久删除对象,允许重用其ID。一旦对象被释放,尝试访问它将导致错误

否则,您可以简单地切换占位符的可见状态,而不是每次添加和删除它。

ID重用的实际问题被列为一个错误,这里有关于这个问题的更多信息

编辑:

从外观上看,发布方法可能存在错误。

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

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

显示问题可能是由于镶嵌和高度模式造成的。

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

所以你有

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/

我有一个应用程序可以做一些非常类似的事情。不幸的是,代码不是GPL,所以我不能在这里发布它。总的来说,你的方法是正确的,但我相信你的问题是你用来建造盒子的结构。

您需要使用四个单独的KmlLineString对象(一个用于长方体的每个边)或一个KmlLinearRing来创建一个封闭的长方体。我不相信KmlLineString是用来创建闭合多边形的,这就是线性环的作用。

你计算框点的方式对我来说很好(将其与我的工作解决方案进行比较),所以我想如果你把createLineString换成createLinearRing,你会很顺利的。

谷歌的样本在下面的链接中。您将看到它们对封闭的多边形使用linearRing。(大约在页面的一半)

https://developers.google.com/earth/documentation/geometries