Сдвиг полигонов Google Maps на событие драгенд - PullRequest
0 голосов
/ 12 февраля 2019

Когда вы перетаскиваете перетаскиваемый полигон в Картах Google в определенную позицию, не отпуская кнопку мыши, затем отпускаете кнопку мыши, не перемещая мышь дальше, часть или весь полигон часто смещается на пиксель.Происходит ли сдвиг, зависит от некоторой неизвестной комбинации масштаба карты, размера многоугольника и т. Д. Проблему легко воспроизвести - для данного многоугольника всегда есть несколько уровней масштабирования, для которых сдвиг происходит с каждым падением.

Я проверил версии API 3.33-3.35 и проверил ту же проблему в нескольких браузерах.Дальнейшие исследования показывают, что перед вызовом обработчика драгенд выполняется последний вызов обработчика перетаскивания (независимо от того, была ли перемещена мышь).Значение latLng, предоставленное обработчику перетаскивания, всегда отличается от значения latLng, предоставленного предыдущим (реальным) событием перетаскивания, независимо от того, происходит ли визуальный сдвиг в многоугольнике.Предположительно, визуальный сдвиг зависит от некоторых закулисных эффектов округления координат до пикселя.Конечно, сначала я подумал, что, может быть, я на самом деле подталкивал мышь, прежде чем отпустить перетаскивание, но я убедился, что это не так.

Проблема может быть повторена путем создания любого перетаскиваемого полигона изатем внимательно наблюдайте за тем, что происходит, когда вы перетаскиваете, пауза, затем опускаетесь.Вот пример JSFiddle (https://jsfiddle.net/bipwap/70vup36n) с использованием простого прямоугольника:

var counter = 1;

var map = new google.maps.Map(document.getElementById('map'), {
  zoom: 4,
  center: { lat: 35.0, lng: -80.0 },
  mapTypeId: 'roadmap',
  gestureHandling: 'greedy'
});

// Define the LatLng coordinates for the polygon's path.
var testCoords = [
  {lat: 30.0, lng: -75.0},
  {lat: 40.0, lng: -75.0},
  {lat: 40.0, lng: -85.0},
  {lat: 30.0, lng: -85.0}
];

var testPolygon = new google.maps.Polygon({
  paths: testCoords,
  strokeColor: '#FF0000',
  strokeWeight: 2,
  fillColor: '#FF0000',
  fillOpacity: 0.35,
  draggable: true,
  geodesic: false // Problem evident with or without geodesic
});
testPolygon.setMap(map);

google.maps.event.addListener(testPolygon, 'drag', function(event) {
    console.log(counter++ + " drag Lat: " + event.latLng.lat() + " Lng: " + event.latLng.lng());
});

google.maps.event.addListener(testPolygon, 'dragend', function(event) {
    console.log(counter++ + " dragend Lat: " + event.latLng.lat() + " Lng: " + event.latLng.lng());
});

При масштабировании по умолчанию каждая сторона прямоугольного многоугольника сдвигается, когда заканчивается перетаскивание. На других уровнях масштабирования нет, некоторыеили все стороны могут сдвинуться. Если у вас открыто окно консоли при выполнении кода, вы можете проверить с помощью диагностического метода console.log (), который вызывает (a) непосредственно перед вызовом обработчика драгенды, всегда вызывается обработчик перетаскиванияи (b) координаты latLng для обработчика перетаскивания в этом последнем вызове всегда отличаются от координат в предыдущем вызове обработчика перетаскивания (который был связан с истинным событием перетаскивания).

Так что же здесь происходит? Почему Google Карты сообщают о другой географической координате, когда перетаскивание прекращается, даже если пиксельная координата курсора не изменилась?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...