GeoJSONとS2ライブラリの型の相互変換
やりたいこと
GeoJSONのGeometry ObjectとS2のBasicTypeの相互変換を実装したい。
背景
将来、位置情報を使って何か面白いものを作りたい。そのための下調べ。と言っておきますが、単に興味本位。
GeoJSONのGeometry Object
GeoJSONのGeometry Objectは下記2つのメンバー変数を持つ。
-
type
Geometry Objectの種類を表す。Point
、MultiPoint
、LineString
、MultiLineString
、Polygon
、MultiPolygon
のどれか(今回、GeometryCollection
、Antimeridian 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の配列。
S2のBasicType
S2は幾何図形の計算処理の実装を提供するライブラリである。単位球面上の幾何図形に強みがある。なぜなら、GISを実装することを目的として作られているため。