Open3

GeoJSONとS2ライブラリの型の相互変換

taitotaito

やりたいこと

GeoJSONのGeometry ObjectS2のBasicTypeの相互変換を実装したい。

背景

将来、位置情報を使って何か面白いものを作りたい。そのための下調べ。と言っておきますが、単に興味本位。

taitotaito

GeoJSONのGeometry Object

GeoJSONのGeometry Objectは下記2つのメンバー変数を持つ。

  • type Geometry Objectの種類を表す。PointMultiPointLineStringMultiLineStringPolygonMultiPolygonのどれか(今回、GeometryCollectionAntimeridian Cuttingは省略する)。
  • coordinates Geometry Objectの形状を表す。typeによって、coordinatesの構造が変わる。各type毎のcoordinatesの構造を以下にまとめている。

Position

coordinatesはpositionから成る。coordinatesの構造を理解するためには、まず、positionについて知っておかなければならない。

positionは数値の配列であり、1番目の要素が経度(longitude)、2番目の要素が緯度(latitude)、3番目の要素が高さ(Altitude or elevation)を表す。1番目と2番目の要素は必須だが、3番目の要素は無くても良い。

Point

1つの点を表す。
coordinatesは1つのposition。

{
    "coordinates": [
        139.2252505891504,
        36.87450423989017
    ],
    "type": "Point"
}

MultiPoint

複数の点を表す。
coordinatesはpositionの配列。

{
    "coordinates": [
        [
            139.2252505891504,
            36.87450423989017
        ],
        [
            139.4339908235243,
            35.85270780588118
        ]
    ],
    "type": "MultiPoint"
}

LineString

LineStringとは、複数の点を直線で結んだ形状を表す。
coordinatesはpositionの配列。配列の要素数は2以上であること。

{
    "coordinates": [
        [
            139.2252505891504,
            36.87450423989017
        ],
        [
            139.4339908235243,
            35.85270780588118
        ],
        [
            140.18106113602482,
            36.51774036324987
        ]
    ],
    "type": "LineString"
}

MultiLineString

MultiLineStringは、複数のLineStringを表す。
coordinatesはMultiLineStringのcoordinatesの配列。

{
    "coordinates": [
        [
            [
                139.2252505891504,
                36.87450423989017
            ],
            [
                139.4339908235243,
                35.85270780588118
            ],
            [
                140.18106113602482,
                36.51774036324987
            ]
        ],
        [
            [
                138.7418521516492,
                36.605984088352415
            ],
            [
                138.91763340165,
                35.82598921342728
            ],
            [
                139.7196353547742,
                35.817081016298985
            ]
        ]
    ],
    "type": "MultiLineString"
}

Polygon

Polygonは、穴(hole)を許容する多角形を表す。
coordinatesはLinearRingの配列。

Polygonの定義を説明するために、便宜上、LinearRingという概念を導入する。

LinearRingとは、閉じたLineStringである。すなわち、LinearRingは要素数が4以上、かつ、最初と最後のpositionが完全一致するような配列である。

LinearRingを構成している閉じたLineStringが反時計回りだった場合、そのLinearRingは多角形の境界線を表し、これをExterior LinearRingと呼ぶ。時計回りだった場合、そのLinearRingは多角形の内部の穴(hole)を表し、これをInternal LinearRingと呼ぶ。

Exterior LinearRingは1つ、Interior LinearRingは0つ以上。

{
    "coordinates": [
        [ // Exterior LinearRing
            [
                138.90786956233563,
                35.958781448386446
            ],
            [
                139.5830168311299,
                35.85544007270424
            ],
            [
                139.35708172149396,
                36.37079498343334
            ],
            [
                138.90786956233563,
                35.958781448386446
            ]
        ],
        [ // Interior LinearRing
            [
                139.38780492053928,
                36.12939098003574
            ],
            [
                139.2839193383033,
                36.03735006219149
            ],
            [
                139.23159178577072,
                36.12441855053096
            ],
            [
                139.38780492053928,
                36.12939098003574
            ]
        ],
        [ // Interior LinearRing
            [
                139.05998819437463,
                35.99689264314922
            ],
            [
                139.114624315402,
                36.05788203280136
            ],
            [
                139.1677213907675,
                35.99751522226953
            ],
            [
                139.05998819437463,
                35.99689264314922
            ]
        ]
    ],
    "type": "Polygon"
}

MultiPolygon

MultiPolygonは、複数のPolygonを表す。
coordinatesはPolygonのcoordinatesの配列。

taitotaito

S2のBasicType

S2は幾何図形の計算処理の実装を提供するライブラリである。単位球面上の幾何図形に強みがある。なぜなら、GISを実装することを目的として作られているため。

Point