2015/06/12
OpenLayers 3 のマーカーに文字を表示する方法 2種
Feature を利用する方法
Feature を使用する場合は ol.style.Style に text 属性をつけて実現します。サンプルは以下です。
サンプルでは固定の文字列を表示していますが、Feature 毎に変更する方法もあります。
サンプル
ソースコード
<!DOCTYPE html> <html> <head> <title>Marker Expample</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/ol3/3.6.0/ol.js"></script> </head> <body> <div id="map" style="width:100%; height: 800px;"></div> <script type="text/javascript"> function convertCoordinate(longitude, latitude) { return ol.proj.transform([longitude, latitude], "EPSG:4326","EPSG:900913"); } // デフォルトのスタイル var markerStyleDefault = new ol.style.Style({ image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ { anchor: [0.5, 1], anchorXUnits: 'fraction', anchorYUnits: 'fraction', opacity: 0.75, src: 'marker-red.png' }), text: new ol.style.Text({ fill: new ol.style.Fill({color: "#ff0000"}), stroke: new ol.style.Stroke({color: "#ffffff", width: 2}), scale: 1.6, textAlign: "center", textBaseline: "top", offsetY: 0, text: "DefaultFeature", font: "Courier New, monospace" }) }); // FeatureA に適用するスタイル var markerStyleA = new ol.style.Style({ image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ { anchor: [0.5, 1], anchorXUnits: 'fraction', anchorYUnits: 'fraction', opacity: 0.75, src: 'marker-blue.png' }), text: new ol.style.Text({ fill: new ol.style.Fill({color: "#0000ff"}), stroke: new ol.style.Stroke({color: "#ffffff", width: 2}), scale: 1.6, textAlign: "center", textBaseline: "top", offsetY: 0, text: "FeatureA", font: "Courier New, monospace" }) }); var markerFeatureA = new ol.Feature({ geometry: new ol.geom.Point(convertCoordinate(139.745229, 35.658227)) }); markerFeatureA.setStyle(markerStyleA); var markerFeatureB = new ol.Feature({ geometry: new ol.geom.Point(convertCoordinate(139.744165, 35.658013)) }); var markerFeatureC = new ol.Feature({ geometry: new ol.geom.Point(convertCoordinate(139.744262, 35.659695)) }); // Feature 一覧 を Source にセット var markerSource = new ol.source.Vector({ features: [markerFeatureA, markerFeatureB, markerFeatureC] }); // Source を Layer にセット var markerLayer = new ol.layer.Vector({ source: markerSource, style: markerStyleDefault }); // Open Street Map Layer var osmLayer = new ol.layer.Tile({ source: new ol.source.OSM() }); var map = new ol.Map({ layers: [ osmLayer, markerLayer ], target: document.getElementById('map'), view: new ol.View({ center: convertCoordinate(139.745433, 35.658579), zoom: 18 }) }); </script> </body> </html>
Overlay を使う方法
Overlay を使用する場合、マーカーはHTMLエレメントなので、div
タグ等を使用すれば文字を表示することができます。CSS を適用することも出来るので、既存の技術で装飾等も可能です。
注意点としては、アイコン用の
img
タグとテキスト用のdiv
タグは別の Overlay で表現したほうが良いです。そうしないと、アイコンの表示位置がずれてしまいます。
サンプルでは読みやすさを重視して、愚鈍にアイコンとテキストの Overlay を並べて書いていますが、実際に使用する際にはまとめてオブジェクト化する等の工夫をした方が良いかもしれません。
サンプル
ソースコード
<!DOCTYPE html> <html> <head> <title>Marker Expample</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/ol3/3.6.0/ol.js"></script> </head> <body> <div id="map" style="width:100%; height: 800px;"></div> <script type="text/javascript"> function convertCoordinate(longitude, latitude) { return ol.proj.transform([longitude, latitude], "EPSG:4326","EPSG:900913"); } // Open Street Map Layer var osmLayer = new ol.layer.Tile({ source: new ol.source.OSM() }); var map = new ol.Map({ layers: [ osmLayer ], target: document.getElementById('map'), view: new ol.View({ center: convertCoordinate(139.745433, 35.658579), zoom: 18 }) }); function makeMarkerOverlay(imgSrc, coordinate) { var imgElement = document.createElement('img'); imgElement.setAttribute('src', imgSrc); var markerOverlay = new ol.Overlay({ element: imgElement, position: coordinate, positioning: 'bottom-center' }); return markerOverlay; } function makeTextOverlay(text, coordinate) { var textElement = document.createElement('div'); textElement.innerHTML = text; var markerOverlay = new ol.Overlay({ element: textElement, position: coordinate, positioning: 'top-center' }); return markerOverlay; } var coordinateA = convertCoordinate(139.745229, 35.658227); var markerA = makeMarkerOverlay('marker-blue.png', coordinateA); var textA = makeTextOverlay('MarkerA', coordinateA); var coordinateB = convertCoordinate(139.744165, 35.658013); var markerB = makeMarkerOverlay('marker-red.png', coordinateB); var textB = makeTextOverlay('MarkerB', coordinateB); var coordinateC = convertCoordinate(139.744262, 35.659695); var markerC = makeMarkerOverlay('marker-red.png', coordinateC); var textC = makeTextOverlay('MarkerC', coordinateC); map.addOverlay(markerA); map.addOverlay(textA); map.addOverlay(markerB); map.addOverlay(textB); map.addOverlay(markerC); map.addOverlay(textC); </script> </body> </html>
0 件のコメント:
コメントを投稿