在Google地球上,我可以通过编程方式更改lineString / LinearRing的海拔高度吗?

时间:2012-03-15 20:10:37

标签: google-earth google-earth-plugin

我在HTML网页上使用Google地球插件。在这种情况下,假设你有一个像这样的线串或多边形

// Create the placemark
var lineStringPlacemark = ge.createPlacemark('');

// Create the LineString
var lineString = ge.createLineString('');
lineStringPlacemark.setGeometry(lineString);

// Add LineString points
lineString.getCoordinates().pushLatLngAlt(48.754, -121.835, 0);
lineString.getCoordinates().pushLatLngAlt(48.764, -121.828, 0);

// Add the feature to Earth
ge.getFeatures().appendChild(lineStringPlacemark);

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

获得了样本

现在,假设你想以编程方式改变高度(高度),在你追加lineString之后,你会怎么做?

我看到你可以通过ge.getFeatures()检索这些功能。但是,无法检查返回的对象,我正在努力改变高度的语法。

我可以移除整个对象并重绘它但是这很黑,用户可以看到重绘。这是要删除的代码

var features = ge.getFeatures();
while (features.getFirstChild())
    features.removeChild(features.getFirstChild());

我从https://developers.google.com/earth/documentation/containers

获得了代码

有人知道正确的语法吗?

2 个答案:

答案 0 :(得分:0)

如果你有LineString的引用(你可以坚持它,或者走KML DOM并再次获取它),你可以通过

改变整个LineString的高度。
lineString.setAltitudeOffset(offsetFromCurrentAltitude);

如果要基于每个坐标更改高度,您可以基本上按照上面的构造来访问它们。 lineString.getCoordinates()返回KmlCoordArray,然后您可以从那里读取各个坐标的值。关于KmlCoordArray的一个尴尬的事情是它返回其KmlCoord个孩子的副本,而不是直接返回它的孩子。所以你可以做lineString.getCoordinates()。get(0)然后从它返回的KmlCoord中读取lat / lng / alt值,但是如果你在那个坐标上设置那些值,它就不会自动反映在LineString中。相反,您必须将KmlCoord读取到KmlCoordArray。这有点尴尬,但可用。

所以你可能会做这样的事情,如果你通常一次只改变一个高度:

function setNewAltitude(lineString, coordIndex, altitude) {
  var coords = lineString.getCoordinates();
  if (coordIndex >= 0 && coordIndex < coords.getLength()) {
    var coord = coords.get(coordIndex);
    coord.setAltitude(altitude);
    coords.set(coordIndex, coord);
  }
}

查看KmlCoordArray参考页面了解其他方法,看看它们对您考虑的具体用例是否更有帮助。

答案 1 :(得分:0)

我找到了答案。我的洞察力是在我浏览对象时请求类型。见下文

    // read the number of features in GE
    var length = ge.getFeatures().getChildNodes().getLength();

    // get the first feature
    var feature = ge.getFeatures().getFirstChild();

    // for debugging get type - expecting KmlPlacemark      
    var featureType = feature.getType();
    console.log(featureType);

    // get KmlPlacemark geometry
    var geometry = feature.getGeometry();

    // for debugging get type - expecting KmlLineString     
    var geometryType = geometry.getType();
    console.log(geometryType);

    // get KmlLineString coordinates
    var coordinates = geometry.getCoordinates();

    // for debugging get type - expecting KmlCoordArray         
    var coordinatesType = coordinates.getType();
    console.log(coordinatesType);

    var altitude = Math.random()*10000;

    var coordinatesLength = coordinates.getLength();
    for(var i=0; i< coordinatesLength; i++){
        var coordinate = coordinates.get(i);
        console.log(coordinate.getType());
        coordinate.setAltitude(altitude);
        coordinates.set(i,coordinate)
    }

    for(var i=0; i< coordinatesLength; i++){
        var coordinate = coordinates.get(i);
        console.log(coordinate.getAltitude());
    }