半径40km圏内を探せ

はじめに

特定の位置から、定められた距離内にある市町村を抽出してみましょう。

ジオグラフィを引数に取ることができる関数でも挙げている通り、ジオグラフィ型を引数に取れるので、今回はジオグラフィ型を使います。

ただし、ここで「距離内にある」という表現ではあいまいであることに注意して下さい。一部でも範囲内に含まれる市町村を抽出する場合があったり、全体が範囲内に含まれる市町村を抽出する場合があったりします。

下準備

シェープファイルのデータをインポートしてみよう コマンドライン編t1があるものとします。

シェープファイルのデータをインポートしてみよう GUI編でインポートした場合には、以下のt1t2に読み替えてください。

少しでも40km圏内にかかる市町村を抽出する

今回は東経133度、北緯34.5度の点から40km圏内にかかる市町村を抽出します。

指定距離内にあるかどうかは、ジオグラフィ型を引数に取るST_DWithin(A,B,C)を使います。この関数は、返り値に真偽値をとり、ジオグラフィAとジオグラフィBとの距離がCメートル以内ならTRUEを、そうでないならFALSEを返します。WHERE句などの条件式で使うと良いでしょう。

ジオグラフィを引数に取る場合には、距離の単位はメートルです。

db=# SELECT * FROM t1 WHERE ST_DWithin(geom, 'SRID=4612;POINT(133 34.5)'::GEOGRAPHY, 40000);  

結構な行になるので、とりあえずビューにしてみましょう。

db=# CREATE VIEW v_r40 AS SELECT * FROM t1 WHERE ST_DWithin(geom, 'SRID=4612;POINT(133 34.5)'::GEOGRAPHY, 40000);  

上記ビューと東経133度、北緯34.5度の点とを重ねると、次のようになります。

40km円との関係

40km円と重ね合わせてみます。次のクエリで、統計133度、北緯34.5度の点から40kmの円は次のようになります。


db=# SELECT ST_Buffer('SRID=4612;POINT(133 34.5)'::GEOGRAPHY, 40000);  
0103000020E610000001000000210000003FFADDC5EFAD6040E387E43DD04041401B0ECF04B6AD6040E82EFA8CCB374140CE8E0FA8F5AC604044224E74182F4140A7B20C5FB6AB60402B501E470C27414075F241A304AA604004B852C4F51F414049EAE335F1A76040825B7D201A1A4140A737017890A560404CD83171B21541406CFCE6A3F9A26040BE3E1F90E91241406A7F11EF45A06040FD9EC187DA114140D548379C8F9D6040F6579E968F1241404D2D1E05F19A60405450ECD0011541406216F2A38398604031C0616319194140613CCC235F966040D647BB74AE1E41408DFF008098946040FAAE809E8A254140C53E9F3941936040B3B2A5F06A2D4140B41745AA669260409A6EFA6E02364140E77AFD7A1192604082F201F3FC3E414030242E45459260402001CE58024841405432A362009360409A490DDAB9504140132A6CF03B946040B569BA77CD58414056827C06EC956040D8E20651ED5F4140315EDB2300986040918377C5D265414071E8B6CC639A60402A83F040436A4140BD000E55FF9C6040C6E4D992126D4140668A0CD0B89F604076CEA7B5246E4140F930EB1975A26040DF27DDF16E6D4140315D62F018A56040932CD14EF86A4140B6EBBD0C8AA760407F27AE4BD9664140DFCF7B32B0A960406A3FBAE33A614140DF0B202676AB604008CC65E9545A414082557581CAAC604004133ECB6B524140500C9D5CA0AD604043D642DCCD4941403FFADDC5EFAD6040E387E43DD0404140  

さきほどの地図と重ねてみます。

ここから分かる通り、ST_DWithin()は、円に少しでもかかっていればTRUEを返します。言い換えると、二つのジオグラフィ間の距離の最小値でテストしています。

おわりに

ST_DWithin()で、指定した二つのジオグラフィ間の距離の最小値が指定した距離以内ならTRUEを返すので、それをWHERE句で利用すると、特定のポイントから40km圏内の市町村を抽出することができました。

今回はジオグラフィ型を使っていますが、ジオメトリでも使えます。ジオメトリを引数に取る場合には、デカルト距離を取り、単位は、そのジオメトリの空間参照系の単位となります。

出典

この記事では、国土交通省国土政策局「国土数値情報(行政区域)」を使用しました。

本記事のライセンス


この記事は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。