API Карт Google V3 от DivPixelToLatLng не соответствует - PullRequest
5 голосов
/ 29 октября 2011

Мне нужно разместить маркер в фиксированном пиксельном положении внутри карты.Чтобы создать маркер, вам нужен LatLng.Я понимаю, что fromDivPixelToLatLng () - это способ преобразования координат пикселей в LatLng, но я не могу заставить его вести себя согласованно.

Я опубликовал простой пример своей проблемы на http://www.pinksy.co.uk/newsquare/overlaytest.html. Нажмите на карту, чтобы разместить маркер на 200px / 200px.Перетащите карту и нажмите еще раз.Я ожидал, что каждый раз маркер будет размещен на 200px / 200px, но это не так.

Сначала я настроил карту как обычно, в 600px на 300px div:

var london = new google.maps.LatLng(51.501904,-0.130463);
var mapOptions = {
    zoom: 15,
    center: london,
    mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

Затем я создаю оверлей:

var overlay = new google.maps.OverlayView();
overlay.draw = function() {};
overlay.setMap(map);

Чтобы протестировать изDivPixelToLatLng (), я создаю событие щелчка на карте, которое пытается разместить маркер в месте расположения пикселя 200px / 200px.Независимо от того, куда вы перетаскиваете карту, я ожидал, что маркер всегда будет размещен в 200px / 200px:

google.maps.event.addListener(map, 'click', function(event) {

    var pixelLatLng = overlay.getProjection().fromDivPixelToLatLng(new google.maps.Point(200,200));

    var marker = new google.maps.Marker({
        position: pixelLatLng,
        map: map
    });
});

Однако перетащите карту вокруг, и вы увидите, что маркер не всегда размещается в200px / 200px.Есть идеи?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 26 июня 2013

Проверьте демо под: http://jsbin.com/otidih/51 для еще нескольких экспериментов на этом. Чтобы получить ведение журнала, запустите консоль - там записано большинство вещей.

Подробное объяснение из этого сообщения группы. Более короткая версия ниже:

ContainerPixel рассчитывается относительно контейнера вашей карты. Если вы перемещаете карту, то изменяется ContainerPixel из LatLngs . ContainerPixel вещей, которые не перемещаются с картой (float), не изменяется. Например, ContainerPixel mapCenter остается неизменным, если вы не изменили размер карты:

overlay.getProjection().fromLatLngToContainerPixel(map.getCenter())

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

overlay.getProjection().fromLatLngToDivPixel(point)

Если вы не измените уровень масштабирования и не переместите (переместите) карту, то DivPixel всего, что движется с картой, останется прежним. Например, DivPixel данного города на карте останется прежним, даже если вы переместите карту. Он изменится только при изменении уровня масштабирования или пересечении международной линии даты.

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

Также следует учитывать значение Point , возвращаемое из

map.getProjection().fromLatLngToPoint()

, что хорошо объяснено в Справочнике по API Он переводится из цилиндра LatLng в плоскость большой точки, которая всегда остается неизменной (независимо от уровня масштабирования). Данные LatLngs всегда будут отображаться в одну и ту же точку.

Точкой (0,0) является (85.0511287798066, -180) LatLng - где срезы Google Map (если вы хотите узнать почему, читайте о проекции Меркатора )

3 голосов
/ 30 октября 2011

После экспериментов я обнаружил, что fromContainerPixelToLatLng () - это то, что я ищу.В интересах других я опубликовал пример на http://www.pinksy.co.uk/newsquare/overlaytest2.html.

(для записи, я все еще не уверен, почему fromDivPixelToLatLng ведет себя так, как это делает, но не берите в голову!)

...