私はJSとGoogle APIを初めて使用します。複数のマーカーにラベルを付けようとしています。
私が見てきた小さなスニペットから、Google Maps API v3でマーカーにラベルを付ける簡単な方法はありませんでした。 Googleとstackoverflowの検索の間、全員がラベルクラスの作成または編集を含むラウンドアバウト手順を使用しました。
JS/Google API v3を習い始めたばかりなので、簡単に各マーカーにラベルを付ける方法を見つけたいだけです。
ありがとう
編集#3:さて、私はついに何が間違っていたのかを理解し、Lilinaのコードを使用してラベル付きの複数のマーカーを正しく実装しました。どうやら我々は両方ともvarマップを異なって定義し、それ自体が両方のコードをうまく同期させることができません。
各マーカーにラベルを使用できるようになったので、追加の質問があります。ユーザーがいるズームレベルに基づいてマーカーとそのラベルを非表示にできるようにしたい。
私はそれが最も簡単であることを保証することはできませんが、私は MarkerWithLabel が好きです。 基本的な例 に示すように、CSSスタイルはラベルの外観を定義し、JavaScriptのオプションはコンテンツと配置を定義します。
_ .labels {
color: red;
background-color: white;
font-family: "Lucida Grande", "Arial", sans-serif;
font-size: 10px;
font-weight: bold;
text-align: center;
width: 60px;
border: 2px solid black;
white-space: nowrap;
}
_
JavaScript:
_ var marker = new MarkerWithLabel({
position: homeLatLng,
draggable: true,
map: map,
labelContent: "$425K",
labelAnchor: new google.maps.Point(22, 0),
labelClass: "labels", // the CSS class for the label
labelStyle: {opacity: 0.75}
});
_
混乱を招く可能性がある唯一の部分はlabelAnchorです。デフォルトでは、ラベルの左上隅がマーカーの画pinの端点に整列します。 labelAnchorのx値をCSSのwidthプロパティで定義された幅の半分に設定すると、ラベルが中央に配置されます。 new google.maps.Point(22, 50)
のようなアンカーポイントを使用して、ラベルをマーカーのプッシュピンの上に浮かせることができます。
上記のリンクへのアクセスがブロックされている場合、MarkerWithLabelの パックされたソース をコピーして、これに貼り付けました JSFiddle demo 。 JSFiddleが中国で許可されることを望みます:|
マップにラベルを追加するには、カスタムオーバーレイを作成する必要があります。 http://blog.mridey.com/2009/09/label-overlay-example-for-google-maps.html のサンプルでは、カスタムクラスLayer
を使用しています。 Google Maps APIからOverlayView
(MVCObject
を継承)から継承します。彼は、改訂版(可視性、zIndex、クリックイベントのサポートを追加)を持っています。これは、ここで見つけることができます: http://blog.mridey.com/2011/05/label-overlay-example-for-google -maps.html
次のコードは、Marc Rideyのブログ(上記の修正されたリンク)から直接取得したものです。
層クラス
// Define the overlay, derived from google.maps.OverlayView
function Label(opt_options) {
// Initialization
this.setValues(opt_options);
// Label specific
var span = this.span_ = document.createElement('span');
span.style.cssText = 'position: relative; left: -50%; top: -8px; ' +
'white-space: nowrap; border: 1px solid blue; ' +
'padding: 2px; background-color: white';
var div = this.div_ = document.createElement('div');
div.appendChild(span);
div.style.cssText = 'position: absolute; display: none';
};
Label.prototype = new google.maps.OverlayView;
// Implement onAdd
Label.prototype.onAdd = function() {
var pane = this.getPanes().overlayImage;
pane.appendChild(this.div_);
// Ensures the label is redrawn if the text or position is changed.
var me = this;
this.listeners_ = [
google.maps.event.addListener(this, 'position_changed', function() { me.draw(); }),
google.maps.event.addListener(this, 'visible_changed', function() { me.draw(); }),
google.maps.event.addListener(this, 'clickable_changed', function() { me.draw(); }),
google.maps.event.addListener(this, 'text_changed', function() { me.draw(); }),
google.maps.event.addListener(this, 'zindex_changed', function() { me.draw(); }),
google.maps.event.addDomListener(this.div_, 'click', function() {
if (me.get('clickable')) {
google.maps.event.trigger(me, 'click');
}
})
];
};
// Implement onRemove
Label.prototype.onRemove = function() {
this.div_.parentNode.removeChild(this.div_);
// Label is removed from the map, stop updating its position/text.
for (var i = 0, I = this.listeners_.length; i < I; ++i) {
google.maps.event.removeListener(this.listeners_[i]);
}
};
// Implement draw
Label.prototype.draw = function() {
var projection = this.getProjection();
var position = projection.fromLatLngToDivPixel(this.get('position'));
var div = this.div_;
div.style.left = position.x + 'px';
div.style.top = position.y + 'px';
div.style.display = 'block';
this.span_.innerHTML = this.get('text').toString();
};
使用法
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>
Label Overlay Example
</title>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="label.js"></script>
<script type="text/javascript">
var marker;
function initialize() {
var latLng = new google.maps.LatLng(40, -100);
var map = new google.maps.Map(document.getElementById('map_canvas'), {
zoom: 5,
center: latLng,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
marker = new google.maps.Marker({
position: latLng,
draggable: true,
zIndex: 1,
map: map,
optimized: false
});
var label = new Label({
map: map
});
label.bindTo('position', marker);
label.bindTo('text', marker, 'position');
label.bindTo('visible', marker);
label.bindTo('clickable', marker);
label.bindTo('zIndex', marker);
google.maps.event.addListener(marker, 'click', function() { alert('Marker has been clicked'); })
google.maps.event.addListener(label, 'click', function() { alert('Label has been clicked'); })
}
function showHideMarker() {
marker.setVisible(!marker.getVisible());
}
function pinUnpinMarker() {
var draggable = marker.getDraggable();
marker.setDraggable(!draggable);
marker.setClickable(!draggable);
}
</script>
</head>
<body onload="initialize()">
<div id="map_canvas" style="height: 200px; width: 200px"></div>
<button type="button" onclick="showHideMarker();">Show/Hide Marker</button>
<button type="button" onclick="pinUnpinMarker();">Pin/Unpin Marker</button>
</body>
</html>
上記のソリューションはiPad-2では動作しません
最近、マーカーの数が少なくても、マーカーのプロット中にサファリブラウザーのクラッシュの問題が発生しました。最初はマーカーをプロットするためにラベル付きマーカー(markerwithlabel.js)ライブラリを使用していましたが、Googleネイティブマーカーを使用すると、多数のマーカーでもうまく動作しましたが、カスタマイズされたマーカーが必要ですので、上記のソリューションを参照してくださいそれでも多くの調査を行った後、クラッシュの問題は解決しません http://nickjohnson.com/b/google-maps-v3-how-to-quickly-add-many-markers =このブログ、そして今、私の地図検索はipad-2でスムーズに機能しています:)