Как создать нумерованные маркеры карт в Google Maps V3?
Я работаю над картой с несколькими маркерами.
Эти маркеры используют пользовательский значок, но я также хотел бы добавить числа сверху. Я видел, как это было выполнено с использованием более старых версий API. Как это сделать в V3?
* Примечание. Атрибут "title" создает всплывающую подсказку, когда вы наводите указатель на маркер, но мне нужно что-то, что будет накладываться поверх пользовательского изображения, даже если вы не навешиваете поверх него.
Здесь документация для класса маркера, и ни один из этих атрибутов не помогает: http://code.google.com/apis/maps/documentation/v3/reference.html#MarkerOptions
Ответы
Ответ 1
К сожалению, это не очень просто. Вы можете создать свой собственный маркер на основе класса OverlayView (пример) и поместить в него свой собственный HTML-код, включая счетчик. Это даст вам очень простой маркер, который вы не сможете легко перетащить или добавить тени, но он очень настраиваемый.
В качестве альтернативы вы можете добавить метку к маркеру по умолчанию. Это будет менее настраиваемо, но должно работать. Он также сохраняет все полезные вещи, которые делает стандартный маркер.
Подробнее о наложениях в статье Google Подробнее см. в разделе "Развлечения с объектами MVC" .
Изменить: если вы не хотите создавать класс JavaScript, вы можете использовать API диаграммы Google. Например:
Нумерованный маркер:
http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=7|FF0000|000000
Текстовый маркер:
http://chart.apis.google.com/chart?chst=d_map_spin&chld=1|0|FF0000|12|_|foo
Это быстрый и простой маршрут, но он менее настраиваемый и требует, чтобы клиент загружал новое изображение для каждого маркера.
Ответ 2
Это как я делаю это в V3:
Я начинаю с загрузки карт goi google и внутри метода обратного вызова initialize()
Я загружаю MarkerWithLabel.js, что нашел здесь:
function initialize() {
$.getScript("/js/site/marker/MarkerWithLabel.js#{applicationBean.version}", function(){
var mapOptions = {
zoom: 8,
center: new google.maps.LatLng(currentLat, currentLng),
mapTypeId: google.maps.MapTypeId.ROADMAP,
streetViewControl: false,
mapTypeControl: false
};
var map = new google.maps.Map(document.getElementById('mapholder'),
mapOptions);
var bounds = new google.maps.LatLngBounds();
for (var i = 0; i < mapData.length; i++) {
createMarker(i+1, map, mapData[i]); <!-- MARKERS! -->
extendBounds(bounds, mapData[i]);
}
map.fitBounds(bounds);
var maximumZoomLevel = 16;
var minimumZoomLevel = 11;
var ourZoom = defaultZoomLevel; // default zoom level
var blistener = google.maps.event.addListener((map), 'bounds_changed', function(event) {
if (this.getZoom(map.getBounds) > 16) {
this.setZoom(maximumZoomLevel);
}
google.maps.event.removeListener(blistener);
});
});
}
function loadScript() {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=places&sensor=false&callback=initialize";
document.body.appendChild(script);
}
window.onload = loadScript;
</script>
Затем создаю маркеры с createMarker()
:
function createMarker(number, currentMap, currentMapData) {
var marker = new MarkerWithLabel({
position: new google.maps.LatLng(currentMapData[0], currentMapData[1]),
map: currentMap,
icon: '/img/sticker/empty.png',
shadow: '/img/sticker/bubble_shadow.png',
transparent: '/img/sticker/bubble_transparent.png',
draggable: false,
raiseOnDrag: false,
labelContent: ""+number,
labelAnchor: new google.maps.Point(3, 30),
labelClass: "mapIconLabel", // the CSS class for the label
labelInBackground: false
});
}
Поскольку я добавил класс mapIconLabel в маркер, я могу добавить некоторые правила CSS в моем css:
.mapIconLabel {
font-size: 15px;
font-weight: bold;
color: #FFFFFF;
font-family: 'DINNextRoundedLTProMediumRegular';
}
И вот результат:
![MarkerWithIconAndLabel]()
Ответ 3
У меня недостаточно репутации, чтобы комментировать ответы, но хотелось бы отметить, что API-интерфейс Google Chart устарел.
На домашней странице API :
Инфографическая часть инструментов Google Chart официально устарел по состоянию на 20 апреля 2012 года.
Ответ 4
Вы можете загрузить набор нумерованных значков из источников, представленных на этом сайте:
Затем вы сможете сделать следующее:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps Demo</title>
<script type="text/javascript"
src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
function initialize() {
var myOptions = {
zoom: 11,
center: new google.maps.LatLng(-33.9, 151.2),
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(document.getElementById("map"), myOptions);
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]
];
for (var i = 0; i < locations.length; i++) {
var image = new google.maps.MarkerImage('marker' + i + '.png',
new google.maps.Size(20, 34),
new google.maps.Point(0, 0),
new google.maps.Point(10, 34));
var location = locations[i];
var myLatLng = new google.maps.LatLng(location[1], location[2]);
var marker = new google.maps.Marker({
position: myLatLng,
map: map,
icon: image,
title: location[0],
zIndex: location[3]
});
}
}
</script>
</head>
<body style="margin:0px; padding:0px;" onload="initialize();">
<div id="map" style="width:400px; height:500px;"></div>
</body>
</html>
Снимок экрана из приведенного выше примера:
![Google Numbered Marker Icons]()
Обратите внимание, что вы можете легко добавить тень за маркерами. Для получения дополнительной информации об этом можно проверить в Справочник по API Карт Google: сложные маркеры.
Ответ 5
Теперь это было добавлено в документацию Mapping и не требует стороннего кода.
Вы можете объединить эти два образца:
https://developers.google.com/maps/documentation/javascript/examples/marker-labels
https://developers.google.com/maps/documentation/javascript/examples/icon-simple
Чтобы получить код, подобный этому:
var labelIndex = 0;
var labels = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789';
function initialize() {
var bangalore = { lat: 12.97, lng: 77.59 };
var map = new google.maps.Map(document.getElementById('map-canvas'), {
zoom: 12,
center: bangalore
});
// This event listener calls addMarker() when the map is clicked.
google.maps.event.addListener(map, 'click', function(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.
var marker = new google.maps.Marker({
position: location,
label: labels[labelIndex],
map: map,
icon: 'image.png'
});
}
google.maps.event.addDomListener(window, 'load', initialize);
Обратите внимание, что если у вас есть более 35 маркеров, этот метод не будет работать, так как метка показывает только первый символ (использование AZ и 0-9 означает 35). Проголосуйте за эту проблему с Google Картами, чтобы попросить снять это ограничение.
Ответ 6
Я сделал это, используя решение, подобное @ZuzEL.
Вместо использования решения по умолчанию (http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=7|FF0000|000000) вы можете создавать эти изображения по своему усмотрению, используя JavaScript, без какого-либо сервера -защищенный код.
Google google.maps.Marker принимает Base64 для своего свойства значка. С этим мы можем создать допустимый Base64 из SVG.
![введите описание изображения здесь]()
Вы можете видеть, что код создает то же самое, что и этот образ в этом Plunker: http://plnkr.co/edit/jep5mVN3DsVRgtlz1GGQ?p=preview
var markers = [
[1002, -14.2350040, -51.9252800],
[2000, -34.028249, 151.157507],
[123, 39.0119020, -98.4842460],
[50, 48.8566140, 2.3522220],
[22, 38.7755940, -9.1353670],
[12, 12.0733335, 52.8234367],
];
function initializeMaps() {
var myLatLng = {
lat: -25.363,
lng: 131.044
};
var map = new google.maps.Map(document.getElementById('map_canvas'), {
zoom: 4,
center: myLatLng
});
var bounds = new google.maps.LatLngBounds();
markers.forEach(function(point) {
generateIcon(point[0], function(src) {
var pos = new google.maps.LatLng(point[1], point[2]);
bounds.extend(pos);
new google.maps.Marker({
position: pos,
map: map,
icon: src
});
});
});
map.fitBounds(bounds);
}
var generateIconCache = {};
function generateIcon(number, callback) {
if (generateIconCache[number] !== undefined) {
callback(generateIconCache[number]);
}
var fontSize = 16,
imageWidth = imageHeight = 35;
if (number >= 1000) {
fontSize = 10;
imageWidth = imageHeight = 55;
} else if (number < 1000 && number > 100) {
fontSize = 14;
imageWidth = imageHeight = 45;
}
var svg = d3.select(document.createElement('div')).append('svg')
.attr('viewBox', '0 0 54.4 54.4')
.append('g')
var circles = svg.append('circle')
.attr('cx', '27.2')
.attr('cy', '27.2')
.attr('r', '21.2')
.style('fill', '#2063C6');
var path = svg.append('path')
.attr('d', 'M27.2,0C12.2,0,0,12.2,0,27.2s12.2,27.2,27.2,27.2s27.2-12.2,27.2-27.2S42.2,0,27.2,0z M6,27.2 C6,15.5,15.5,6,27.2,6s21.2,9.5,21.2,21.2c0,11.7-9.5,21.2-21.2,21.2S6,38.9,6,27.2z')
.attr('fill', '#FFFFFF');
var text = svg.append('text')
.attr('dx', 27)
.attr('dy', 32)
.attr('text-anchor', 'middle')
.attr('style', 'font-size:' + fontSize + 'px; fill: #FFFFFF; font-family: Arial, Verdana; font-weight: bold')
.text(number);
var svgNode = svg.node().parentNode.cloneNode(true),
image = new Image();
d3.select(svgNode).select('clippath').remove();
var xmlSource = (new XMLSerializer()).serializeToString(svgNode);
image.onload = (function(imageWidth, imageHeight) {
var canvas = document.createElement('canvas'),
context = canvas.getContext('2d'),
dataURL;
d3.select(canvas)
.attr('width', imageWidth)
.attr('height', imageHeight);
context.drawImage(image, 0, 0, imageWidth, imageHeight);
dataURL = canvas.toDataURL();
generateIconCache[number] = dataURL;
callback(dataURL);
}).bind(this, imageWidth, imageHeight);
image.src = 'data:image/svg+xml;base64,' + btoa(encodeURIComponent(xmlSource).replace(/%([0-9A-F]{2})/g, function(match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
initializeMaps();
#map_canvas {
width: 100%;
height: 300px;
}
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css">
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
</head>
<body>
<div id="map_canvas"></div>
</body>
<script src="script.js"></script>
</html>
Ответ 7
Как насчет этого? (2015 год)
1) Получите пользовательское изображение маркера.
var imageObj = new Image();
imageObj.src = "/markers/blank_pin.png";
2) Создайте canvas
в RAM
и нарисуйте это изображение на нем
imageObj.onload = function(){
var canvas = document.createElement('canvas');
var context = canvas.getContext("2d");
context.drawImage(imageObj, 0, 0);
}
3) Напишите что-нибудь над ним
context.font = "40px Arial";
context.fillText("54", 17, 55);
4) Получите необработанные данные с холста и предоставите их API Google вместо URL
var image = {
url: canvas.toDataURL(),
};
new google.maps.Marker({
position: position,
map: map,
icon: image
});
![введите описание изображения здесь]()
Полный код:
function addComplexMarker(map, position, label, callback){
var canvas = document.createElement('canvas');
var context = canvas.getContext("2d");
var imageObj = new Image();
imageObj.src = "/markers/blank_pin.png";
imageObj.onload = function(){
context.drawImage(imageObj, 0, 0);
//Adjustable parameters
context.font = "40px Arial";
context.fillText(label, 17, 55);
//End
var image = {
url: canvas.toDataURL(),
size: new google.maps.Size(80, 104),
origin: new google.maps.Point(0,0),
anchor: new google.maps.Point(40, 104)
};
// the clickable region of the icon.
var shape = {
coords: [1, 1, 1, 104, 80, 104, 80 , 1],
type: 'poly'
};
var marker = new google.maps.Marker({
position: position,
map: map,
labelAnchor: new google.maps.Point(3, 30),
icon: image,
shape: shape,
zIndex: 9999
});
callback && callback(marker)
};
});
Ответ 8
Google Maps версии 3 имеет встроенную поддержку меток маркеров. Не нужно больше создавать собственные изображения или реализовывать сторонние классы. Маркерные метки
Ответ 9
Можно создать ярлыки значков на стороне сервера, если у вас есть навыки программирования. В дополнение к PHP вам понадобится библиотека GD на сервере. Работала хорошо для меня уже несколько лет, но, по общему признанию, сложна, чтобы синхронизировать изображения значков.
Я делаю это через AJAX, отправив несколько параметров, чтобы определить пустой значок, текст и цвет, а также bgcolor для применения. Здесь мой PHP:
header("Content-type: image/png");
//$img_url = "./icons/gen_icon5.php?blank=7&text=BB";
function do_icon ($icon, $text, $color) {
$im = imagecreatefrompng($icon);
imageAlphaBlending($im, true);
imageSaveAlpha($im, true);
$len = strlen($text);
$p1 = ($len <= 2)? 1:2 ;
$p2 = ($len <= 2)? 3:2 ;
$px = (imagesx($im) - 7 * $len) / 2 + $p1;
$font = 'arial.ttf';
$contrast = ($color)? imagecolorallocate($im, 255, 255, 255): imagecolorallocate($im, 0, 0, 0); // white on dark?
imagestring($im, $p2, $px, 3, $text, $contrast); // imagestring ( $image, $font, $x, $y, $string, $color)
imagepng($im);
imagedestroy($im);
}
$icons = array("black.png", "blue.png", "green.png", "red.png", "white.png", "yellow.png", "gray.png", "lt_blue.png", "orange.png"); // 1/9/09
$light = array( TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE); // white text?
$the_icon = $icons[$_GET['blank']]; // 0 thru 8 (note: total 9)
$the_text = substr($_GET['text'], 0, 3); // enforce 2-char limit
do_icon ($the_icon, $the_text,$light[$_GET['blank']] );
Он вызывается клиентской стороной через что-то вроде следующего: var image_file = "./our_icons/gen_icon.php?blank=" + escape (значки [цвет]) + "& text =" + iconStr;
Ответ 10
Мои два цента показывают, как использовать API Google Карт для решения этой проблемы.
Ответ 11
На основе @dave1010 ответьте, но с обновленными ссылками https
.
Нумерованный маркер:
https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=7|FF0000|000000
Текстовый маркер:
https://chart.googleapis.com/chart?chst=d_map_spin&chld=1|0|FF0000|12|_|Marker
Ответ 12
Вы можете использовать опцию Marker With Label в google-maps-utility-library-v3.
![enter image description here]()
Просто отсылайте https://code.google.com/p/google-maps-utility-library-v3/wiki/Libraries
Ответ 13
Я нашел лучший способ сделать это.
Используйте Snap.svg для создания svg, а затем используйте функцию toDataURL(), которая создает графические данные для включения в качестве значка.
Обратите внимание, что я использую класс SlidingMarker для маркера, который дает мне хорошее перемещение маркера.
С Snap.svg вы можете создавать любые виды графики, и ваша карта будет выглядеть фантастически.
var s = Snap(100, 100);
s.text(50, 50, store.name);
// Use more graphics here.
var marker = new SlidingMarker({
position: {lat: store.lat, lng: store.lng},
map: $scope.map,
label: store.name, // you do not need this
title: store.name, // nor this
duration: 2000,
icon: s.toDataURL()
});
Ответ 14
EASIEST SOLUTION - ИСПОЛЬЗОВАНИЕ SVG
Работает в: IE9, IE10, FF, Chrome, Safari
(если вы используете другие браузеры, пожалуйста, "Выполните фрагмент кода" и поместите комментарий)
Никаких внешних зависимостей, кроме API Карт Google!
![введите описание изображения здесь]()
Это довольно легко, если у вас есть значок в формате .svg. Если это так, просто добавить соответствующий текстовый элемент и изменить его содержимое в соответствии с вашими потребностями с помощью JS.
Добавьте что-то подобное вашему коду .svg
(это текст "раздел", который позже будет изменен с помощью JS):
<text id="1" fill="#20539F" font-family="NunitoSans-ExtraBold, Nunito Sans" font-size="18" font-weight="600" letter-spacing=".104" text-anchor="middle" x="50%" y="28">1</text>
Пример: (частично скопирован из @EstevãoLucas)
Важно:
Используйте правильные свойства тега <text>
. Обратите внимание, что text-anchor="middle" x="50%" y="28"
, в центре которого больше номеров (подробнее: Как разместить и центрировать текст в прямоугольнике SVG)
Используйте encodeURIComponent()
(это, вероятно, гарантирует совместимость с IE9 и 10)
// Most important part (use output as Google Maps icon)
function getMarkerIcon(number) {
// inline your SVG image with number variable
var svg = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="40" viewBox="0 0 40 40"> <defs> <rect id="path-1" width="40" height="40"/> <mask id="mask-2" width="40" height="40" x="0" y="0" fill="white"> <use xlink:href="#path-1"/> </mask> </defs> <g id="Page-1" fill="none" fill-rule="evenodd"> <g id="Phone-Portrait---320" transform="translate(-209 -51)"> <g id="Group" transform="translate(209 51)"> <use id="Rectangle" fill="#FFEB3B" stroke="#F44336" stroke-width="4" mask="url(#mask-2)" xlink:href="#path-1"/> <text id="1" fill="#20539F" font-family="NunitoSans-ExtraBold, Nunito Sans" font-size="18" font-weight="600" letter-spacing=".104" text-anchor="middle" x="50%" y="28">' + number + '</text> </g> </g> </g> </svg>';
// use SVG without base64 see: https://css-tricks.com/probably-dont-base64-svg/
return 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);
}
// Standard Maps API code
var markers = [
[1, -14.2350040, -51.9252800],
[2, -34.028249, 151.157507],
[3, 39.0119020, -98.4842460],
[5, 48.8566140, 2.3522220],
[9, 38.7755940, -9.1353670],
[12, 12.0733335, 52.8234367],
];
function initializeMaps() {
var myLatLng = {
lat: -25.363,
lng: 131.044
};
var map = new google.maps.Map(document.getElementById('map_canvas'), {
zoom: 4,
center: myLatLng
});
var bounds = new google.maps.LatLngBounds();
markers.forEach(function(point) {
var pos = new google.maps.LatLng(point[1], point[2]);
new google.maps.Marker({
position: pos,
map: map,
icon: getMarkerIcon(point[0]),
});
bounds.extend(pos);
});
map.fitBounds(bounds);
}
initializeMaps();
#map_canvas {
width: 100%;
height: 300px;
}
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css">
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
<div id="map_canvas"></div>
</body>
<script src="script.js"></script>
</html>
Ответ 15
Возможно, есть те, кто все еще ищет это, но считает, что значки Google Dynamic устарели, а другие библиотеки значков карты слишком уродливы.
Добавить простой маркер с любым номером внутри, используя URL. В Google Диске с использованием Google My Maps создаются нумерованные значки, когда используется слой карты с "Последовательностью чисел", а затем добавляются маркеры/точки на карте.
Глядя на исходный код, Google имеет свой собственный способ сделать это через URL:
https://mt.google.com/vt/icon/name=icons/onion/SHARED-mymaps-container-bg_4x.png,icons/onion/SHARED-mymaps-container_4x.png,icons/onion/1738-blank-sequence_4x.png&highlight=ff000000,0288D1,ff000000&scale=2.0&color=ffffffff&psize=15&text=56&font=fonts/Roboto-Medium.ttf
Выше URL
![enter image description here]()
Я не слишком много играл с ним, но, изменив шестнадцатеричные цветовые коды в параметре 'highlight' (параметр color не меняет цвет, как вы думаете), значение 'text' может быть установлено на любую строку, и вы можете сделать красивый круглый значок с любым числом/значением внутри. Я уверен, что другие параметры тоже могут быть полезны.
Одно предостережение с этим подходом, который знает, когда Google удалит этот URL из мира!
Ответ 16
Вот пользовательские значки с обновленным стилем "визуального обновления", который можно быстро генерировать с помощью простого .vbs script. Я также включил большой предварительно сгенерированный набор, который можно использовать сразу с несколькими вариантами цвета: https://github.com/Concept211/Google-Maps-Markers
Используйте следующий формат при подключении к файлам изображений, размещенным в GitHub:
https://raw.githubusercontent.com/Concept211/Google-Maps-Markers/master/images/marker_[color][character].png
цвет
красный, черный, синий, зеленый, серый, оранжевый, фиолетовый, белый, желтый
символ
A-Z, 1-100,!, @, $, +, -, =, (% 23 = #), (% 25 =%), (% 26 = &), (blank = •)
<сильные > Примеры:
https://raw.githubusercontent.com/Concept211/Google-Maps-Markers/master/images/marker_red1.png
https://raw.githubusercontent.com/Concept211/Google-Maps-Markers/master/images/marker_blue2.png
https://raw.githubusercontent.com/Concept211/Google-Maps-Markers/master/images/marker_green3.png