dayjournal memo

Total 975 articles!!

Leaflet #024 – ベクトルを作図

Yasunori Kirimoto's avatar

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;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: '&amp;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を実行すると下記のようにブラウザで表示されます。左上に作図コントロールが表示されます。 leaflet_024_01


各コントロールで、任意でライン・ポリゴン・マーカーを作図することが可能になります。 leaflet_024_02


作図したベクトルは、編集したり削除することも可能です。

leaflet_024_03

レイヤーグループ作成:


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);
})


book

Q&A