По крайней мере с октября 2016 года официальный API предоставляет возможность добавлять постоянно видимые метки, длина которых превышает одну букву. См. этот ответ участника проекта Google .
var m = new google.maps.Marker({
position: new google.maps.LatLng(lat, lng),
label: 'Hello world',
});
По умолчанию результат выглядит так:
![Example image](https://i.stack.imgur.com/jCyWA.png)
Довольно нечитабельно. К счастью, API также позволяет использовать объект MarkerLabel вместо простой строки:
var m = new google.maps.Marker({
position: new google.maps.LatLng(lat, lng),
label: {
color: 'white',
fontWeight: 'bold',
text: 'Hello world',
},
});
Приведенный выше фрагмент кода дает следующий результат:
![A white, bold label at the middle of the marker](https://i.stack.imgur.com/u2iSX.png)
Однако в первоначальном вопросе спрашивалось, может ли этикетка находиться под маркером. Документы MarkerLabel упоминают, что это возможно с помощью пользовательского значка и свойства labelOrigin
. Если мы хотим использовать значок по умолчанию, один из них доступен на GitHub . Давайте добавим значок объекта:
var m = new google.maps.Marker({
position: new google.maps.LatLng(lat, lng),
label: {
color: 'white',
fontWeight: 'bold',
text: 'Hello world',
},
icon: {
labelOrigin: new google.maps.Point(11, 50),
url: 'default_marker.png',
size: new google.maps.Size(22, 40),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(11, 40),
},
});
Результаты:
![A white, bold label below the marker](https://i.stack.imgur.com/57rZt.png)
Довольно хорошо! Однако у всего этого подхода есть недостаток, которого нет в рамке исходного вопроса: удобочитаемость для каждого типа карты. Если тип карты изменяется со спутника на стандартную, результирующую метку трудно прочитать:
![A white, bold label below the marker against white background](https://i.stack.imgur.com/Yao4c.png)
Простой, но не идеальный способ избежать низкого контраста в обоих типах - установить color: 'gray'
:
![Grey labels](https://i.stack.imgur.com/Zb6pX.png)
Тем не менее, серый цвет не подходит для городских районов. Лучшим вариантом было бы применить text-shadow
свойство CSS для рисования черных линий для белого текста. Однако я не могу найти способ применить свойство к меткам, потому что несколько элементов DOM, созданных в Картах Google, определяют класс:
![DOM elements](https://i.stack.imgur.com/A038G.png)
Лучший вариант, который мне подошел, - это обнаружить изменения в типе карты и обновить цвет метки для каждого маркера:
map.addListener('maptypeid_changed', function () {
var typeToColor, type, color, k, label;
typeToColor = {
'terrain': 'black',
'roadmap': 'black',
'hybrid': 'white',
'satellite': 'white',
};
type = map.getMapTypeId();
color = typeToColor[type];
for (k in markers) {
if (markers.hasOwnProperty(k)) {
label = markers[k].getLabel();
label.color = color;
markers[k].setLabel(label);
}
}
});
Однако даже это может не сработать на снежных или облачных спутниковых снимках. Я думаю, что это все еще достаточно хорошо в большинстве случаев. Тем не менее, приятно иметь возможность отображать видимые метки с помощью официального API, без каких-либо плагинов:)