0

我正在尝试逐步绘制一条道路作为 GE 插件上的动画。我在一个数组中有一组坐标(纬度,经度),我在一个循环中以小的时间间隔使用以下函数来动画地绘制小部分的整个道路。

var intFeatureCounter4Trace=0  
  function createPath(lat1,lng1,lat2,lng2,strToolType){
        lineStringPlacemark = ge.createPlacemark('');
        var lineString = ge.createLineString('');
        lineStringPlacemark.setGeometry(lineString);
        lineString.setTessellate(true);
        lineString.getCoordinates().pushLatLngAlt(lat1,lng1,0);
        lineString.getCoordinates().pushLatLngAlt(lat2,lng2,0);
        lineStringPlacemark.setStyleSelector(ge.createStyle(''));
        var lineStyle=lineStringPlacemark.getStyleSelector().getLineStyle();
        lineStyle.setWidth(5);
        lineStyle.getColor().set("9900FFFF"); //'aabbggrr' format
        intFeatureCounter4Trace+=1;
        ge.getFeatures().appendChild(lineStringPlacemark);
    }

在小部分绘制道路时,我正在跟踪添加到 GE 插件的小线段的数量,并使用此功能计数使用以下函数在循环中删除所有添加的线段:-

function clearPath(){
    for(var i=0;i<intFeatureCounter4Trace;i++){
       ge.getFeatures().removeChild(ge.getFeatures().getLastChild());
    }
}

问题是对于大量(纬度,经度)来说,比如 20,000 左右,该clearPath()功能会挂起浏览器,有时一些不应该删除的功能也会被删除。有没有办法一次性删除所有较小的部分?即,有没有办法将所有较小的片段逐部分(作为动画)附加到单个功能,然后从 GE 插件 DOM 中一次性将其删除,而不是逐部分删除?

问候,湿婆

4

1 回答 1

1

有几种方法可以解决这个问题。

首先,使用现有代码,您只需使用google.earth.executeBatch函数包装对您的clearPath方法的任何调用。这应该会停止挂起并更快地执行 api 调用。

google.earth.executeBatch(ge, clearPath);

其次,您可以简单地编写一个更简洁的clearPath函数来删除所有功能,而无需全局索引。

function clearPath() {
  var features = ge.getFeatures();
  while (features.getFirstChild()) {
    features.removeChild(features.getFirstChild());
  }
}

第三,我将接近它的方式是改变你createPath的简单地创建一个单一的线串地标。然后我将创建一个amendPath方法来更新该地标的坐标数据。最后,我将更改clearPath方法以简单地在线串坐标数组上调用 clear 。如果需要,您也可以添加一个removePath方法...

虽然它是写在这里并且未经测试的,但以下几行应该可以工作。

var path = null; // global reference to the placemark we will create

// set up the path placemark
function createPath() {
  path = ge.createPlacemark('');
  path.setStyleSelector(ge.createStyle(''));

  var line = ge.createLineString('');
  line.setTessellate(true);

  var style = path.getStyleSelector().getLineStyle();
  style.setWidth(5);
  style.getColor().set("9900FFFF");

  path.setGeometry(line);
  ge.getFeatures().appendChild(path);
}

// update the path placemark's coordinate geometry
function ammendPath(lat1,lng1,lat2,lng2) {
  var line = path.getGeometry();
  line.getCoordinates().pushLatLngAlt(lat1,lng1,0);
  line.getCoordinates().pushLatLngAlt(lat2,lng2,0);
  path.setGeometry(line);
}

// clear the path placemark's coordinate geometry 
function clearPath() {
  path.getGeometry().getCoordinates().clear();
}

// remove the path placemark entirely (if required...)
function removePath() {
  ge.getFeatures().removeChild(path);
}
于 2012-04-10T01:19:05.040 回答