Немного застрял на этом. Я получаю список географических координат через JSON и помещаю их на карту Google. Все работает хорошо, за исключением случая, когда у меня есть два или более маркера на одном и том же месте. API отображает только 1 маркер - верхний. Я полагаю, это справедливо, но я хотел бы найти способ как-то отобразить их все.
Я искал в Google и нашел несколько решений, но в основном они, похоже, предназначены для V2 API или просто не так хороши. В идеале мне нужно решение, в котором вы щелкаете какой-то маркер группы, а затем показываете маркеры, сгруппированные вокруг места, в котором они все находятся.
У кого-нибудь была эта проблема или похожая проблема, и кто-нибудь хотел бы поделиться решением?
OverlappingMarkerSpiderfier
в сочетании с MarkerClusterer хорошим вариантом является установкаmaxZoom
параметра в конструкторе кластера. Это «отключает кластеры» маркеров после указанного уровня масштабирования.Смещение маркеров не является реальным решением, если они расположены в одном здании. Возможно, вы захотите изменить файл markerclusterer.js следующим образом:
Добавьте метод щелчка прототипа в класс MarkerClusterer, например, так - мы переопределим это позже в функции map initialize ():
В классе ClusterIcon добавьте следующий код ПОСЛЕ триггера clusterclick:
Затем в вашей функции initialize (), где вы инициализируете карту и объявляете свой объект MarkerClusterer:
Где multiChoice () - ВАША (еще не написанная) функция для отображения всплывающего окна InfoWindow со списком параметров для выбора. Обратите внимание, что объект markerClusterer передается вашей функции, потому что он понадобится вам для определения количества маркеров в этом кластере. Например:
источник
Я использовал это вместе с jQuery, и он выполняет свою работу:
источник
Расширяя ответ Чаоли , я реализовал функцию, которая, учитывая список местоположений (объекты с
lng
иlat
свойства), координаты которых точно такие же, немного перемещает их из исходного местоположения (изменяя объекты на месте). Затем они образуют красивый круг вокруг центральной точки.Я обнаружил, что для моей широты (52 градуса северной широты) лучше всего работает радиус окружности 0,0003 градуса, и что вам нужно компенсировать разницу между градусами широты и долготы при преобразовании в километры. Вы можете найти приближенные преобразования для вашей широты здесь .
источник
37.68625400000000000,-75.71669800000000000
на37.686254,-75.716698
тоже, что одинаково для всех значений ... Я ожидаю чего-то вроде ...37.68625400000000000,-75.71669800000000000
на ... и37.6862540000001234,-75.7166980000001234
37.6862540000005678,-75.7166980000005678
т. Д. Я также пытался изменить свой угол.@Ignatius - отличный ответ, обновленный для работы с v2.0.7 MarkerClustererPlus.
Добавьте метод щелчка прототипа в класс MarkerClusterer, например, так - мы переопределим это позже в функции map initialize ():
В классе ClusterIcon добавьте следующий код ПОСЛЕ триггера click / clusterclick:
Затем в вашей функции initialize (), где вы инициализируете карту и объявляете свой объект MarkerClusterer:
Где multiChoice () - ВАША (еще не написанная) функция для отображения всплывающего окна InfoWindow со списком параметров для выбора. Обратите внимание, что объект markerClusterer передается вашей функции, потому что он понадобится вам для определения количества маркеров в этом кластере. Например:
источник
maxZoom
проблемы, я думаю, что это проблема, только если maxZoom не установлен или maxZoom для кластера больше, чем масштаб карты. Я заменил ваш жестко запрограммированный на этот фрагмент, и, похоже, он отлично работает:var maxZoom = mc.getMaxZoom(); if (null === maxZoom || maxZoom > mc.getMap().maxZoom) { maxZoom = mc.getMap().maxZoom; if (null === maxZoom) { maxZoom = 15; } }
clickedCluster.center_.lat()
/clickedCluster.center_.lng()
Приведенные выше ответы более элегантны, но я нашел быстрый и грязный способ, который на самом деле работает очень хорошо. Вы можете увидеть это в действии на сайте www.buildinglit.com
Все, что я сделал, - это добавил случайное смещение к широте и долготе на мою страницу genxml.php, чтобы она каждый раз возвращала немного разные результаты со смещением каждый раз, когда карта создается с помощью маркеров. Это звучит как взлом, но на самом деле вам нужно всего лишь, чтобы маркеры переместились в случайном направлении, чтобы их можно было нажимать на карте, если они перекрываются. На самом деле он работает очень хорошо, я бы сказал, лучше, чем метод паука, потому что кто хочет справиться с этой сложностью и заставить их прыгать повсюду. Вы просто хотите иметь возможность выбрать маркер. Случайное подталкивание работает идеально.
Вот пример создания итерационного узла оператора while в моем php_genxml.php
Обратите внимание, что под lat и long есть смещение +. от 2 переменных выше. Мне пришлось разделить случайное число на 0,1000 на 10000000, чтобы получить десятичную дробь, которая была случайным образом достаточно маленькой, чтобы просто перемещать маркеры. Не стесняйтесь поработать с этой переменной, чтобы получить более точную для ваших нужд.
источник
В ситуациях, когда в одном здании есть несколько служб, вы можете немного сместить маркеры (скажем, на 0,001 градуса) в радиусе от фактической точки. Это также должно произвести хороший визуальный эффект.
источник
Это скорее временное «быстрое и грязное» решение, подобное тому, которое предлагает Мэтью Фокс, на этот раз с использованием JavaScript.
В JavaScript вы можете просто сместить широту и долготу всех ваших местоположений, добавив небольшое случайное смещение к обоим, например
myLocation[i].Latitude+ = (Math.random() / 25000)
(Я обнаружил, что деление на 25000 дает достаточное разделение, но не приводит к значительному перемещению маркера из точного местоположения, например определенного адреса)
Это достаточно хорошо компенсирует их друг от друга, но только после того, как вы увеличите масштаб. При уменьшении масштаба все равно не будет ясно, есть ли несколько вариантов для местоположения.
источник
Попробуйте Marker Clusterer для V3 - эта библиотека объединяет близлежащие точки в групповой маркер. Карта увеличивается при щелчке по кластерам. Я предполагаю, что при прямом увеличении у вас все еще будет та же проблема с маркерами на том же месте.
источник
Обновлено для работы с MarkerClustererPlus.
источник
Мне нравятся простые решения, поэтому вот мои. Вместо того, чтобы изменять библиотеку, что затрудняет обслуживание. вы можете просто посмотреть это мероприятие
тогда вы можете управлять этим на
i, т. е. использовал bootstrap для отображения панели со списком. который я считаю гораздо более удобным и удобным, чем бегать пауками в "людных" местах. (если вы используете кластеризатор, скорее всего, вы столкнетесь с коллизиями, как только вы спайдерфите). там же можно проверить масштабирование.
Кстати. Я только что нашел листовку, и, похоже, она работает намного лучше, кластер И spiderfy работает очень плавно http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.10000.html и имеет открытый исходный код.
источник
Проверьте это: https://github.com/plank/MarkerClusterer
Это MarkerCluster, модифицированный для добавления infoWindow в маркер кластера, когда у вас есть несколько маркеров в одной позиции.
Вы можете увидеть, как это работает, здесь: http://culturedays.ca/en/2013-activities
источник
Расширяя ответы, приведенные выше, просто убедитесь, что вы установили параметр maxZoom при инициализации объекта карты.
источник
Задание смещения приведет к удалению маркеров, когда пользователь увеличит масштаб до максимального. Итак, я нашел способ добиться этого. это может быть неправильным способом, но он работал очень хорошо.
установите zIndex маркера так, чтобы вы видели значок маркера, который вы хотите видеть вверху, иначе он будет анимировать маркеры, как автоматическая замена. когда пользователь нажимает маркер, обрабатывает zIndex, чтобы переместить маркер наверх, используя zIndex Swap.
источник
Как это сойти с рук .. [Swift]
Создается новый маркер? проверить
clusterArray
и изменить смещениерезультат
источник
В дополнение к хитроумному гениальному ответу Мэтью Фокса я добавил небольшое случайное смещение для каждой широты и долготы при установке объекта-маркера. Например:
источник
Расширяя ответы выше, когда вы соединили строки, а не добавили / вычли позицию (например, "37.12340-0.00069"), преобразуйте исходную широту / долготу в числа с плавающей запятой, например, используя parseFloat (), затем добавьте или вычтите исправления.
источник