Как получить долготу, широту и высоту нажатой точки на метке?

Я использую API плагина Google Earth для создания и показа меток пользователям.

Пример кода создания и показа метки:

function createPlacemark(){
    var polygonPlacemark = ge.createPlacemark('Polygon');
    var polygon = ge.createPolygon('');
    polygon.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
    polygonPlacemark.setGeometry(polygon);
    var outer = ge.createLinearRing('');
    polygon.setOuterBoundary(outer);

    var coords = outer.getCoordinates();
    coords.pushLatLngAlt(35.3,33.3544921875,1200); 
    coords.pushLatLngAlt(35.3,33.3544921875,1200); 
    coords.pushLatLngAlt(35.3,33.3544921875,1000); 
    coords.pushLatLngAlt(35.3,33.3544921875,1000); 
    ge.getFeatures().appendChild(polygonPlacemark);
    }

Теперь мне нужно знать, щелкнул ли пользователь метку (я делаю это с помощью прослушивателя событий) и какова долгота, широта и высота точки в метке, которую он щелкнул.

Проблема в том, что google earth возвращает значения события «щелчок» по поверхности земли, а не по метке, на которую нажали. В некоторых случаях полигон не лежит на земле (как в примере кода) и значения не подходят.

Я пытался найти способ получить положение воздушного шара, который открывается при нажатии метки, но безуспешно.

Есть ли способ получить эти значения?

Редактировать:
я использую что-то похожее на следующий упрощенный код:

<html>
    <head>
       <script type="text/javascript" src="https://www.google.com/jsapi"></script>
       <script type="text/javascript">
            var ge;
            google.load("earth", "1");

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

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

            function failureCB(errorCode) {
            }


           google.setOnLoadCallback(init);

           function createPlacemark(){
                 var polygonPlacemark = ge.createPlacemark('Polygon');
                 var polygon = ge.createPolygon('');
                 polygon.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
                 polygonPlacemark.setGeometry(polygon);
                 var outer = ge.createLinearRing('');
                 polygon.setOuterBoundary(outer);
                 polygonPlacemark.setDescription('test');
                 var coords = outer.getCoordinates();
                         coords.pushLatLngAlt(35.3,33.3544921875,1200); 
                 coords.pushLatLngAlt(35.35,33.3544921875,1200); 
                 coords.pushLatLngAlt(35.35,33.3544921875,1000); 
                 coords.pushLatLngAlt(35.3,33.3544921875,1000); 
                 ge.getFeatures().appendChild(polygonPlacemark);

                    lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
                lookAt.setLatitude(35.33); 
                lookAt.setLongitude(33.3544921875);  
                lookAt.setRange(4500);  
                lookAt.setTilt(45); 
                lookAt.setHeading(90);

                   // Update the view in Google Earth 
               ge.getView().setAbstractView(lookAt);
               google.earth.addEventListener(polygonPlacemark , 'click', doEvent);
    }

          function doEvent(event) {
            document.getElementById("alt").value=event.getAltitude();
            document.getElementById("lon").value=event.getLongitude();
            document.getElementById("lat").value=event.getLatitude();       
      }

      </script>
    </head>
    <body>
           <div id="map3d" style="height: 820px; width: 1680px;"></div>
           <button id="bCreatePlacemark" type="button" onclick="createPlacemark()">Create Placemark</button><br>
           <input id="lon" /><br>
           <input id="lat" /><br>
           <input id="alt" />


     </body>
     </html>

person Maz    schedule 04.06.2013    source источник


Ответы (1)


Вы не показываете, как вы прикрепляете свой обработчик событий, но похоже, что вы прикрепили его к объекту GEGlobe или GEWindow, а не к KmlPlacemarks.

Чтобы прикрепить прослушиватель событий к определенной метке, вы должны сделать что-то вроде этого.

google.earth.addEventListener(polygonPlacemark , 'click', doSomething);
function doSomething(event) {
  var lat = event.getTarget().getGeometry().getLatitude();
  var lng = event.getTarget().getGeometry().getLongitude();
  // do something with lat, lng
}

Если вы хотите создать обработчик событий «поймать все», который обрабатывает события кликов по всем меткам, вы можете сделать это, используя объект GEGlobe, а затем используя условную логику для просмотра объектов меток.

google.earth.addEventListener(ge.getGlobe(), 'click', doSomething);
function doSomething(event) {
  if (event.getTarget().getType() == 'KmlPlacemark') { //check the event target
    var lat = event.getTarget().getGeometry().getLatitude();
    var lng = event.getTarget().getGeometry().getLongitude();
    // do something with lat, lng
  }
}

Изменить:

Судя по вашему комментарию, вы хотите привязать событие click к самому polygon, а затем извлечь позицию, в которой произошло это событие. Если это так, это должно работать.

google.earth.addEventListener(polygon , 'click', doSomething);
function doSomething(event) {
  var lat = event.getLatitude();
  var lng = event.getLongitude();
  var alt = event.getaltitude();
  // do something with lat, lng, alt
}
person Fraser    schedule 05.06.2013
comment
Спасибо. К сожалению, это не работа для меня. event.getTarget().getGeometry().get...(); не возвращает значения (я попробовал два ваших предложения). Когда я заменяю его на event.getLongitude();, он возвращает значения, но, конечно, это не то, что я ищу. - person Maz; 05.06.2013
comment
Обратите внимание, мне нужна точка В метке, а не координаты самой метки. Другими словами, мне нужна точка, из которой появляется воздушный шар. - person Maz; 06.06.2013
comment
Затем просто используйте условную логику для метки, а затем используйте event.getLongitude() и getLatitude(), чтобы получить позицию клика. Таким образом, событие щелчка будет срабатывать только при наведении на метку, но вы получите координаты фактического щелчка, а не координаты метки. - person Fraser; 06.06.2013
comment
Но тогда ценности находятся на поверхности земли, а не на метке. щелчок проходит через метку, и я получаю значения точки на поверхности земли за меткой. - person Maz; 06.06.2013
comment
Большое спасибо за ваши усилия. Однако он по-прежнему дает мне координаты точки, где щелчок попал на поверхность, а не на полигон. В качестве примера желательного поведения вы можете увидеть, что происходит, когда вы указываете 3D-здание из слоя зданий (в клиенте Google Планета Земля) - координаты и высота, которые появляются в строке состояния, являются координатами стены, на которую вы указываете, а не координаты Поверхность позади здания. - person Maz; 06.06.2013
comment
Извините, я не понимаю, что вы имеете в виду - событие клика должно быть на поверхности полигона. Пожалуйста, покажите свой фактический код - как вы прикрепляете обработчик событий и т. Д. Вероятно, вы просто делаете ошибку. - person Fraser; 07.06.2013
comment
Кстати: когда я упомянул поверхность, я имел в виду поверхность земли. Кстати 2: я использую версию 6.2. - person Maz; 07.06.2013