Googleマップのマーカーに数値を表示するにはどうすればよいですか?サーバー側のクラスタリングを行いたいので、クラスターが表すポイント数を表示する必要があります。
icon: 'http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=1|FE6256|000000'
1桁と2桁の数字で問題ない
(マウロのリンクから)
シンプルな.vbsスクリプトを使用してすばやく生成できる、更新された「視覚更新」スタイルのカスタムアイコンを次に示します。また、複数の色オプションですぐに使用できる、事前に生成された大きなセットを含めました。 https://github.com/Concept211/Google-Maps-Markers
GitHubでホストされている画像ファイルにリンクするときは、次の形式を使用します。
https://raw.githubusercontent.com/Concept211/Google-Maps-Markers/master/images/marker_[color][character].png
色
red, black, blue, green, grey, orange, purple, white, yellow
文字
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
デフォルトのソリューション( http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=7|FF0000|0000 )を使用する代わりに、JavaScriptを使用してこれらの画像を自由に作成できます。サーバー側のコードなし。
Google google.maps.Markerは、アイコンプロパティにBase64を受け入れます。これにより、SVGから有効なBase64を作成できます。
この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>
このデモでは、D3.jsを使用してSVGを作成し、SVGをCanvasに変換したので、必要に応じて画像のサイズを変更でき、その後canvasのtoDataURLメソッドを使用してBase64を取得します。
このデモはすべて、私の仲間@ thiago-mataのコードに基づいています。彼への称賛。
最新のgoogle js APIには google.maps.MarkerLabel オブジェクトがあります。
したがって、ラベルのテキスト/スタイルを簡単に設定できます
var mIcon = {
path: google.maps.SymbolPath.CIRCLE,
fillOpacity: 1,
fillColor: '#fff',
strokeOpacity: 1,
strokeWeight: 1,
strokeColor: '#333',
scale: 12
};
var gMarker = new google.maps.Marker({
map: gmap,
position: latLng,
title: 'Number 123',
icon: mIcon,
label: {color: '#000', fontSize: '12px', fontWeight: '600',
text: '123'}
});
このチュートリアルを見つけました: http://biostall.com/adding-number-or-letters-to-google-maps-api-markers
それは最善の解決策のようには見えませんが、機能します。
マーカーの上にラベルを使用できます ここにGIcon.labelに関するチュートリアルがあります 。
GMarker.openInfoWindow を使用することもできます。
ヒント: これが最良のチュートリアルです GoogleマップAPIについて知りました(もちろん 公式ドキュメント の後)
最も簡単なソリューション:
marker = new google.maps.Marker({
position: my_position,
map: map,
label: num_events+'' //Needs to be a string. No integers allowed
});
https://developers.google.com/maps/documentation/javascript/examples/marker-labels を参照してください
マーカーのレイアウトの詳細な制御については、 Valery Viktorovsky's answer を参照してください。
<hr/>
1. add Google maps script To _Layout page.<br/>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"> </script >
<hr/>
2. Add script to your view page.
<script type="text/javascript" ><br/>
var mapLocation = [['Lucknow', 26.74561, 80.859375],<br/>
['New Delhi', 28.613459, 77.695313],<br/>
['Jaipur', 26.980829, 75.849609],<br/>
['Ahmedabad', 22.674847, 72.333984],<br/>
['Mumbai', 18.760713, 73.015135]];<br/>
$(document).ready(function () { initialize(); });
//ビューで初期化ロードデフォルトマップ
function initialize() {<br/>
var latLng = new google.maps.LatLng(22.917923, 76.992188);<br/>
var myOptions = { center: latLng, zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
};<br/>
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
setMarker(map, mapLocation);
}
function setMarker(map, mapLoc) {
for (i = 0; i < mapLoc.length; i++) {
var loca = mapLoc[i];
var myLanLat = new google.maps.LatLng(loca[1], loca[2]);
var marker = new google.maps.Marker({
position: myLanLat,
icon:'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld='+ ( i + 1) +'|FF776B|000000',
shadow:'https://chart.googleapis.com/chart?chst=d_map_pin_shadow',
map: map,
tittle: loca[0],
zIndex: loca[3]
});
}
}
上記のリンク( ' http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=1|FE6256|0000 ')は、SSL経由では使用できません。番号画像をローカルで生成して保存するには:
for i in {1..99}; do curl -o ./${i}_map_icon.png "http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=${i}|FE6256|000000"; echo $i; done
while creating marker use the
<script>
var marker = new google.maps.Marker({
position: myLanLat,
icon:'icon: 'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld='+ (position) +'|FF776B|000000',
map: map,
});
<script>
最善の解決策は、リモートまたはローカルの画像とテキストをURLを介してサーバー側のスクリプトに渡すことです。マーカーをプロットするとき、このURLをアイコンの値として使用します。サーバー側のスクリプトは、提供された画像のコピーを返します(サーバーに保存されることはありません)。したがって、カスタムマーカー画像に数値またはテキストをマップにドロップすると、それらをリアルタイムでレンダリングできます。
これを行う方法に関するチュートリアルが私のブログにあります。 - http://www.devinrolsen.com/google-maps-marker-icons-with-numbers-using-php-Gd/