🌏

海岸線から半径2km以内にある行政区を抽出してみる

2023/11/17に公開

行政区ポリゴンを格納したテーブルを作成する

国土数値情報の行政区域データをPostgreSQLのテーブルに格納します。
元データの座標系はJGD2011ですが、手元にEPSG:4326でジオメトリを保存したテーブルがあったのでこれを使っちゃうことにします。

CREATE TABLE IF NOT EXISTS public.municipality_polygons (
   id SERIAL PRIMARY KEY,
   prefecture_name varchar(10),
   branch_office_name varchar(20),
   counties_and_ordinance_cities varchar(20),
   municipality_name varchar(20),
   municipality_code char(5),
   geom public.geometry(multipolygon, 4326) NOT NULL
);

海岸線のデータを作成する

気象庁の予報区等GISデータの一覧にある津波予報区のshpから、兵庫県瀬戸内海沿岸のデータを使用しQGISで加工しました。
元データの対象範囲が赤穂市~尼崎市と広かったので、今回は結果を見やすくするために尼崎市~明石市以外のラインを削除し、シングルパートの海岸線データを作成しました。

海岸線データの作成手順

  1. 海岸線以外の地物は削除
  2. 尼崎市~明石市のライン以外は削除
  3. EPSG:6673に変換後、ベクタデータを簡素化(許容度500m)
  4. EPSG:4326でgeojsonに保存
加工する前の海岸線

加工後の海岸線

ST_DWithinで海岸線から半径2km以内にある行政区を取得する

海岸線のgeojsonからジオメトリを取得し、ST_DWithinの第二引数に渡します。今回は海岸線から半径2km以内にある行政区を抽出したいので、第三引数には2000を渡しました。

SELECT DISTINCT municipality_name, prefecture_name
FROM municipality_polygons
WHERE ST_DWithin(
	geom::GEOGRAPHY,
	(SELECT ST_GeomFromGeojson('{"type": "LineString", "coordinates": [ [ 135.407297496782121, 34.697100828540442 ], [ 135.391967950860362, 34.680036910375179 ], [ 135.376181114966585, 34.676569441126851 ], [ 135.40089491556796, 34.699262613478886 ], [ 135.377608170880421, 34.692660945746127 ], [ 135.371230830038826, 34.680771946068482 ], [ 135.373754527349661, 34.69301789206213 ], [ 135.368491335906469, 34.696312251709109 ], [ 135.363235927196342, 34.688462063273676 ], [ 135.353904695645269, 34.696816162535924 ], [ 135.363823294209737, 34.705286622379788 ], [ 135.337470311006086, 34.727109027060003 ], [ 135.306154812094974, 34.714482801839893 ], [ 135.291842892235763, 34.72070261293527 ], [ 135.281733230004647, 34.712440252615636 ], [ 135.28797963765021, 34.703985829482519 ], [ 135.227988171616886, 34.700046667619695 ], [ 135.238310610746112, 34.693269999910633 ], [ 135.218903216710146, 34.695493467549575 ], [ 135.202408754660382, 34.678640278526075 ], [ 135.200756057046419, 34.683767414234801 ], [ 135.193137419756226, 34.679422333473958 ], [ 135.193163256379194, 34.685595801605018 ], [ 135.184378053604405, 34.682043494811467 ], [ 135.188745615617677, 34.67086577523537 ], [ 135.177071970295287, 34.668057413718714 ], [ 135.187377588505001, 34.666883053809954 ], [ 135.177412969832744, 34.663844748236613 ], [ 135.183357886057706, 34.64950138717932 ], [ 135.149301893867346, 34.649018000680265 ], [ 135.131556108827453, 34.639524333581157 ], [ 135.110300920950749, 34.641069586492279 ], [ 135.055979883664804, 34.6242207483889 ], [ 135.038364085734088, 34.627460440946663 ], [ 135.018615161560547, 34.643176784381119 ], [ 134.966246641469439, 34.643948891927892 ], [ 134.944680390687495, 34.661737446026393 ] ]}'))::GEOGRAPHY,
	2000
);

SQLの結果がこちら。

結果が正しいか検証

QGISで海岸線から2kmのエリアを描画してみます。
青線が簡素化した海岸線、ピンクが海岸線から2kmのエリア、水色が兵庫県の行政区、緑色が大阪府の行政区です。

海岸線から2kmのエリアのポリゴンレイヤ作成手順
  1. 「海岸線のデータを作成する」の3番目で作成した、EPSG:6673の簡素化済みラインレイヤからバッファを作成(距離は2km)
  2. 兵庫県の行政区ポリゴンレイヤと1のポリゴンレイヤをクリップ
  3. 大阪府の行政区ポリゴンレイヤと1のポリゴンレイヤをクリップ
  4. 2と3のポリゴンレイヤをマージ
  5. 4のポリゴンレイヤをマルチパートに変換

ピンクのポリゴン(海岸線から2kmのエリア)の属性テーブルを確認した結果がこちら。SQLの結果と一致していました。

感想

海岸線のデータさえあれば、思ったより簡単に行政区の抽出ができると分かりました。GISはまだまだ勉強中なので、もっと良い方法がある等の指摘事項がありましたらコメントいただけますと嬉しいです!

レスキューナウテックブログ

Discussion