Введение
Маркер обозначает местоположение на карте. По умолчанию маркер использует стандартное изображение. Маркеры могут отображать пользовательские изображения, и в этом случае их обычно называют «значками». Маркеры и значки — это объекты типа Marker
. Вы можете установить собственный значок в конструкторе маркера или вызвав setIcon()
для маркера. Подробнее о настройке изображения маркера см.
Грубо говоря, маркеры — это разновидность наложения. Информацию о других типах наложения см. в разделе Рисование на карте .
Маркеры созданы для интерактивного взаимодействия. Например, по умолчанию они получают события 'click'
, поэтому вы можете добавить прослушиватель событий, чтобы открыть информационное окно, отображающее пользовательскую информацию. Вы можете разрешить пользователям перемещать маркер на карте, установив для свойства draggable
маркера значение true
. Дополнительную информацию о перетаскиваемых маркерах см . ниже .
Добавить маркер
Конструктор google.maps.Marker
принимает один литерал объекта Marker options
, определяющий начальные свойства маркера.
Следующие поля особенно важны и обычно задаются при создании маркера:
-
position
(обязательно) указываетLatLng
, определяющий начальное местоположение маркера. Один из способов полученияLatLng
— использование службы геокодирования . -
map
(необязательно) указываетMap
, на которой следует разместить маркер. Если при построении маркера не указать карту, маркер создается, но не прикрепляется к карте (или не отображается на ней). Вы можете добавить маркер позже, вызвав метод маркераsetMap()
.
В следующем примере на карту Улуру, в центре Австралии, добавляется простой маркер:
Машинопись
function initMap(): void { const myLatLng = { lat: -25.363, lng: 131.044 }; const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 4, center: myLatLng, } ); new google.maps.Marker({ position: myLatLng, map, title: "Hello World!", }); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
function initMap() { const myLatLng = { lat: -25.363, lng: 131.044 }; const map = new google.maps.Map(document.getElementById("map"), { zoom: 4, center: myLatLng, }); new google.maps.Marker({ position: myLatLng, map, title: "Hello World!", }); } window.initMap = initMap;
Попробуйте образец
В приведенном выше примере маркер размещается на карте при создании маркера с использованием свойства map
в параметрах маркера. Альтернативно вы можете добавить маркер на карту напрямую, используя метод маркера setMap()
, как показано в примере ниже:
var myLatlng = new google.maps.LatLng(-25.363882,131.044922); var mapOptions = { zoom: 4, center: myLatlng } var map = new google.maps.Map(document.getElementById("map"), mapOptions); var marker = new google.maps.Marker({ position: myLatlng, title:"Hello World!" }); // To add the marker to the map, call setMap(); marker.setMap(map);
title
маркера появится в виде всплывающей подсказки.
Если вы не хотите передавать какие-либо Marker options
в конструктор маркера, вместо этого передайте пустой объект {}
в последнем аргументе конструктора.
Удалить маркер
Чтобы удалить маркер с карты, вызовите метод setMap()
, передав в качестве аргумента null
.
marker.setMap(null);
Обратите внимание, что описанный выше метод не удаляет маркер. Он удаляет маркер с карты. Если вместо этого вы хотите удалить маркер, вам следует удалить его с карты, а затем установить для самого маркера значение null
.
Если вы хотите управлять набором маркеров, вам следует создать массив для хранения маркеров. Используя этот массив, вы можете затем вызвать setMap()
для каждого маркера в массиве по очереди, когда вам нужно удалить маркеры. Вы можете удалить маркеры, удалив их с карты, а затем установив length
массива равной 0
, что удалит все ссылки на маркеры.
Настройка изображения маркера
Вы можете настроить внешний вид маркеров, указав файл изображения или векторный значок, который будет отображаться вместо значка кнопки Google Maps по умолчанию. Вы можете добавлять текст с меткой маркера , использовать сложные значки для определения интерактивных областей и устанавливать порядок расположения маркеров.
Маркеры со значками изображений
В самом простом случае значок может указывать изображение, которое будет использоваться вместо значка кнопки Google Maps по умолчанию. Чтобы указать такой значок, установите для свойства icon
маркера URL-адрес изображения. API JavaScript Карт автоматически определит размер значка.
Машинопись
// This example adds a marker to indicate the position of Bondi Beach in Sydney, // Australia. function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 4, center: { lat: -33, lng: 151 }, } ); const image = "https://developers.google.com/maps/documentation/javascript/examples/full/images/beachflag.png"; const beachMarker = new google.maps.Marker({ position: { lat: -33.89, lng: 151.274 }, map, icon: image, }); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// This example adds a marker to indicate the position of Bondi Beach in Sydney, // Australia. function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 4, center: { lat: -33, lng: 151 }, }); const image = "https://developers.google.com/maps/documentation/javascript/examples/full/images/beachflag.png"; const beachMarker = new google.maps.Marker({ position: { lat: -33.89, lng: 151.274 }, map, icon: image, }); } window.initMap = initMap;
Попробуйте образец
Маркеры с векторными значками
Вы можете использовать собственные векторные пути SVG, чтобы определить внешний вид маркеров. Для этого передайте литерал объекта Symbol
с желаемым путем к свойству icon
маркера. Вы можете определить собственный путь, используя нотацию пути SVG , или использовать один из предопределенных путей в google.maps.SymbolPath . Свойство anchor
необходимо для правильной визуализации маркера при изменении уровня масштабирования. Узнайте больше об использовании символов для создания векторных значков для маркеров (и полилиний).
Машинопись
// This example uses SVG path notation to add a vector-based symbol // as the icon for a marker. The resulting icon is a marker-shaped // symbol with a blue fill and no border. function initMap(): void { const center = new google.maps.LatLng(-33.712451, 150.311823); const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 9, center: center, } ); const svgMarker = { path: "M-1.547 12l6.563-6.609-1.406-1.406-5.156 5.203-2.063-2.109-1.406 1.406zM0 0q2.906 0 4.945 2.039t2.039 4.945q0 1.453-0.727 3.328t-1.758 3.516-2.039 3.070-1.711 2.273l-0.75 0.797q-0.281-0.328-0.75-0.867t-1.688-2.156-2.133-3.141-1.664-3.445-0.75-3.375q0-2.906 2.039-4.945t4.945-2.039z", fillColor: "blue", fillOpacity: 0.6, strokeWeight: 0, rotation: 0, scale: 2, anchor: new google.maps.Point(0, 20), }; new google.maps.Marker({ position: map.getCenter(), icon: svgMarker, map: map, }); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// This example uses SVG path notation to add a vector-based symbol // as the icon for a marker. The resulting icon is a marker-shaped // symbol with a blue fill and no border. function initMap() { const center = new google.maps.LatLng(-33.712451, 150.311823); const map = new google.maps.Map(document.getElementById("map"), { zoom: 9, center: center, }); const svgMarker = { path: "M-1.547 12l6.563-6.609-1.406-1.406-5.156 5.203-2.063-2.109-1.406 1.406zM0 0q2.906 0 4.945 2.039t2.039 4.945q0 1.453-0.727 3.328t-1.758 3.516-2.039 3.070-1.711 2.273l-0.75 0.797q-0.281-0.328-0.75-0.867t-1.688-2.156-2.133-3.141-1.664-3.445-0.75-3.375q0-2.906 2.039-4.945t4.945-2.039z", fillColor: "blue", fillOpacity: 0.6, strokeWeight: 0, rotation: 0, scale: 2, anchor: new google.maps.Point(0, 20), }; new google.maps.Marker({ position: map.getCenter(), icon: svgMarker, map: map, }); } window.initMap = initMap;
Попробуйте образец
Маркерные этикетки
![](https://google-developers.gonglchuangl.net/static/maps/documentation/javascript/images/markerlabel.png?authuser=0&hl=ru)
Метка маркера — это буква или цифра, которая отображается внутри маркера. На изображении маркера в этом разделе отображается метка маркера с буквой «B». Метку маркера можно указать либо в виде строки, либо в виде объекта MarkerLabel
, который включает строку и другие свойства метки.
При создании маркера вы можете указать свойство label
в объекте MarkerOptions
. Альтернативно вы можете вызвать setLabel()
для объекта Marker , чтобы установить метку на существующий маркер.
В следующем примере отображаются помеченные маркеры, когда пользователь щелкает карту:
Машинопись
// In the following example, markers appear when the user clicks on the map. // Each marker is labeled with a single alphabetical character. const labels = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; let labelIndex = 0; function initMap(): void { const bangalore = { lat: 12.97, lng: 77.59 }; const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 12, center: bangalore, } ); // This event listener calls addMarker() when the map is clicked. google.maps.event.addListener(map, "click", (event) => { addMarker(event.latLng, map); }); // Add a marker at the center of the map. addMarker(bangalore, map); } // Adds a marker to the map. function addMarker(location: google.maps.LatLngLiteral, map: google.maps.Map) { // Add the marker at the clicked location, and add the next-available label // from the array of alphabetical characters. new google.maps.Marker({ position: location, label: labels[labelIndex++ % labels.length], map: map, }); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// In the following example, markers appear when the user clicks on the map. // Each marker is labeled with a single alphabetical character. const labels = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; let labelIndex = 0; function initMap() { const bangalore = { lat: 12.97, lng: 77.59 }; const map = new google.maps.Map(document.getElementById("map"), { zoom: 12, center: bangalore, }); // This event listener calls addMarker() when the map is clicked. google.maps.event.addListener(map, "click", (event) => { addMarker(event.latLng, map); }); // Add a marker at the center of the map. addMarker(bangalore, map); } // Adds a marker to the map. function addMarker(location, map) { // Add the marker at the clicked location, and add the next-available label // from the array of alphabetical characters. new google.maps.Marker({ position: location, label: labels[labelIndex++ % labels.length], map: map, }); } window.initMap = initMap;
Попробуйте образец
Сложные иконки
Вы можете указать сложные формы, чтобы указать области, на которые можно щелкнуть, и указать, как значки должны выглядеть относительно других наложений (их «порядок стека»). Значки, указанные таким образом, должны установить свои свойства icon
в объект типа Icon
.
Объекты Icon
определяют изображение. Они также определяют size
значка, его origin
(например, если изображение, которое вы хотите, является частью более крупного изображения в спрайте) и anchor
, где должна располагаться активная точка значка (которая основана на источник).
Если вы используете метку с пользовательским маркером, вы можете разместить метку с помощью свойства labelOrigin
в объекте Icon
.
Машинопись
// The following example creates complex markers to indicate beaches near // Sydney, NSW, Australia. Note that the anchor is set to (0,32) to correspond // to the base of the flagpole. function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 10, center: { lat: -33.9, lng: 151.2 }, } ); setMarkers(map); } // Data for the markers consisting of a name, a LatLng and a zIndex for the // order in which these markers should display on top of each other. const beaches: [string, number, number, number][] = [ ["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], ]; function setMarkers(map: google.maps.Map) { // Adds markers to the map. // Marker sizes are expressed as a Size of X,Y where the origin of the image // (0,0) is located in the top left of the image. // Origins, anchor positions and coordinates of the marker increase in the X // direction to the right and in the Y direction down. const image = { url: "https://developers.google.com/maps/documentation/javascript/examples/full/images/beachflag.png", // This marker is 20 pixels wide by 32 pixels high. size: new google.maps.Size(20, 32), // The origin for this image is (0, 0). origin: new google.maps.Point(0, 0), // The anchor for this image is the base of the flagpole at (0, 32). anchor: new google.maps.Point(0, 32), }; // Shapes define the clickable region of the icon. The type defines an HTML // <area> element 'poly' which traces out a polygon as a series of X,Y points. // The final coordinate closes the poly by connecting to the first coordinate. const shape = { coords: [1, 1, 1, 20, 18, 20, 18, 1], type: "poly", }; for (let i = 0; i < beaches.length; i++) { const beach = beaches[i]; new google.maps.Marker({ position: { lat: beach[1], lng: beach[2] }, map, icon: image, shape: shape, title: beach[0], zIndex: beach[3], }); } } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// The following example creates complex markers to indicate beaches near // Sydney, NSW, Australia. Note that the anchor is set to (0,32) to correspond // to the base of the flagpole. function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 10, center: { lat: -33.9, lng: 151.2 }, }); setMarkers(map); } // Data for the markers consisting of a name, a LatLng and a zIndex for the // order in which these markers should display on top of each other. const beaches = [ ["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], ]; function setMarkers(map) { // Adds markers to the map. // Marker sizes are expressed as a Size of X,Y where the origin of the image // (0,0) is located in the top left of the image. // Origins, anchor positions and coordinates of the marker increase in the X // direction to the right and in the Y direction down. const image = { url: "https://developers.google.com/maps/documentation/javascript/examples/full/images/beachflag.png", // This marker is 20 pixels wide by 32 pixels high. size: new google.maps.Size(20, 32), // The origin for this image is (0, 0). origin: new google.maps.Point(0, 0), // The anchor for this image is the base of the flagpole at (0, 32). anchor: new google.maps.Point(0, 32), }; // Shapes define the clickable region of the icon. The type defines an HTML // <area> element 'poly' which traces out a polygon as a series of X,Y points. // The final coordinate closes the poly by connecting to the first coordinate. const shape = { coords: [1, 1, 1, 20, 18, 20, 18, 1], type: "poly", }; for (let i = 0; i < beaches.length; i++) { const beach = beaches[i]; new google.maps.Marker({ position: { lat: beach[1], lng: beach[2] }, map, icon: image, shape: shape, title: beach[0], zIndex: beach[3], }); } } window.initMap = initMap;
Попробуйте образец
Преобразование объектов MarkerImage
в тип Icon
До версии 3.10 Maps JavaScript API сложные значки определялись как объекты MarkerImage
. Литерал объекта Icon
был добавлен в версии 3.10 и заменяет MarkerImage
начиная с версии 3.11. Литералы объекта Icon
поддерживают те же параметры, что и MarkerImage
, что позволяет легко преобразовать MarkerImage
в Icon
, удалив конструктор, обернув предыдущие параметры в {}
и добавив имена каждого параметра. Например:
var image = new google.maps.MarkerImage( place.icon, new google.maps.Size(71, 71), new google.maps.Point(0, 0), new google.maps.Point(17, 34), new google.maps.Size(25, 25));
становится
var image = { url: place.icon, size: new google.maps.Size(71, 71), origin: new google.maps.Point(0, 0), anchor: new google.maps.Point(17, 34), scaledSize: new google.maps.Size(25, 25) };
Оптимизация маркеров
Оптимизация повышает производительность за счет отображения множества маркеров как одного статического элемента. Это полезно в тех случаях, когда требуется большое количество маркеров. По умолчанию Maps JavaScript API решает, будет ли оптимизирован маркер. При наличии большого количества маркеров API JavaScript Карт попытается отобразить маркеры с оптимизацией. Не все маркеры можно оптимизировать; в некоторых ситуациях Maps JavaScript API может потребоваться отрисовка маркеров без оптимизации. Отключите оптимизированный рендеринг для анимированных изображений GIF или PNG, а также когда каждый маркер должен отображаться как отдельный элемент DOM. В следующем примере показано создание оптимизированного маркера:
var marker = new google.maps.Marker({ position: myLatlng, title:"Hello World!", optimized: true });
Сделайте маркер доступным
Вы можете сделать маркер доступным, добавив событие прослушивателя кликов и установив optimized
значение false
. Прослушиватель кликов придает маркеру семантику кнопок, доступ к которым можно получить с помощью навигации с помощью клавиатуры, программ чтения с экрана и т. д. Используйте опцию title
, чтобы представить доступный текст для маркера.
В следующем примере первый маркер получает фокус при нажатии клавиши Tab; затем вы можете использовать клавиши со стрелками для перемещения между маркерами. Нажмите Tab еще раз, чтобы продолжить перемещение по остальным элементам управления картой. Если у маркера есть информационное окно, его можно открыть, щелкнув маркер или нажав клавишу ввода или пробел, когда маркер выбран. Когда информационное окно закроется, фокус вернется к соответствующему маркеру.
Машинопись
// The following example creates five accessible and // focusable markers. function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 12, center: { lat: 34.84555, lng: -111.8035 }, } ); // Set LatLng and title text for the markers. The first marker (Boynton Pass) // receives the initial focus when tab is pressed. Use arrow keys to // move between markers; press tab again to cycle through the map controls. const tourStops: [google.maps.LatLngLiteral, string][] = [ [{ lat: 34.8791806, lng: -111.8265049 }, "Boynton Pass"], [{ lat: 34.8559195, lng: -111.7988186 }, "Airport Mesa"], [{ lat: 34.832149, lng: -111.7695277 }, "Chapel of the Holy Cross"], [{ lat: 34.823736, lng: -111.8001857 }, "Red Rock Crossing"], [{ lat: 34.800326, lng: -111.7665047 }, "Bell Rock"], ]; // Create an info window to share between markers. const infoWindow = new google.maps.InfoWindow(); // Create the markers. tourStops.forEach(([position, title], i) => { const marker = new google.maps.Marker({ position, map, title: `${i + 1}. ${title}`, label: `${i + 1}`, optimized: false, }); // Add a click listener for each marker, and set up the info window. marker.addListener("click", () => { infoWindow.close(); infoWindow.setContent(marker.getTitle()); infoWindow.open(marker.getMap(), marker); }); }); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// The following example creates five accessible and // focusable markers. function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 12, center: { lat: 34.84555, lng: -111.8035 }, }); // Set LatLng and title text for the markers. The first marker (Boynton Pass) // receives the initial focus when tab is pressed. Use arrow keys to // move between markers; press tab again to cycle through the map controls. const tourStops = [ [{ lat: 34.8791806, lng: -111.8265049 }, "Boynton Pass"], [{ lat: 34.8559195, lng: -111.7988186 }, "Airport Mesa"], [{ lat: 34.832149, lng: -111.7695277 }, "Chapel of the Holy Cross"], [{ lat: 34.823736, lng: -111.8001857 }, "Red Rock Crossing"], [{ lat: 34.800326, lng: -111.7665047 }, "Bell Rock"], ]; // Create an info window to share between markers. const infoWindow = new google.maps.InfoWindow(); // Create the markers. tourStops.forEach(([position, title], i) => { const marker = new google.maps.Marker({ position, map, title: `${i + 1}. ${title}`, label: `${i + 1}`, optimized: false, }); // Add a click listener for each marker, and set up the info window. marker.addListener("click", () => { infoWindow.close(); infoWindow.setContent(marker.getTitle()); infoWindow.open(marker.getMap(), marker); }); }); } window.initMap = initMap;
Попробуйте образец
Анимация маркера
Вы можете анимировать маркеры, чтобы они демонстрировали динамическое движение в самых разных обстоятельствах. Чтобы указать способ анимации маркера, используйте свойство animation
маркера типа google.maps.Animation
. Поддерживаются следующие значения Animation
:
-
DROP
указывает, что маркер должен переместиться из верхней части карты в конечное место при первом размещении на карте. Анимация прекратится, как только маркер остановится, иanimation
вернется кnull
. Этот тип анимации обычно указывается при созданииMarker
. -
BOUNCE
указывает, что маркер должен подпрыгивать на месте. Отскакивающий маркер будет продолжать подпрыгивать до тех пор, пока его свойствуanimation
не будет явно присвоено значениеnull
.
Вы можете инициировать анимацию существующего маркера, вызвав setAnimation()
для объекта Marker
.
Машинопись
// The following example creates a marker in Stockholm, Sweden using a DROP // animation. Clicking on the marker will toggle the animation between a BOUNCE // animation and no animation. let marker: google.maps.Marker; function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 13, center: { lat: 59.325, lng: 18.07 }, } ); marker = new google.maps.Marker({ map, draggable: true, animation: google.maps.Animation.DROP, position: { lat: 59.327, lng: 18.067 }, }); marker.addListener("click", toggleBounce); } function toggleBounce() { if (marker.getAnimation() !== null) { marker.setAnimation(null); } else { marker.setAnimation(google.maps.Animation.BOUNCE); } } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// The following example creates a marker in Stockholm, Sweden using a DROP // animation. Clicking on the marker will toggle the animation between a BOUNCE // animation and no animation. let marker; function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 13, center: { lat: 59.325, lng: 18.07 }, }); marker = new google.maps.Marker({ map, draggable: true, animation: google.maps.Animation.DROP, position: { lat: 59.327, lng: 18.067 }, }); marker.addListener("click", toggleBounce); } function toggleBounce() { if (marker.getAnimation() !== null) { marker.setAnimation(null); } else { marker.setAnimation(google.maps.Animation.BOUNCE); } } window.initMap = initMap;
Попробуйте образец
Если у вас много маркеров, возможно, вы не захотите размещать их на карте все сразу. Вы можете использовать setTimeout()
для размещения анимации маркеров, используя шаблон, подобный показанному ниже:
function drop() { for (var i =0; i < markerArray.length; i++) { setTimeout(function() { addMarkerMethod(); }, i * 200); } }
Сделать маркер перетаскиваемым
Чтобы пользователи могли перетаскивать маркер в другое место на карте, установите draggable
значение true
в параметрах маркера.
var myLatlng = new google.maps.LatLng(-25.363882,131.044922); var mapOptions = { zoom: 4, center: myLatlng } var map = new google.maps.Map(document.getElementById("map"), mapOptions); // Place a draggable marker on the map var marker = new google.maps.Marker({ position: myLatlng, map: map, draggable:true, title:"Drag me!" });
Дальнейшая настройка маркера
Полностью настраиваемый маркер см. в примере настраиваемого всплывающего окна .
Дополнительные расширения класса Marker, кластеризацию маркеров и управление ими, а также настройку наложения см. в библиотеках с открытым исходным кодом .