なぜshapefileをGeoJSONに変換するのか
「shapefileをGeoJSONに変換するにはどうすればいいか」と考えたことがあるなら、簡単に言うと、shapefileはそもそも単一のファイルではありません。多くの人が「shapefile」と呼ぶものは、実際には同じ名前で拡張子が異なる少なくとも3つの別々のファイルの束です。ジオメトリ用の`.shp`、そのジオメトリへの位置インデックス用の`.shx`、属性テーブル用の`.dbf`です。実際のshapefileエクスポートでは、座標参照系のための`.prj`ファイルや文字エンコーディングのための`.cpg`ファイルが追加されることもよくあります。`.shp`ファイルだけをテキストエディタで開くとバイナリのノイズが表示され、`.dbf`だけを開くと紐付けるべき形状のない属性だけが表示されます。
一方でGeoJSONは、単一の仕様(RFC 7946)によって定義された、それ自体で完結する1つのJSONファイルであり、座標参照系はWGS84の経度・緯度に固定されています。この単一ファイル・単一CRSという設計こそが、多くのWebマップ、JavaScriptライブラリ、最新のGIS APIがshapefileの束ではなくGeoJSONを入力として期待する理由です。shapefileをgeojsonに変換することは、データセットをLeaflet、Mapbox GL、GitHubでレンダリングされる地図プレビュー、あるいはほぼすべてのブラウザベースの地図ツールに読み込ませる前の最初のステップになるのが普通です。
このツールは、その最初のステップを面倒なくすために存在します。GDALをインストールしたり、デスクトップGISソフトウェアを開いたり、1つのファイルを変換するためだけにPythonスクリプトを書いたりする代わりに、`.shp` / `.shx` / `.dbf`(そして持っていれば`.prj`も)をまとめてZIP化し、ブラウザにそのZIPをドロップするだけで、数クリックで動作する`.geojson`ファイルが手に入ります。変換はすべてクライアント側で行われるため、10個の地物でも10万個の地物でも同じように動作し、あなたのデータがどこかに送信されることは一切ありません。
Shapefileフォーマット:歴史と構造
shapefileフォーマットは、1998年7月にESRI(Environmental Systems Research Institute)によって「ESRI Shapefile Technical Description」という文書で公開されました。ほぼ30年前のフォーマットであり、10文字を超える属性フィールド名、1ファイルあたり複数のジオメトリレイヤー、デフォルトでのUnicodeサポートといった機能がネイティブには存在しないにもかかわらず、より新しいフォーマットが登場する以前に非常に早く、そして徹底的に採用されたことから、政府機関、公共事業、学術分野のデータセットにおいて今なお世界で最も広く使われているベクターGISフォーマットの1つです。
.shpファイルは固定100バイトのヘッダーから始まります。バイト0-3はビッグエンディアンの「ファイルコード」で常に整数9994、バイト24-27はファイル長をビッグエンディアンの16ビットワード単位で示し、バイト28-31はリトルエンディアンのshapefileバージョン(常に1000)、バイト32-35はシェイプタイプを整数コードで示します(1=Point、3=PolyLine、5=Polygon、8=MultiPoint、Z値・M値のバリアントには+10または+20が加算されます)、そしてバイト36-67はファイル全体のバウンディングボックスを4つのリトルエンディアンdoubleで示します:Xmin, Ymin, Xmax, Ymax。このヘッダーの後、ファイルは可変長レコードの連続となり、各レコードにはジオメトリ本体のバイト列の前に、レコード番号とコンテンツ長を示す小さな独自のヘッダーが付いています。
.dbfファイルはdBase III / dBase IV形式のテーブルです。各フィールド(名前、型、バイト長、小数点桁数)を記述するヘッダーブロックの後に、1行につき1つの固定幅レコードが続きます。.dbf内の行の順序は、.shpファイル内のレコード順序と位置単位で正確に一致します。両者の間には明示的な外部キーが存在しないためです。.shxファイルは純粋にショートカットとして存在し、レコードごとに(オフセット, 長さ)の8バイトペアを格納することで、リーダーが先行するすべてのレコードをスキャンすることなく任意の形状に直接ジャンプできるようにします。これは小さなshapefileよりも500MBのshapefileにおいてはるかに重要になります。
ある構造上の特異点が、変換ロジックに直接影響します。shapefileのポリゴンレコードには「このリングはあのリングの中の穴である」という概念が一切ありません。単に閉じたリングのフラットなリストにすぎません。(仕様による)慣例では、時計回りのリングは外側の境界、反時計回りのリングは穴を表すとされており、リーダーはどの穴がどの外側リングに属するかを自分で判断することが求められます。GeoJSONのポリゴンも同じ巻き方向の慣例に従います(RFC 7946は同じ規則を推奨していますが、厳密には義務付けていません)が、Shapefile→GeoJSON変換ツールは、有効なPolygonまたはMultiPolygonジオメトリを出力する前に、それでもすべてのリングを走査し、分類し、入れ子構造を再構築する必要があります。
ステップバイステップガイド:shpをgeojsonに変換する方法

`.shp`、`.shx`、`.dbf`ファイルをまとめてZIP化し(持っていれば`.prj`も含めてください)、変換ツールでそのZIPファイルを選択するか、「Try sample」をクリックして小さな用意済みのサンプルshapefileを読み込みます。shapefileはすぐに解析され、灰色の「Source shapefile」レイヤーとして地図上にプレビュー表示されます。

Layersパネルには、地物数とともに元のshapefileが一覧表示されます。地図で正しいデータが読み込まれたか確認し、準備ができたら「Convert to GeoJSON」をクリックしてください。

元のレイヤーの上に「Converted GeoJSON」という2つ目のレイヤーが追加され、サマリーが表示されます。変換された地物の数、見つかったジオメトリタイプ、バウンディングボックス、属性列、そして結果のGeoJSONファイルサイズです。

Layersパネルのチェックボックスを使うと、元のレイヤーと変換後のレイヤーを個別に表示・非表示にできます。両方の背景に街路地図が欲しい場合は「Show basemap」をオンにしてください。

「Download converted.geojson」をクリックして、完成した標準準拠のGeoJSONファイルをコンピューターに保存します。
6つの実際のユースケース
shapefileをgeojsonに変換する作業が、日々のGIS業務で実際にどこで登場するか。
- 行政のオープンデータをWeb上で公開する。 多くの市区町村、都道府県、国のオープンデータポータルは、依然として地番、ゾーニング、境界データセットをshapefileとして配布しています。shapefileをgeojsonに変換することで、そのダウンロードデータをWebマップやJavaScriptアプリがサーバー側処理なしに直接読み込めるものに変えられます。
- 測量データや現地データをWebマップに読み込む。 現場のGPS機器や従来型のデスクトップGISワークフローは、しばしばshapefileをエクスポートします。素早いshp to geojson変換は、測量士の出力から共有可能なLeafletやMapbox GLの地図までの、唯一の橋渡しになることが多いです。
- GitHubやGitLabの地図プレビュー用にデータを準備する。 GitHubは`.geojson`ファイルを自動的にインタラクティブな地図として描画しますが、shapefileはまったく描画しません。コミット前にshapefileを変換しておくことが、レンダリングされた地図と4つの読めないバイナリファイルがリポジトリに残ることの分かれ目になります。
- JavaScriptの地図ライブラリにデータを渡す。 Leaflet、Mapbox GL JS、OpenLayers、deck.glはすべてネイティブにGeoJSONを扱います。いずれもブラウザ内で直接shapefileを読み込むことはできないため、shapefileデータから始まるクライアント側の地図パイプラインでは、shp to geojson converterが必須のステップになります。
- 古いGISアーカイブを最新フォーマットへ移行する。 古いデスクトップGISシステムを廃止する組織は、往々にして何年分ものshapefileアーカイブを抱えています。GeoJSONはほぼすべての最新ツールで読み込めるため、shapefileをgeojsonに変換すること(あるいはさらにGeoParquetやGeoPackageへ)が、通常は移行の最初のステップになります。
- デスクトップGISをインストールせずに素早く単発チェックする。 誰かからメールで送られてきた`.shp`ファイルの中身をちょっと見たいだけ、ということもあります。GeoJSONに変換して地図上でプレビューするほうが、たった1つのファイルのためにQGISやArcGISをインストールするより速いです。
変換アルゴリズムをステップごとに解説
shapefileをGeoJSONに変換することは、単一の操作ではなく、明確に定義された解析とジオメトリ再構築のステップからなる小さなパイプラインです。ここでは、あなたのデータに実際に何が起こるかを順を追って説明します。
1. 解凍して一致するファイルセットを見つける
アップロードされた.zipはメモリ上で展開され、変換ツールは共通のベース名でファイルをグループ化し、一致する.shp / .shx / .dbfの三つ組(さらにオプションの.prjと.cpg)を見つけます。ZIPにそのような三つ組が複数含まれている場合、マルチレイヤーのshapefileエクスポートとして扱われ、各レイヤーが個別に変換されます。
2. 固定100バイトの`.shp`ヘッダーを解析する
まずヘッダーを読み取り、ファイルコードが9994であることを確認し、次に来るべきレコード構造をパーサーに伝えるシェイプタイプを読み取り、ファイルレベルのバウンディングボックスを読み取ります。変換に関係するフィールドのレイアウトは次のとおりです:
Bytes 0-3 File code big-endian int, always 9994 Bytes 24-27 File length big-endian int, in 16-bit words Bytes 28-31 Version little-endian int, always 1000 Bytes 32-35 Shape type little-endian int (1=Point, 3=PolyLine, 5=Polygon, 8=MultiPoint) Bytes 36-67 Bounding box 4 little-endian doubles: Xmin, Ymin, Xmax, Ymax
バイト100以降はすべて可変長レコードのストリームとして読み取られ、各レコードには独自の小さなヘッダーが付いており、レコード番号とコンテンツ長を16ビットワード単位で示します。これは2倍することでバイト数に変換されます。
3. リングをPolygonおよびMultiPolygonジオメトリに再構築する
Polygon型のレコードでは、レコード内のすべてのリングが(x, y)ペアのフラットな配列として読み取られます。次に変換ツールは、シューレース公式(靴ひも公式)を使って各リングの符号付き面積を計算します:area = 0.5 * Σ(x[i] * y[i+1] - x[i+1] * y[i])。結果が正(shapefileの時計回り正の慣例において)であれば外側リングを示し、負であれば穴を示します。各穴リングは、それを完全に含む最小の外側リングと照合され、両者は1つのGeoJSON Polygonのcoordinates配列にまとめられます。外側リングが最初に、その後にすべての穴リングが続きます。1つのレコードに複数の外側リングが含まれる場合、結果はMultiPolygonになります。
4. 座標を再投影し、属性を紐付ける
.prjファイルが存在し、その座標参照系がすでにWGS84でない場合、前のステップで生成されたすべての座標ペアはWGS84の経度・緯度に再投影されます。これはRFC 7946が有効なGeoJSONに要求する座標系だからです。並行して.dbfテーブルがフィールドごとに解析され、.dbfのレコードiは、.shpファイルのレコードiから構築されたジオメトリのpropertiesオブジェクトとして紐付けられます。2つのファイルは明示的なキーではなく純粋に位置によって照合されるためです。
最後のステップでは、変換された各ジオメトリとそのプロパティをGeoJSONのFeatureにまとめ、すべての地物を1つのFeatureCollectionに集約し、その構造をテキストにシリアライズして.geojsonファイルとしてダウンロードできる状態にします。上記の各ステップはすべて決定論的で明確に定義された変換であるため、同じshapefileを2回変換しても常にバイト単位で同一のGeoJSON出力が得られます。
shapefile変換を支えるGISライブラリ
shp to geojson converterの品質は、その裏にあるshapefileパーサー次第です。ここでは、このツールをはじめとして実際に処理を行っているものを紹介します。
- shpjs: このツールを支えるエンジンです。shpjsは純粋なJavaScriptライブラリで、アーカイブを解凍し、バイナリの`.shp`ジオメトリと`.dbf`属性テーブルを解析し、`.prj`データが存在する場合は座標を再投影し、結果をGeoJSONに組み立てます。すべてブラウザやNode.jsプロセスの外に出ることなく行われます。
- GDAL / OGR(ogr2ogr): ほとんどのデスクトップおよびサーバーサイドGISソフトウェアの基盤となっているC/C++ライブラリです。コマンド`ogr2ogr -f GeoJSON output.geojson input.shp`は、コマンドラインからshapefileをgeojsonに変換する事実上の標準的な方法であり、QGISの「Export Features」ダイアログを使うときに内部で呼び出されているのと同じエンジンです。
- FionaとGeoPandas: Pythonの地理空間ファイルI/Oスタックです。FionaはGDAL/OGRを直接ラップし、GeoPandasはFionaの上に構築されているため、`gpd.read_file('data.shp')`の後に`gdf.to_file('data.geojson', driver='GeoJSON')`を実行するのは、開発者がデータパイプライン内でshapefileをgeojsonに変換する最も一般的な方法の1つです。
- Mapshaper: Matthew Bloch氏による、コマンドラインおよびブラウザベースで広く使われているツールで、独自のパーサーでshapefileを読み取り、変換と同時にジオメトリを簡略化できます。Webマップにとってshapefileが詳細すぎる場合に、変換と簡略化を一度の処理で行いたいときに便利です。
- QGISとArcGIS: どちらのデスクトップGISアプリケーションもshapefileをネイティブに開き、メニュー操作でGeoJSONとしてエクスポートできます。QGISの「Export Features」やArcGISの「Feature Class to GeoJSON」などの類似ツールで、どちらもユーザーインターフェースの裏でGDAL/OGRまたは同等のライブラリを呼び出しています。
これらのツールはすべて、同じshapefile仕様と同じGeoJSON出力フォーマットに準拠しているため、どのツールで変換したファイルも構造的には同等になるはずです。実務上の違いは処理がどこで行われるかにあります。GDAL、Fiona、デスクトップGISソフトウェアはすべて何かがインストールされたマシン上で動作しますが、このツールのshpjsベースのエンジンはブラウザのタブ内で直接動作します。だからこそ、ここではインストールもサーバーへのファイルアップロードも一切不要なのです。
技術的な質問と回答
shapefileをGeoJSONに変換する方法について、よくある10個の質問に直接答えます。
1. shapefileをGeoJSONに変換するにはどうすればいいですか?
.shp、.shx、.dbfファイル(持っていれば.prjも)を1つの.zipアーカイブにまとめ、そのZIPをこの変換ツールにアップロードし、「Convert to GeoJSON」をクリックしてください。ツールはshapefileのバイナリジオメトリを読み取り、属性テーブルと照合し、すぐにダウンロードできる標準準拠の.geojsonファイルを生成します。すべてブラウザ内で完結します。
2. なぜこのツールは.shpファイルを直接ではなくZIPファイルを要求するのですか?
.shpファイル単体にはジオメトリしか含まれておらず、属性がなく、そして重要なことに、各形状が実際に何を表しているかを説明するフィールドもありません。有効なshapefileは一緒に読み込む必要がある少なくとも3つのファイル(.shp、.shx、.dbf)のセットであるため、他のあらゆるshp to geojson converterと同様、このツールもすべてを同時に必要とします。ZIPは一致したファイルセットを渡す最もシンプルな方法です。
3. このshp to geojson変換は無料ですか?ファイルサイズの上限はありますか?
はい、完全無料で登録も不要です。人為的なファイルサイズの上限はありませんが、非常に大きなshapefile(数百MB)は、すべての処理がサーバーではなくあなた自身の端末で行われるため、解析に時間がかかります。
4. 変換で属性データは保持されますか?
はい。.dbfテーブルのすべてのフィールドが読み取られ、対応する地物にGeoJSONのpropertiesオブジェクトとして紐付けられます。数値、テキスト、日付を含むフィールド名と値がそのまま保持されます。
5. 座標参照系はどうなりますか?
ZIPに.prjファイルが含まれている場合、変換ツールはそこに記述された座標参照系を読み取ります。GeoJSONはRFC 7946に従い常にWGS84の経度・緯度であるため、元のshapefileが(各国の座標系グリッドでよくあるように)別の投影法を使っている場合、変換時に座標がWGS84へ再投影されます。.prjファイルが存在しない場合、座標はすでにWGS84であるとみなされます。
6. 穴のあるPolygon型のshapefileも正しく処理できますか?
はい。shapefileのポリゴンレコードは、明示的な親子関係のないフラットなリストとしてリングを保存しており、外側の境界と穴を区別するためにリングの巻き方向に依存しています。変換ツールは各リングの符号付き面積によって分類し、穴を正しい親リングに再割り当てして、適切なGeoJSONのPolygonまたはMultiPolygonジオメトリを出力します。
7. どのジオメトリタイプがサポートされていますか?
Point、MultiPoint、PolyLine(LineStringまたはMultiLineStringに変換)、Polygon(PolygonまたはMultiPolygonに変換)で、それぞれのZ(標高)およびM(測定値)バリアントも含まれます。Null型のレコードは変換すべきジオメトリを持たないためスキップされます。
8. 複数レイヤーを持つshapefileも変換できますか?
1つの.shpファイルは常にちょうど1つのジオメトリレイヤーを保持します。そのためZIPに複数の.shpファイル(マルチレイヤーのエクスポート)が含まれている場合、それぞれが個別に変換され、結果の中で明確にラベル付けされるため、どの地物が元のどのshapefileに由来するかが分かります。
9. なぜ変換後に一部のテキスト属性が文字化けすることがあるのですか?
.dbfフォーマットは特定のコードページ(文字エンコーディング)でテキストを保存しますが、古いshapefileには、それがどのコードページかを示す.cpgファイルが含まれていないことがよくあります。エンコーディングが宣言されていない場合、変換ツールは一般的なデフォルトにフォールバックします。元のデータが珍しい地域固有のエンコーディングを使っていた場合、変換後にアクセント付き文字を手動で修正する必要があるかもしれません。
10. 私のshapefileはサーバーにアップロードされますか?
いいえ。アーカイブの展開、バイナリの.shpジオメトリの解析、.dbf属性テーブルの読み取り、最終的なGeoJSONの組み立てまで、すべてJavaScriptを使ってブラウザ内でローカルに行われます。あなたのファイルが端末から出ていくことは一切ありません。
変換はshpjsを使ってブラウザ内で完全に実行されます。ファイルがサーバーにアップロードされることは一切ありません。 Map tiles © OpenStreetMap contributors.
