Это самое простое, что я мог бы уменьшить до:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Google Maps Multiple Markers</title>
<script src="http://maps.google.com/maps/api/js?sensor=false"
type="text/javascript"></script>
</head>
<body>
<div id="map" style="width: 500px; height: 400px;"></div>
<script type="text/javascript">
var locations = [
['Bondi Beach', -33.890542, 151.274856, 4],
['Coogee Beach', -33.923036, 151.259052, 5],
['Cronulla Beach', -34.028249, 151.157507, 3],
['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
['Maroubra Beach', -33.950198, 151.259302, 1]
];
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 10,
center: new google.maps.LatLng(-33.92, 151.25),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var infowindow = new google.maps.InfoWindow();
var marker, i;
for (i = 0; i < locations.length; i++) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(locations[i][1], locations[i][2]),
map: map
});
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infowindow.setContent(locations[i][0]);
infowindow.open(map, marker);
}
})(marker, i));
}
</script>
</body>
</html>
👨💻 Редактировать / разветвляться на Codepen →
СКРИНШОТ
При передаче аргумента обратного вызова addListener
методу происходит некоторое закрытие . Это может быть довольно сложной темой, если вы не знакомы с тем, как работают замыкания. Я бы посоветовал проверить следующую статью Mozilla для краткого введения, если это так:
❯ Mozilla Dev Center: Работа с Closures
InfoWindow
свойства Marker и затем вызвать из.open()
него InfoWindow. Я бы опубликовал изменения здесь, но они были достаточно большими, и я отправил свой ответ .new MarkerClusterer()
для массивного бюста производительности? Проверьте ответ ChirsSwires.Вот еще один пример из множества маркеров погрузки с уникальным
title
иinfoWindow
текстом. Протестировано с последним API карт Google V3.11.Скриншот 250 маркеров:
Он автоматически рандомизирует Lat / Lng, чтобы сделать его уникальным. Этот пример будет очень полезен, если вы хотите протестировать маркеры 500, 1000, xxx и производительность.
источник
infoWindow
для каждого маркера и не будет скрываться другой,infoWindow
если он отображается в данный момент. это действительно полезно :)new MarkerClusterer()
для массового исполнения бюста? Проверьте ответ ChirsSwires.Я подумал, что поместу это здесь, так как оно кажется популярной точкой посадки для тех, кто начинает использовать API Карт Google. Многочисленные маркеры, отображаемые на стороне клиента, вероятно, снижают производительность многих картографических приложений. Трудно провести сравнительный анализ, исправить, а в некоторых случаях даже установить, что существует проблема (из-за различий в реализации браузера, аппаратного обеспечения, доступного клиенту, мобильных устройств, этот список можно продолжить).
Самый простой способ начать решение этой проблемы - использовать решение для кластеризации маркеров. Основная идея состоит в том, чтобы сгруппировать географически похожие местоположения в группу с количеством отображаемых точек. Когда пользователь увеличивает масштаб карты, эти группы расширяются, показывая отдельные маркеры внизу.
Возможно, самый простой для реализации это библиотека markerclusterer . Базовая реализация будет выглядеть следующим образом (после импорта библиотеки):
Маркеры вместо того, чтобы быть добавленными непосредственно к карте, добавляются в массив. Этот массив затем передается в библиотеку, которая выполняет сложные вычисления для вас и присоединяется к карте.
Эти реализации не только значительно повышают производительность на стороне клиента, но и во многих случаях приводят к более простому и менее загроможденному пользовательскому интерфейсу и более простому усвоению данных в больших масштабах.
Другие реализации доступны от Google.
Надеюсь, что это помогает некоторым из тех, кто новее, с нюансами отображения.
источник
Асинхронная версия:
источник
Полный рабочий пример. Вы можете просто скопировать, вставить и использовать.
источник
Из примеров Google Map API :
источник
Вот еще одна версия, которую я написал для сохранения недвижимости карты, которая помещает указатель информационного окна на фактический широту и длину маркера, одновременно скрывая маркер во время отображения информационного окна.
Это также устраняет стандартное назначение маркеров и ускоряет обработку, напрямую назначая новый маркер массиву маркеров при создании маркеров. Обратите внимание, что дополнительные свойства были добавлены как к маркеру, так и к информационному окну, так что этот подход немного необычен ... но это я!
В этих информационных окнах никогда не упоминается, что стандартное информационное окно НЕ размещается на точки маркера, а скорее в верхней части изображения маркера. Чтобы это работало, видимость маркера должна быть скрыта, в противном случае API-интерфейс Карт снова вернет привязку информационного окна к вершине изображения маркера.
Ссылка на маркеры в массиве «маркеры» создаются сразу после объявления маркера для любых дополнительных задач обработки, которые могут потребоваться позже (скрытие / отображение, захват координат и т. Д.). Это экономит дополнительный шаг назначения объекта маркера на «маркер», а затем помещает «маркер» в массив маркеров ... много ненужной обработки в моей книге.
Во всяком случае, другие взгляды на информационные окна, и надеюсь, что это поможет информировать и вдохновлять вас.
Вот рабочий JSFiddle
Дополнительное примечание В
приведенных данных примера Google вы заметите четвертое место в массиве 'местоположений' с номером. Учитывая это в примере, вы также можете использовать это значение для идентификатора маркера вместо текущего значения цикла, так что ...
источник
Принят ответ, переписан в ES6:
источник
Ссылка на источник
Демо- ссылка
Полный код HTML
источник
closeOtherInfo
, что я не смог найти достойного решения для работы с merkercluster до тех пор, пока вы не ответите. :)Добавить маркер в вашу программу очень просто. Вы просто можете добавить этот код:
Следующие поля особенно важны и обычно устанавливаются при создании маркера:
position
(обязательно) указывает LatLng, идентифицирующий начальное местоположение маркера. Одним из способов получения LatLng является использование сервиса геокодирования .map
(необязательно) указывает карту для размещения маркера. Если вы не укажете карту для построения маркера, он будет создан, но не прикреплен (или не показан на карте). Вы можете добавить маркер позже, вызвав метод маркераsetMap()
.Обратите внимание , что в примере поле заголовка устанавливает заголовок маркера, который будет отображаться в виде всплывающей подсказки.
Вы можете ознакомиться с документацией по API Google здесь .
Это полный пример установки одного маркера на карте. Будьте внимательны, вы должны заменить
YOUR_API_KEY
свой ключ API Google :Теперь, если вы хотите построить маркеры массива на карте, вы должны сделать это так:
Этот пример дает мне следующий результат:
Вы также можете добавить информационное окно в свой пин-код. Вам просто нужен этот код:
Вы можете получить документацию Google об infoWindows здесь .
Теперь мы можем открыть окно infoWindow, когда маркер «клик», вот так:
Обратите внимание , вы можете иметь некоторую документацию
Listener
здесь в Google Developer.И, наконец, мы можем построить информационное окно в маркере, если пользователь щелкнет по нему. Это мой полный код:
Обычно у вас должен быть такой результат:
источник
Исходя из ответа Даниэля Вассалло , вот версия, которая упрощает решение проблемы закрытия.
Так , так как все маркеры будут иметь индивидуальный InfoWindow и поскольку JavaScript не волнуют , если вы добавляете дополнительные свойства объекта, все , что вам нужно сделать , это добавить InfoWindow к маркерным свойствам , а затем вызвать
.open()
на InfoWindow от себя!Изменить: При наличии достаточного количества данных загрузка страницы может занять много времени, поэтому вместо создания информационного окна с маркером создание должно выполняться только при необходимости. Обратите внимание , что какие - либо данные , используемые для построения InfoWindow должна быть добавлена к маркеру как свойство (
data
). Также обратите внимание, что после первого клика событиеinfoWindow
будет сохраняться как свойство маркера, поэтому браузеру не нужно постоянно восстанавливать.источник
Вот почти полный пример функции javascript, которая позволяет использовать несколько маркеров, определенных в JSONObject.
Он будет отображать только те маркеры, которые находятся в границах карты.
Это важно, чтобы вы не выполняли дополнительную работу.
Вы также можете установить ограничение на маркеры, чтобы не показывать чрезмерное количество маркеров (если есть вероятность того, что вы используете);
он также не будет отображать маркеры, если центр карты не изменился более чем на 500 метров.
Это важно, потому что, если пользователь нажимает на маркер и случайно перетаскивает карту, вы не хотите, чтобы карта перезагружала маркеры.
Я прикрепил эту функцию к прослушивателю события ожидания для карты, чтобы маркеры отображались только в режиме ожидания и отображали маркеры после другого события.
В снимке экрана действия есть небольшое изменение в снимке экрана, показывающее больше контента в информационном окне. вставлено с pastbin.com
источник
Вот пример нескольких маркеров в Reactjs .
Ниже находится компонент карты
источник