0

我是开发谷歌地球应用程序的新手。我想知道如何让地标进入我绘制的多边形。提前致谢。

我的代码是

var ge;
var pm = null;
var isMouseDown = false;
var lineStringPlacemark = null;
var coords = null;
var pointCount = 0;
var doc = null;
var markers = [];
var polygons;

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

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

}

function initCB(instance) {
   ge = instance;
   ge.getWindow().setVisibility(true);
   // add a navigation control
   ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);

   //create document
   doc = ge.createDocument('');
   ge.getFeatures().appendChild(doc);

   // add some event
   google.earth.addEventListener(ge.getGlobe(), 'mousemove', onmousemove); 
   google.earth.addEventListener(ge.getGlobe(), 'mousedown', function(event) { onmousedown(event); });

   loadData(ge);
}

function failureCB(errorCode) {
    alert(errorCode);
}

google.setOnLoadCallback(init);

function loadData(ge){
   EarthRequest = new htmldb_Get(null,$v('pFlowId'),'APPLICATION_PROCESS=LoadEarthData',$v('pFlowStepId'));
   EarthData = EarthRequest.get();

   if (EarthData) {
        var data = jQuery.parseJSON(EarthData);
        //printObject(data.row);
        $.each(data.row,function(item){
             latitude = parseFloat(data.row[item]['LATITUDE']);
             longitude = parseFloat(data.row[item]['LONGITUDE']);
             if(latitude==0 || longitude==0 || isNaN(latitude) || isNaN(longitude)){
              //do nothing
             }
             else{
                 marker = createMarker(ge,data.row[item]['CELL_ID']+' '+data.row[item]['SITE_NAME'],latitude ,longitude,data.row[item]['CELL_ID']);
                 if(marker){
            markers.push(marker);
         }
             }
        });

    var la = ge.createLookAt('');
    la.set(latitude, longitude,
      0,
      ge.ALTITUDE_RELATIVE_TO_GROUND,
      0,
      0, 
      5000 
      );
    ge.getView().setAbstractView(la);
   }
}

function createMarker(ge,placeName,latitude,longitude,placeId){
    placemark = ge.createPlacemark('');

    var icon = ge.createIcon('');
    icon.setHref('map_new.png');
    var style = ge.createStyle(''); //create a new style
    style.getIconStyle().setIcon(icon); 

    var lat = parseFloat(latitude);
    var lon = parseFloat(longitude);
    var point = ge.createPoint('');
    point.setLatitude(lat);
    point.setLongitude(lon);

    placemark.setStyleSelector(style); //apply the style to the placemark
    placemark.setGeometry(point);

    // add the placemark to the earth DOM
    ge.getFeatures().appendChild(placemark);

    placemark.setName(placeName);

    google.earth.addEventListener(placemark, 'click', function(event) {
         loadPlaceDetail(placeId);
    });

    return placemark;
}

function onmousemove(event) {
  if (isMouseDown) {
   coords.pushLatLngAlt(event.getLatitude(), event.getLongitude(), 0);
  }
}

//convert line to polygon
function convertLineStringToPolygon(placemark) {
  var polygon = ge.createPolygon('');
  var outer = ge.createLinearRing('');
  polygon.setOuterBoundary(outer);

  var lineString = placemark.getGeometry();
  for (var i = 0; i < lineString.getCoordinates().getLength(); i++) {
    var coord = lineString.getCoordinates().get(i);
    outer.getCoordinates().pushLatLngAlt(coord.getLatitude(), 
                                     coord.getLongitude(), 
                                     coord.getAltitude());
  }
  placemark.setGeometry(polygon);
  return polygon;
}

//mouse click event
function onmousedown(event) {
  if (isMouseDown) { 
        var lastdoc = doc.getFeatures().getChildNodes().getLength();

        isMouseDown = false;
        coords.pushLatLngAlt(event.getLatitude(), event.getLongitude(), 0);
        convertLineStringToPolygon(lineStringPlacemark);
    if(lastdoc>1){
        doc.getFeatures().removeChild(doc.getFeatures().getFirstChild());
                //I want to add some function to calculate polygon bound
        }

  } else {
    if(event.getAltKey()){

       isMouseDown = true;
       lineStringPlacemark = ge.createPlacemark('');
       var lineString = ge.createLineString('');
       lineStringPlacemark.setGeometry(lineString);
       lineString.setTessellate(true);
       lineString.setAltitudeMode(ge.ALTITUDE_CLAMP_TO_GROUND);

       lineStringPlacemark.setStyleSelector(ge.createStyle(''));
       var lineStyle = lineStringPlacemark.getStyleSelector().getLineStyle();
       lineStyle.setWidth(4);
       lineStyle.getColor().set('ddffffff');  // aabbggrr formatx
       lineStyle.setColorMode(ge.COLOR_RANDOM);
       var polyStyle = lineStringPlacemark.getStyleSelector().getPolyStyle();
       polyStyle.getColor().set('ddffffff');  // aabbggrr format
       polyStyle.setColorMode(ge.COLOR_RANDOM);

       coords = lineString.getCoordinates();
       coords.pushLatLngAlt(event.getLatitude(), event.getLongitude(), 0);

      //doc = ge.createDocument('');
       doc.getFeatures().appendChild(lineStringPlacemark);
    }
  }
}

所以在 convertLineStringToPolygon 运行之后,我需要获取多边形绑定并重新加载数据。如果多边形边界中的位置创建地标,如果没有则跳过它。谷歌地图可以使用 GPolygon.Contains() 方法。但对于谷歌地球我还没有找到解决方案

这是来自 ecoynm 的示例谷歌地图:http: //econym.org.uk/gmap/example_inside.htm

4

1 回答 1

0

GEarthExtensions 指向多边形

使用谷歌地球扩展库http://code.google.com/p/earth-api-utility-library/

该示例是使用鼠标移动事件

google.earth.addEventListener(ge.getGlobe(), 'mousemove', function(evt) {
  var poly = new geo.Polygon(pts);
  var contains = poly.containsPoint(
      new geo.Point(evt.getLatitude(), evt.getLongitude()));
  placemark.setStyleSelector(contains ? onStyle : offStyle);
});
于 2012-07-04T06:06:18.047 回答