2

我是 Google 3D Earth API 的新手

我想在 Google 地球上添加多个地点标记?

这是我的示例代码,任何人都可以建议我在哪里添加多个标记会出错吗?

var ge;
var placemaker = new Array();
var point = new Array();

  google.load("earth", "1");

  function init() {
     google.earth.createInstance('map3d', initCB, failureCB);
  }

  function initCB(instance) {

     ge = instance;
     ge.getWindow().setVisibility(true);
     ge.getNavigationControl().setVisibility(ge.VISIBILITY_HIDE);

    for(var i = 0; i < data.length; i++ ) 
    {
        // Set the placemark's location.  
     point[i] = ge.createPoint( data[i].content );
         point[i].setLatitude( data[i].lat );
         point[i].setLongitude( data[i].log );
         placemark[i].setGeometry(point[i]);

         // Add the placemark to Earth.
        ge.getFeatures().appendChild(placemark[i]);
    }
  }

  function failureCB(errorCode) {}

  google.setOnLoadCallback(init);

这里的数据是一个对象数组,包含纬度、日志和内容。我不会在地球上看到任何地标。如果我推动一个单一的地点标记将正常工作,但如果我使用循环则无法正常工作。

在 Google Map V 中有边界选项。3D地球有什么可用的选项吗?

4

1 回答 1

2

您需要使用创建一个 Placemark 对象createPlacemark()。您可能不需要创建地标数组,因为 google earth API 保留了地标列表,您可以从中迭代使用ge.getFeatures().getChildNodes().

for(var i = 0; i < data.length; i++ ) 
{
     // Create the Placemark
     var placemark = ge.createPlacemark('');

     // Set the placemark's location.  
     point[i] = ge.createPoint('');
     point[i].setLatitude( data[i].lat );
     point[i].setLongitude( data[i].lon );       
     placemark.setGeometry(point[i]);

     // Add the placemark to Earth.
     ge.getFeatures().appendChild(placemark);
}

此外,可能不需要点数组,因为有数据数组。可以将其简化为以下内容:

for(var i = 0; i < data.length; i++ ) 
{    
     // Create the Placemark
     var placemark = ge.createPlacemark('');

     // Set the placemark's location.  
     var point = ge.createPoint('');
     point.setLatitude( data[i].lat );
     point.setLongitude( data[i].lon );
     placemark.setGeometry(point);

     // Add the placemark to Earth.
    ge.getFeatures().appendChild(placemark);
}

如果您想计算一堆通用 KML 功能的中心边界,您可以使用 Google 地球 API 扩展:https://code.google.com/p/earth-api-utility-library/wiki/GEarthExtensionsDomReference#computeBounds(目的)

但是,如果您只有一个点数组,那么您可以轻松地手动计算中心,然后将 LookAt 设置为计算的中心视点。

最终的 initCB() 看起来像这样:

 function initCB(instance) {
    ge = instance;
    ge.getWindow().setVisibility(true);
    ge.getNavigationControl().setVisibility(ge.VISIBILITY_HIDE);

    var latSum = 0.0;
    var lonSum = 0.0;
    for(var i = 0; i < data.length; i++ ) 
    {
        // Set the placemark's location.  
        var point = ge.createPoint('');
        point.setLatitude( data[i].lat );
        point.setLongitude( data[i].lon );
        latSum += data[i].lat;
        lonSum += data[i].lon;

        var placemark = ge.createPlacemark(data[i].content);
        placemark.setGeometry(point);

        // Add the placemark to Earth.
        ge.getFeatures().appendChild(placemark);
    }

    // Create LookAt at the center view point
    var lookAt = ge.createLookAt('');
    lookAt.set(latSum / data.length, lonSum / data.length, 0,
            ge.ALTITUDE_RELATIVE_TO_GROUND, 0, 0, 20000);
    ge.getView().setAbstractView(lookAt);
  }
于 2013-07-24T13:36:02.590 回答