Google maps API V3 - несколько маркеров на одном и том же месте
немного застрял на этом. Я получаю список гео-координат через JSON и помещаю их на карту google. Все работает хорошо, за исключением случая, когда у меня есть два или более маркеров на одном и том же месте. API отображает только 1 маркер - верхний. Это достаточно справедливо, я полагаю, но хотел бы найти способ показать их все как-то.
Я искал google и нашел несколько решений, но они в основном, похоже, для V2 API или просто не так велики. В идеале Я хотел бы решение, где вы нажимаете какой-то групповой маркер, а затем показывает маркеры, сгруппированные вокруг места, в котором они все находятся.
У кого - нибудь была эта проблема или аналогичная и хотели бы поделиться решением?
3 ответов
посмотри OverlappingMarkerSpiderfier.
Есть демонстрационная страница, но они не показывают маркеры, которые находятся точно на одном месте, только некоторые из них очень близко друг к другу.
но реальный пример жизни с маркерами на том же самом месте можно увидеть на http://www.ejw.de/ejw-vor-ort/ (прокрутите вниз для карты и нажмите на несколько маркеров, чтобы увидеть паук-эффект).
Это кажется идеальным решением для твоя проблема.
смещение маркеров не является реальным решением, если они расположены в одном здании. Что вы можете сделать, это изменить markerclusterer.js так:
-
добавьте метод click прототипа в класс MarkerClusterer, например - мы переопределим это позже в функции map initialize ():
MarkerClusterer.prototype.onClick = function() { return true; };
-
в классе ClusterIcon добавьте следующий код после clusterclick триггер:
// Trigger the clusterclick event. google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster_); var zoom = this.map_.getZoom(); var maxZoom = markerClusterer.getMaxZoom(); // if we have reached the maxZoom and there is more than 1 marker in this cluster // use our onClick method to popup a list of options if (zoom >= maxZoom && this.cluster_.markers_.length > 1) { return markerClusterer.onClickZoom(this); }
-
затем в функции initialize (), где вы инициализируете карту и объявляете объект MarkerClusterer:
markerCluster = new MarkerClusterer(map, markers); // onClickZoom OVERRIDE markerCluster.onClickZoom = function() { return multiChoice(markerCluster); }
где multiChoice () - ваша (еще не написанная) функция для всплывающего окна с списком опций для выбора. Обратите внимание, что объект markerClusterer передается функции, так как это необходимо для определения количества маркеров в кластере. Для пример:
function multiChoice(mc) { var cluster = mc.clusters_; // if more than 1 point shares the same lat/long // the size of the cluster array will be 1 AND // the number of markers in the cluster will be > 1 // REMEMBER: maxZoom was already reached and we can't zoom in anymore if (cluster.length == 1 && cluster[0].markers_.length > 1) { var markers = cluster[0].markers_; for (var i=0; i < markers.length; i++) { // you'll probably want to generate your list of options here... } return false; } return true; }
расширения Chaoley это, я реализовал функцию, которая, учитывая перечень мест (объектов с lng
и lat
properties), координаты которых точно такие же, немного смещает их от исходного местоположения (изменение объектов на месте). Тогда они образуют красивый круг вокруг центральной точки.
я обнаружил, что для моей широты (52deg North), 0.