Карты Google добавляют 2 слушателя GEvent.1 за каждый маркер - PullRequest
0 голосов
/ 26 февраля 2010

У меня есть следующий код, который позволяет пользователю отображать две точки в Google MAP. Затем я хочу быть в состоянии отловить событие для каждой точки (маркера), перетаскиваемой в новое место. Я плохо разбираюсь в Javascript и потратил часы, пытаясь это сделать, поэтому думаю, что пришло время мне помочь ...

То, что я пытаюсь сделать, это заставить пользователя нанести на карту две точки (маркеры), которые можно перетаскивать. Затем я хочу, чтобы мой сценарий записывал позиции (lat, long) в документ. Затем я вычислю расстояние между ними как часть приложения доставки, которое я создаю.

Мне бы хотелось, чтобы содержимое документа (широта, длина) обновлялось при перетаскивании маркера (точки) в новое место.

Кроме того, я исправил ошибку школьника, в которой переменные точки были декалированы в операторе switch. Моя проблема устранена путем перемещения операторов прослушивания события Add внутри оператора switch. Спасибо Канонада:)

Теперь нужно попытаться вычислить расстояние (вороны) между двумя точками

Опять же, спасибо за помощь .. ценится как всегда !!

Обновленный код, который работает:

        var map = null;
    var geocoder = null;
    var zoom = 15;
    var first_point = false;
    var boundary =  new Array();
    var cCount = 0;


    var point1;
    var point2;

    function initialize() {
        if (GBrowserIsCompatible()) {
            first_point = false;
            map = new GMap2(document.getElementById("map_canvas"));
            var center = new GLatLng(37.4419, -122.1419);
            map.setCenter(center, zoom);

            GEvent.addListener(map, "click", function(overlay,point)
            {
                if (overlay != null)
                {}
                else
                {
                    var n = boundary.length;

                    switch (cCount)
                    {
                        case 0:
                            point1 = new GMarker(point,{draggable: true});
                            map.addOverlay(point1);
                            cCount++;
                            GEvent.addListener(point1, "dragend", function()
                                {
                                    alert('P1 Dragged');
                                });
                            break;
                        case 1:
                            point2 = new GMarker(point,{draggable: true});
                            map.addOverlay(point2);
                            cCount++;
                            GEvent.addListener(point2, "dragend", function()
                                {
                                    alert('P2 Dragged');
                                });
                            break;
                        case 2:
                            map.clearOverlays();
                            cCount=0;
                            break;
                    }
                }
            });
            map.addControl(new GSmallMapControl());
            geocoder = new GClientGeocoder();
        }
    }

1 Ответ

0 голосов
/ 26 февраля 2010

Я взял ваш код и сделал следующие исправления:

  • Исправлены несбалансированные скобки, которые я упоминал в комментарии.
  • Переместил два вызова addListener в оператор switch, чтобы переменные point1 и point2 оставались в области действия при присоединении событий.

Вы можете посмотреть пример здесь ( source ).

Edit:

Вот код Javascript для получения линейного расстояния между двумя точками (в метрах):

/* Convert degress to radians */
function deg2rad(deg) {
  return deg / (180 / Math.PI);
}

/* Calculate distance between two points */
function point_distance(a, b) {
  var r = 6378700;
  var lat1 = a.y;
  var lat2 = b.y;
  var lon1 = a.x;
  var lon2 = b.x;
  var dist = r * Math.acos(Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) +
               Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
               Math.cos(deg2rad(lon1 - lon2)));
  return dist;
}

Это основано на приблизительном радиусе Земли, равном 6378700 м.

...