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);を先に実行している。