GeoJSONは、すべての現代Web地図が読めるJSONベースのフォーマットです。Leaflet地図にポリゴンを描いたこと、MapLibreでベクタレイヤをスタイリングしたこと、PostGISにサービスエリアを保存したことがあるなら、ファイル拡張子が違っていてもGeoJSONを扱ってきたはずです。
このガイドでは、GeoJSONとは実際に何か、ジオメトリタイプの意味、実システムでの登場箇所、GeoJSONファイルが開発者のラップトップを離れて本番環境に当たったときにチームを噛むトラップについて解説します。
GeoJSONの本質
GeoJSONは地理データ構造をエンコードするためのオープンフォーマットで、2016年にIETFによってRFC 7946として標準化されました。JSONの厳密な部分集合であり、すべてのGeoJSON文書は有効なJSONですが、仕様は許可されるキー、ジオメトリの構造、座標の順序に関するルールを追加します。
フォーマットは意図的に小さく作られています。仕様全体でトップレベルのオブジェクト型は9つしかなく、有能な開発者はそれらすべてを頭に入れられます。その小ささこそ、GeoJSONがWebマッピングのリンガフランカになった理由です。読みやすく、書きやすく、検証しやすいのです。
座標は常に[longitude, latitude](オプションで第3の値として高度)として書かれ、座標参照系はWGS84に固定されています。これはあなたのスマホのGPSが使うのと同じデータムです。交渉なし、投影メタデータなし、軸順序の議論なし。1つのデータム、1つの順序、どこでも。
ジオメトリタイプ
GeoJSONは7つのジオメトリタイプを定義します。最初の3つはプリミティブです:
- Point: 単一の座標。ピン、住所、個別センサーに使用
- LineString: 2つ以上の座標の順序付きリスト。ルート、道路、河川に使用
- Polygon: 閉じた座標リング(最初と最後の点が同一)。建物、区画、行政境界に使用
次の3つは、それらプリミティブの単なるコレクションです:
- MultiPoint: 1つのジオメトリ内の複数点。店舗チェーンを単一フィーチャとして表現するのに有用
- MultiLineString: 複数のLineString。分断されたルートや河川系に使用
- MultiPolygon: 複数のポリゴン。島を持つ国(つまりほとんどすべての国)に正しい選択
7番目のGeometryCollectionは、上記いずれかの混合を保持できます。仕様はこれを推奨せず、消費者の多くがうまく扱えず、ほぼ必要になることはありません。GeometryCollectionに手を伸ばすときは、通常モデルがFeatureCollectionになりたがっているサインです。
FeatureとFeatureCollection
ジオメトリ単独で有用なことはほとんどありません。それが何を表すかを知る必要があります。それがFeatureの役目です。Featureはジオメトリを、任意のメタデータを保持するpropertiesオブジェクトで包みます。
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [4.8952, 52.3702]
},
"properties": {
"name": "Amsterdam Centraal",
"type": "station",
"platforms": 15
}
}
FeatureCollectionはFeatureのリストです。実環境で出会うほとんどの実GeoJSONファイルはFeatureCollectionです。実データセットには多くのものが含まれているからです。
決定的な設計選択は、propertiesがオープンであることです。仕様はそこにどんなキーが含まれるべきか、それらの値の型がどうあるべきかについて何も言いません。それはバグではなく機能です。GeoJSONがフォーマットを拡張せずに、街路設備、選挙区境界、配送ゾーン、AIS船舶トラックに対応できるという意味です。同時に、消費者は注意が必要です。properties.populationが存在することに依存するなら、自分で検証してください。RFC 7946はそれを保証しません。
GeoJSONの活用シーン
注意して見れば、GeoJSONは地理空間スタックのあらゆるところにあります:
- 地図ライブラリ: MapLibre GL、Mapbox GL、Leaflet、OpenLayersはすべてGeoJSONをレイヤのデータソースとしてネイティブに消費します
- ベクタタイルパイプライン: TippecanoeのようなツールはGeoJSONを取り込みMVT(Mapbox Vector Tile)セットを出力します
- 地図スタイル仕様: MapLibreが使用するMapbox Style Specificationは、GeoJSONをファーストクラスのソースタイプとして参照します
- 空間データベース: PostGIS、BigQuery GIS、Snowflakeはすべて専用関数でGeoJSONをインポート・エクスポートします
- API出力: 現代のジオコーディング、アイソクロン、ルーティングAPIのほとんどは、結果としてGeoJSON Featureを返すため、レスポンスをそのまま地図にドロップできます
- ルートポリライン: ナビゲーションレスポンスは通常、レンダリング可能なLineStringジオメトリをルートとして含みます
- データ共有: オープンデータポータル、OpenStreetMapエクスポート、政府の境界リリースは、Webユーザーを対象にする場合GeoJSONをデフォルトとします
ツールが何らかの地理空間フォーマットを話せるなら、ほぼ確実にGeoJSONを話せます。
本番環境での落とし穴
GeoJSONは初日には寛容で90日目には不寛容です。チームを捕らえる罠:
経度が先。RFC 7946は順序を[lon, lat]に固定しています。人間、住所、ほとんどの文書はlat, lonと書きます。これらを入れ替えるのが最も多いGeoJSONバグで、点が間違った海洋に着地します。
ポリゴンの巻き方向。RFC 7946は外側リングが反時計回り、内側リング(穴)が時計回りでなければならないと規定しています。古いGeoJSONファイルの多くはこれを無視します。一部のレンダラは気にしませんが、別の(特にantimeridianを横断するポリゴンを持つMapbox GL)はポリゴンを意図の逆としてレンダリングします。小さな島が、世界の残り全部を覆う海洋の穴になります。
Antimeridianの扱い。180/-180子午線を横断するジオメトリは、仕様に従って分割される必要があります。太平洋を横切る素朴なポリゴンは、地球を反対回りに包む細い帯としてレンダリングされます。
WGS84以外のCRSのネイティブサポートなし。RFC 7946は古いcrsメンバを意図的に削除しました。データが国家グリッド(British National Grid、RD New、EPSG:3857)にある場合、シリアライズ前にWGS84に再投影する必要があります。WGS84以外のGeoJSONを発行するツールは技術的に非準拠です。
ファイルサイズ。数百万の詳細ポリゴンを持つFeatureCollectionはギガバイト級に膨張する可能性があります。ブラウザ配信ではベクタタイルに切り替えるか、Douglas-Peuckerでジオメトリを単純化するか、改行区切りGeoJSON(.ndjson)でストリーミングしてください。
バリデーション。GeoJSONLintやgeojson-validationライブラリのようなリンタをCIで使ってください。ビルド時に無効な巻き方向や入れ替わった座標を捕まえる方が、顧客チケットから捕まえるより安価です。
MapAtlasのGeoJSON
GeoJSONはMapAtlasプラットフォーム全体でデフォルトのデータ交換フォーマットです。Dynamic Maps製品はカスタムオーバーレイ、スタイリング、インタラクティブレイヤ向けにGeoJSONソースを直接受け入れ、前処理は不要です。
Geocoding APIはマッチした住所をGeoJSON Featureとして返すため、フォワードジオコード結果をそのまま地図にドロップしたり、フィールドを再マッピングせずにPostGISに保存したりできます。Isochrone APIは到達時間エリアをGeoJSONポリゴンとして返すため、「15分以内に到達可能な場所」のクエリは1回のfetchと1回のaddSource呼び出しで画面に表示できます。
GeoJSONは派手ではありません。固定座標順序と少数のジオメトリタイプを持つ、小さく意見の強いJSONの部分集合です。しかし、空間データベースから地図キャンバスまで、現代の位置情報スタックの各層が、場所とは何かについて合意できるようにするフォーマットです。経度の順序を正しくし、巻き方向を検証すれば、スタックの残りはおおむね自動的に処理されます。
よくある質問
GeoJSONとは何ですか?
GeoJSONは地理データをエンコードするためのJSONベースのオープンフォーマットで、IETFのRFC 7946として標準化されています。少数のジオメトリタイプ(Point、LineString、Polygonとそのmultiバリアント)と、ジオメトリを任意のプロパティで包むFeatureおよびFeatureCollectionオブジェクトを定義します。座標は常にWGS84データムで経度・緯度の順に書かれており、これは現代のすべてのWeb地図ライブラリが期待する形式です。
GeoJSONとJSONの違いは何ですか?
GeoJSONは追加ルールを持つJSONの厳密な部分集合です。すべてのGeoJSON文書は有効なJSONですが、すべてのJSON文書が有効なGeoJSONというわけではありません。仕様はトップレベルのオブジェクト型、ジオメトリオブジェクトの構造、座標順序(経度が先)、座標参照系(WGS84)を固定します。これらのルールから外れたものは、地理データを含むだけの単なるJSONです。
shapefileやKMLではなくGeoJSONを使うべきなのはいつですか?
データがWebスタックを流れる必要があるとき、つまりAPI、ブラウザ、PostGISのようなデータベース、MapLibre、Leaflet、Mapbox GL、OpenLayersのいずれかを通る必要があるときは、常にGeoJSONを使ってください。shapefileはデスクトップGISでは依然一般的ですが、4つ以上のファイルとして配布され、1990年代のバイナリフォーマットを使います。KMLはGoogle Earthには良いですが、冗長でXMLベースです。JSON APIに触れるあらゆる用途ではGeoJSONが勝ちます。
なぜGeoJSONの座標は経度が先なのですか?
RFC 7946は順序を経度、緯度、オプションの高度と固定しています。これはほとんどのグラフィックスとGISシステムで使われるx, y, z慣習に一致します。人間が座標を書く方法(51.5, -0.1のように緯度が先)の逆であり、GeoJSONを手書きするときに最も多いバグです。2つの値を入れ替えると点は反対の半球に着地します。GeoJSONでは常に経度を先に書いてください。

