【GeoJSON】【JavaScript】ドーナツ状の多角形から中の穴を除去する

 地図上の図形ができた後に穴を埋めたくなることがしばしばあります。この埋めたい穴とは次図の様な領域の中にある小さな穴のことです。

 これはGeoJSONの仕様を知ると案外シンプルに消す方法に行き当たります。実際の多角形とドーナツ上の図形についての定義は次の文書にあります。

RFC 7946 – The GeoJSON Format 日本語訳
RFC 7946 – The GeoJSON Format#3.1.6

o For Polygons with more than one of these rings, the first MUST be the exterior ring, and any others MUST be interior rings. The exterior ring bounds the surface, and the interior rings (if present) bound holes within the surface.

o これらのリングが複数あるポリゴンの場合、最初のリングは外部リングでなければならず、その他のリングは内部リングでなければなりません。外部リングはサーフェスの境界を設定し、内部リング(存在する場合)はサーフェス内の穴をバインドします。

 要するに次です。ドーナツ状の多角形の外郭を表すのは最初の多角形の頂点であり、内部リングは2つ目以降になるということです。

{
    "type": "Polygon",
    "coordinates": [
        // ↓の最初の座標配列がもっとも外側
        [[137.69751062271393,34.72222808879731],[137.69757058993417,34.72199643278675],[137.6993276294453,34.720621269912286],[137.70067089514652,34.721789420482665],[137.69891385563545,34.723184279080314],[137.69751062271393,34.72222808879731]],
        // その他のリングである↓は内部の穴を定義する多角形
        [[137.69926766222682,34.72229709259015],[137.69862601298547,34.72188799783487],[137.69929764585407,34.72148875882593],[137.69988457011783,34.72201597562278],[137.69962671107703,34.7223117065157],[137.69926766222682,34.72229709259015]]
    ]
}

 これを考慮すると次のようにして穴である内部リングを削除したGeoJSONを得られます。

const geoJson = getGeoJson(); // どこかからGeoJSONを取って来る
geoJson.coordinates = [geoJson.coordinates[0]]; // 0番インデックスのみの配列として再定義する

 多角形を定義する座標配列を削るだけです。冒頭のGeoJSONにこれを適用すると次のようになり、無事内部リングが削除されます。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG