Leaflet.Editable
を使用して描画した図形を、geoJson
として保存したが、保存したgeoJson
をLeaflet.Editable
に取り込む時に引っかかった点があるためまとめる。
保存したgeoJson
は以下のようなものとする。
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
139.761372,
35.694623
],
[
139.743776,
35.694623
],
[
139.743776,
35.677239
],
[
139.761372,
35.677239
],
[
139.761372,
35.694623
]
]
]
}
}
失敗例
geoJson
のgeometry typeがpolygon
のため、leaflet側ではL.polygon
として扱おうと思ったが、geoJson
のフォーマットと、leafletの各種図形の型は緯度・経度のペアの順序が違うため、単純に読み込めない。
// オブジェクトの作成はできるが、座標がおかしくなる
var polygon = L.polygon(geoJsonData.geometry.coordinates);
これを解決するには、自前で全ての座標に対して緯度・経度の順序を反転させる必要がある。
参考 : https://gis.stackexchange.com/questions/234460/how-to-convert-geojson-to-polygon-in-leaflet
成功例
leafletはgeoJson
フォーマット自体の入出力には対応しているため、geoJson
オブジェクトとして読み込めば正しく扱うことはできる。
// 正常
var geoJsonLayer = L.geoJSON(geoJsonData);
調べた所、Leaflet.Editable
はgeoJson
レイヤーの編集には対応しており、各レイヤーに対してenableEdit
メソッドを呼び出せば編集可能に設定ができる。
leafletの地図を描画し、geoJson
データを読み込んで編集可能とするサンプルは以下の通り。
// 地図を表示
var map = L.map("map", {editable: true}).setView([38.258595, 137.6850225], 5);
var tileLayer = L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
attribution: "© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors"
});
map.addLayer(tileLayer);
// geoJsonレイヤーを作成
var geoJsonLayer = L.geoJSON(geoJsonData, {
onEachFeature: function(feature, layer){
layer
.on("dblclick", L.DomEvent.stop)
.on("dblclick", layer.toggleEdit);
}
});
// 先に地図へ追加する
geoJsonLayer.addTo(map);
// レイヤーを編集可能に設定
geoJsonLayer.getLayers().forEach(l => l.enableEdit());
leaflet 1.6.0
とLeaflet.Editable 1.2.0
の組み合わせでは、enableEdit
メソッドを呼び出す前にレイヤーが地図に追加されていないとエラーが発生するため、geoJsonLayer.addTo(map);
を先に実行している。