Google maps Marker Label с несколькими символами
Я пытаюсь добавить метку с 4 символами (например, "A123" ) на маркер Google Maps с широким значком, определенным с помощью настраиваемого пути.
var marker = new google.maps.Marker({
position: latLon,
label: { text: 'A123' },
map: map,
icon: {
path: 'custom icon path',
fillColor: '#000000',
labelOrigin: new google.maps.Point(26.5, 20),
anchor: new google.maps.Point(26.5, 43)
scale: 1,
}
});
маркерная метка API ограничивается одним символом, поэтому просто показывает маркер с "А" в приведенном выше примере. Я пробовал использовать инструменты разработчика Chrome для взлома html, который создается gmaps и восстанавливает более длинную метку. Он отлично отображается без каких-либо изменений в css, поэтому мне просто нужно найти способ восстановить другие метки ярлыков, которые карты Google разделили.
Я поднял Вопрос Google Карт, чтобы попросить снять это ограничение. Пожалуйста, подумайте о том, чтобы голосовать за проблему Google, перейдя по ссылке выше и в главной роли, чтобы побудить Google исправить ее - спасибо!
Но в то же время, есть ли способ обхода, который я могу использовать для удаления одного ограничения char?
Есть ли способ создать пользовательское расширение google.maps.Marker, чтобы показать мою более длинную метку?
Ответы
Ответ 1
Вы можете использовать MarkerWithLabel с иконками SVG.
Обновление: Google Maps Javascript API v3 теперь поддерживает несколько символов в MarkerLabel
.подтверждение концепции (вы не предоставили свой значок, поэтому я его придумал)
Примечание. Существует проблема с ярлыками на перекрывающихся маркерах, которая устраняется с помощью этого исправления, спасибо Робду, который упоминал об этом в комментариях.
фрагмент кода:
function initMap() {
var latLng = new google.maps.LatLng(49.47805, -123.84716);
var homeLatLng = new google.maps.LatLng(49.47805, -123.84716);
var map = new google.maps.Map(document.getElementById('map_canvas'), {
zoom: 12,
center: latLng,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new MarkerWithLabel({
position: homeLatLng,
map: map,
draggable: true,
raiseOnDrag: true,
labelContent: "ABCD",
labelAnchor: new google.maps.Point(15, 65),
labelClass: "labels", // the CSS class for the label
labelInBackground: false,
icon: pinSymbol('red')
});
var iw = new google.maps.InfoWindow({
content: "Home For Sale"
});
google.maps.event.addListener(marker, "click", function(e) {
iw.open(map, this);
});
}
function pinSymbol(color) {
return {
path: 'M 0,0 C -2,-20 -10,-22 -10,-30 A 10,10 0 1,1 10,-30 C 10,-22 2,-20 0,0 z',
fillColor: color,
fillOpacity: 1,
strokeColor: '#000',
strokeWeight: 2,
scale: 2
};
}
google.maps.event.addDomListener(window, 'load', initMap);
html,
body,
#map_canvas {
height: 500px;
width: 500px;
margin: 0px;
padding: 0px
}
.labels {
color: white;
background-color: red;
font-family: "Lucida Grande", "Arial", sans-serif;
font-size: 10px;
text-align: center;
width: 30px;
white-space: nowrap;
}
<script src="https://maps.googleapis.com/maps/api/js?sensor=false&libraries=geometry,places&ext=.js"></script>
<script src="https://cdn.rawgit.com/googlemaps/v3-utility-library/master/markerwithlabel/src/markerwithlabel.js"></script>
<div id="map_canvas" style="height: 400px; width: 100%;"></div>
Ответ 2
Прежде всего, спасибо автору кода!
Я нашел ссылку ниже во время поиска в Google, и это очень просто и работает лучше всего. Никогда не потерпит неудачу, если SVG не устарела.
https://codepen.io/moistpaint/pen/ywFDe/
В коде есть некоторая ошибка загрузки js, но она прекрасно работает по предоставленной ссылке codepen.io.
var mapOptions = {
zoom: 16,
center: new google.maps.LatLng(-37.808846, 144.963435)
};
map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
var pinz = [
{
'location':{
'lat' : -37.807817,
'lon' : 144.958377
},
'lable' : 2
},
{
'location':{
'lat' : -37.807885,
'lon' : 144.965415
},
'lable' : 42
},
{
'location':{
'lat' : -37.811377,
'lon' : 144.956596
},
'lable' : 87
},
{
'location':{
'lat' : -37.811293,
'lon' : 144.962883
},
'lable' : 145
},
{
'location':{
'lat' : -37.808089,
'lon' : 144.962089
},
'lable' : 999
},
];
for(var i = 0; i <= pinz.length; i++){
var image = 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2238%22%20height%3D%2238%22%20viewBox%3D%220%200%2038%2038%22%3E%3Cpath%20fill%3D%22%23808080%22%20stroke%3D%22%23ccc%22%20stroke-width%3D%22.5%22%20d%3D%22M34.305%2016.234c0%208.83-15.148%2019.158-15.148%2019.158S3.507%2025.065%203.507%2016.1c0-8.505%206.894-14.304%2015.4-14.304%208.504%200%2015.398%205.933%2015.398%2014.438z%22%2F%3E%3Ctext%20transform%3D%22translate%2819%2018.5%29%22%20fill%3D%22%23fff%22%20style%3D%22font-family%3A%20Arial%2C%20sans-serif%3Bfont-weight%3Abold%3Btext-align%3Acenter%3B%22%20font-size%3D%2212%22%20text-anchor%3D%22middle%22%3E' + pinz[i].lable + '%3C%2Ftext%3E%3C%2Fsvg%3E';
var myLatLng = new google.maps.LatLng(pinz[i].location.lat, pinz[i].location.lon);
var marker = new google.maps.Marker({
position: myLatLng,
map: map,
icon: image
});
}
html, body, #map-canvas {
height: 100%;
margin: 0px;
padding: 0px
}
<div id="map-canvas"></div>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDtc3qowwB96ObzSu2vvjEoM2pVhZRQNSA&signed_in=true&callback=initMap&libraries=drawing,places"></script>
Ответ 3
Хорошо, вот одно решение, которое я придумала, которое довольно запутано.
Я поместил полный текст метки в div, используя атрибут метки fontFamily. Затем я использую querySelectorAll, чтобы сопоставить результирующие атрибуты стиля, чтобы извлечь ссылки и переписать теги после загрузки карты:
var label = "A123";
var marker = new google.maps.Marker({
position: latLon,
label: {
text: label,
// Add in the custom label here
fontFamily: 'Roboto, Arial, sans-serif, custom-label-' + label
},
map: map,
icon: {
path: 'custom icon path',
fillColor: '#000000',
labelOrigin: new google.maps.Point(26.5, 20),
anchor: new google.maps.Point(26.5, 43),
scale: 1
}
});
google.maps.event.addListener(map, 'idle', function() {
var labels = document.querySelectorAll("[style*='custom-label']")
for (var i = 0; i < labels.length; i++) {
// Retrieve the custom labels and rewrite the tag content
var matches = labels[i].getAttribute('style').match(/custom-label-(A\d\d\d)/);
labels[i].innerHTML = matches[1];
}
});
Это кажется довольно хрупким. Есть ли подходы, которые менее ужасны?
Ответ 4
Начиная с версии API 3.26.10, вы можете установить метку с более чем одним символом. Ограничение снимается.
Попробуйте, это сработает!
Кроме того, используя объект MarkerLabel вместо простой строки, вы можете установить ряд свойств для внешнего вида, и если вы используете пользовательский значок, вы можете установить свойство labelOrigin для изменения метки.
Источник:
https://code.google.com/p/gmaps-api-issues/issues/detail?id=8578#c30
(также вы можете сообщить о любых проблемах, связанных с этим в вышеупомянутой связанной теме)
Ответ 5
Для тех, кто пытается
... в 2019 году стоит отметить, что некоторые из упомянутых здесь кодов больше не существуют (официально). Google давно прекратил поддержку проекта "MarkerWithLabel". Первоначально он размещался в коде Google здесь, теперь неофициально он размещен на Github здесь.
Но есть еще один проект, который Google поддерживал до 2016 года и который называется "MapLabel" s. Этот подход отличается (и, возможно, лучше). Вы создаете отдельный объект метки карты с тем же источником, что и у маркера, вместо добавления опции mapLabel к самому маркеру. Вы можете создать маркер с меткой из нескольких символов, используя js-marker-label.
Ответ 6
Более простое решение этой проблемы, позволяющее буквам, цифрам и словам в качестве метки указывать следующий код. Более конкретно, строка кода, начинающаяся с "icon:". Любая строка или переменная может быть заменена на "k".
for (i = 0; i < locations.length; i++)
{
k = i + 1;
marker = new google.maps.Marker({
position: new google.maps.LatLng(locations[i][1], locations[i][2]),
map: map,
icon: 'http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=' + k + '|FF0000|000000'
});
--- массив местоположений содержит lat и long, а k - номер строки для адреса, который я отображал. Другими словами, если бы у меня было 100 адресов для отображения моих меток маркеров, было бы от 1 до 100.