この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「国が無料で公開している地理データを、自社のシステムで使えないか」。中小企業の現場支援をしていると、こういう相談を受けることがあります。たとえば配送エリアの判定、店舗から一定距離内の施設抽出、ハザード情報の重ね合わせ。これらは、わざわざ高価なGISパッケージを買わなくても、手元のLinuxサーバーとMySQLだけでかなりのところまで実現できます。
鍵になるのが、国土交通省が公開しているオープンデータと、MySQLの空間データ型です。私は20年以上Linuxサーバーの運用に携わってきましたが、地理データを「専門家だけのもの」と身構える管理者がまだ多いと感じます。本記事では、国交省のGeoJSONデータをMySQLに取り込み、距離計算や領域判定を実務で回すまでの道筋を、現役管理者の目線で整理します。あわせて、ここでハマる人が後を絶たない座標軸の落とし穴も解説します。
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
国交省オープンデータ「国土数値情報」とは
国土交通省は「国土数値情報ダウンロードサイト」(nlftp.mlit.go.jp)で、地形・土地利用・公共施設・交通・災害リスク・都市計画・地価といった国土に関する基礎データを、無償で公開しています。運営は国土交通省の地理空間情報課です。
実務上ありがたいのは、ユーザー登録なしで利用できる点です。データ形式はシェープファイル形式・GML形式・GeoJSON形式があり、一部はCSV形式でも提供されています。GeoJSON形式での提供は2016年から始まっており、行政区域や河川などのデータセットを目的に応じてダウンロードできます。
GeoJSONはJSONをベースにした地理データの記述形式で、テキストとして中身を確認できます。バイナリのシェープファイルと違い、Linuxのコマンドラインからcatやjqでそのまま覗けるのは、サーバー管理者にとって扱いやすい長所です。
MySQLの空間データ型とGeoJSON連携
MySQL 8.0は、地理空間データを扱うための関数を標準で備えています。専用の拡張を入れなくても、GeoJSONの取り込みから距離計算、領域判定までを素のMySQLで実行できます。実務で押さえておきたい関数は次のとおりです。
まず取り込みと書き出しです。ST_GeomFromGeoJSON() はGeoJSONオブジェクトからMySQLのジオメトリ型を生成します。逆に ST_AsGeoJSON() はジオメトリ型からGeoJSONを書き出します。国交省のGeoJSONをそのまま ST_GeomFromGeoJSON() に渡せば、テーブルのジオメトリ列に格納できます。
次に距離と関係の判定です。ST_Distance_Sphere() は地球を球面とみなして2点間の最短距離をメートルで返します。緯度経度で「○○から半径5km以内」を出すような用途はこれが基本です。領域の包含判定には ST_Contains() と ST_Within() を使います。ST_Within() は ST_Contains() の引数を入れ替えた関係で、「ある地点が行政区域ポリゴンの中に入っているか」といった判定に向きます。
そして座標系を識別する ST_SRID() です。SRIDは空間参照系のIDで、緯度経度の世界標準であるWGS 84はSRID 4326に対応します。国交省データもWeb地図系のデータも、基本はこの4326で扱うことになります。
PR
空間情報や全文検索を含めてMySQL 8.0を体系的に押さえられる定番書です。本記事の関数を実務で安定して使うには、インデックス設計や文字コードの土台も併せて固めておくと安心です。
取り込みから距離計算までの実務フロー
実際の流れはシンプルです。国交省サイトから対象地域のGeoJSONをダウンロードし、Linuxサーバーに置きます。テーブルにジオメトリ列を用意し、GeoJSONの各フィーチャを ST_GeomFromGeoJSON() で変換して挿入します。緯度経度で扱う以上、列にはSRID 4326を指定しておくのが定石です。
格納できたら、あとはSQLで問い合わせるだけです。たとえば、ある拠点の座標を基準に、登録済みの施設点群との距離を ST_Distance_Sphere() で計算し、しきい値以下のものだけを抽出すれば「近隣施設リスト」ができます。行政区域ポリゴンを入れておけば、ST_Within() で「この住所はどの区域に属するか」を判定できます。
パフォーマンスの観点では、ジオメトリ列に空間インデックス(SPATIAL INDEX)を張れる点も実務で効いてきます。点数が増えても、領域判定や近傍検索をインデックスで絞り込めるため、アプリ側で全件ループを書くより圧倒的に速く、保守も楽になります。
つまずきやすい落とし穴:座標軸の順序
ここが本記事で一番伝えたい実務の勘所です。MySQL 8.0でSRID 4326を使うと、座標軸の順序で必ずと言っていいほどハマります。
SRID 4326(WGS 84)の空間参照系の定義は、第1軸が緯度(Lat)、第2軸が経度(Lon)です。つまりSRSの定義に従うと「緯度・経度」の順になります。ところが、GeoJSONやWeb地図系のツールの多くは「経度・緯度」の順で座標を並べます。この食い違いを意識せずに取り込むと、東京を指したつもりの点が見当違いの場所に飛ぶ、という事故が起きます。
MySQLはこの問題に対応するため、ST_GeomFromText や ST_GeomFromGeoJSON 系の関数で軸順序を指定するオプションを用意しています。指定できる値は「lat-long」「long-lat」「srid-defined」で、既定はSRSの定義に従う「srid-defined」です。GeoJSONは経度・緯度の順なので、取り込み時の軸順序の扱いを明示的に合わせておくのが安全です。
もう1点、公式ドキュメントが注意しているのが、軸順序はあくまで入出力(インポート・エクスポート)の話で、MySQL内部の格納形式は変わらないということです。MySQL 8.0は内部的には第1座標に経度、第2座標に緯度を保持しており、これは5.7時代からの挙動を引き継いでいます。「定義上は緯度が先、でも内部の格納は経度が先」という二重構造を頭に入れておかないと、関数の引数や出力を読み違えます。私自身、ここを軽く見て位置がずれた経験があり、テストデータで既知の座標を1点入れて答え合わせをする手順を必ず挟むようにしています。
現役管理者にとっての教訓
地理データの活用は、専用GISがなければできない特別な仕事ではありません。国交省が無償で出しているGeoJSONと、手元のMySQL 8.0の空間関数を組み合わせれば、Linuxサーバー上で実用的な距離計算や領域判定が回せます。中小企業の現場で「外注前提」と思われていた処理を、内製の選択肢に乗せられるのは大きな価値です。
ただし、座標軸の順序という地味な落とし穴が待っています。SRID 4326は定義上「緯度・経度」、GeoJSONは「経度・緯度」、MySQL内部の格納は「経度・緯度」。この三者のずれを理解し、既知の1点で必ず答え合わせをする。この一手間が、地理データ活用の成否を分けます。まずは自分の住所の座標を1件入れて、正しい区域に判定されるか確かめるところから始めてみてください。
PR
クラウドFinOps 第2版 ―協調的でリアルタイムなクラウド価値の意思決定
オープンデータの内製活用は、外注コストを抑える発想とも地続きです。クラウドや内製のコストをどう可視化して意思決定につなげるか、管理者として一段上の視点を持ちたい方に。
Linuxサーバーの実務スキルを、体系的に身につけませんか?
リナックスマスター.JPでは、現役のLinuxサーバー管理者が、現場でそのまま使える運用ノウハウを発信しています。データベースやオープンデータ活用を含めた実務を、20年以上の現場経験にもとづいて解説しています。最新記事はメールマガジンでお届けしていますので、ぜひご登録ください。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:Linux FoundationがAIコスト標準化財団「Tokenomics Foundation」設立へ|サーバー管理者目線で読む統治構造の意味
- この記事の属するカテゴリ:Linux情報・技術・セキュリティへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます