Leafletでベクトルを作図するためには、既存のAPIでも可能ですが「Leaflet.draw」と言うプラグインがすごく便利です。
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Leaflet Sample</title>
<script src="./Library/leaflet-0.7.3/leaflet.js"></script>
<link href="./Library/leaflet-0.7.3/leaflet.css" rel="stylesheet" />
<script src="http://maps.google.com/maps/api/js?sensor=false&amp;region=JP"></script>
<script src="./plugin/leaflet-plugins-master/layer/tile/Google.js"></script>
<script src="./plugin/Leaflet.draw-master/dist/leaflet.draw.js"></script>
<link href="./plugin/Leaflet.draw-master/dist/leaflet.draw.css" rel="stylesheet" />
<link href="./css/stylesheet.css" rel="stylesheet" />
</head>
<body>
<div id="map"></div>
<script src="./js/script.js"></script>
</body>
</html>
stylesheet.css
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
z-index: 0;
height: 100%;
}
script.js
var t_std = new L.tileLayer('http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {
attribution: "<a href='http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html' target='_blank'>国土地理院</a>"
});
var t_pale = new L.tileLayer('http://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png', {
attribution: "<a href='http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html' target='_blank'>国土地理院</a>"
});
var t_ort = new L.tileLayer('http://cyberjapandata.gsi.go.jp/xyz/ort/{z}/{x}/{y}.jpg', {
attribution: "<a href='http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html' target='_blank'>国土地理院</a>"
});
var o_std = new L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
});
var g_roadmap = new L.Google('ROADMAP');
var g_satellite = new L.Google('SATELLITE');
var g_hybrid = new L.Google('HYBRID');
var map = L.map('map', {
center: [35.6831925, 139.7511307],
zoom: 13,
zoomControl: false,
layers: [o_std]
});
var Map_BaseLayer = {
"地理院地図 標準": t_std,
"地理院地図 淡色": t_pale,
"地理院地図 オルソ": t_ort,
"OpenStreetMap 標準": o_std,
"GoogleMap 標準": g_roadmap,
"GoogleMap オルソ": g_satellite,
"GoogleMap ハイブリッド": g_hybrid
};
L.control.scale({
imperial: false,
maxWidth: 300
}).addTo(map);
L.control.layers(Map_BaseLayer, null, {
collapsed: false
}).addTo(map);
var drawnItems = new L.FeatureGroup();
map.addLayer(drawnItems);
var drawControl = new L.Control.Draw({
edit: {
featureGroup: drawnItems
}
});
map.addControl(drawControl);
map.on('draw:created', function (e) {
var layer = e.layer;
drawnItems.addLayer(layer);
})
index.htmlを実行すると下記のようにブラウザで表示されます。左上に作図コントロールが表示されます。
各コントロールで、任意でライン・ポリゴン・マーカーを作図することが可能になります。
作図したベクトルは、編集したり削除することも可能です。
レイヤーグループ作成:
var drawnItems = new L.FeatureGroup();
map.addLayer(drawnItems)
コントロール追加:
var drawControl = new L.Control.Draw({
edit: {
featureGroup: drawnItems
}
});
map.addControl(drawControl)
ベクトルを保存:
map.on('draw:created', function (e) {
var layer = e.layer;
drawnItems.addLayer(layer);
})
カスタマイズすると色んなことができそうです。
作図するベクトル属性を変更:
var drawControl = new L.Control.Draw({
draw: {
polyline: {
shapeOptions: {
color: 'red',
weight: 50
},
},
polygon: {
shapeOptions: {
color: 'blue'
},
},
},
edit: {
featureGroup: drawnItems
}
});
map.addControl(drawControl)
作図するマーカーにポップアップ追加:
map.on('draw:created', function (e) {
var layer = e.layer;
var type = e.layerType;
if (type === 'marker') {
layer.bindPopup('マーカー作成!!');
}
drawnItems.addLayer(layer);
})
- 参考文献
Leaflet
Leaflet.draw