🐥

turfを使った地理分析

2023/04/07に公開

指定ポイントが含まれるか booleanPointInPolygon

大阪城が大阪市内にあって京都市内にはないことを判定します。

  • 市町村の区域データとして、気象庁防災情報発表区域データセットを用います。

https://geoshape.ex.nii.ac.jp/jma/resource/AreaInformationCity_river/2710000.html

  • 例えば大阪市のgeoJsonは以下のような構造になっています。
{
  type:"FeatureCollection",
  features
    0:{
      type:"Feature",
      properties:{},
      geometry:{
	type:"MultiPolygon",
	coordinates:{
	  0:[],
	  1:[],
	  2:[]
	},
}
  • booleanPointInPolygonは、引数としてpointとmultipolygonを取ります。
  • pointは[経度,緯度]です。逆にしないよう注意!
  • geoJsonについて、このままだとbooleanPointInPolygonに入れられないので、coordinateの部分だけを抽出してpolygonを作成します。
const multipolygon = turf.multiPolygon(geoJson.features[0].geometry.coordinates)
  • こうすることで形式がPolygon型になり、booleanPointInPolygonに入れられるようになります。
サンプルコード
import * as turf from '@turf/turf';
import axios from 'axios'


(async()=>{
    const 大阪城 = [135.52591441330773,34.68741122774438]
    const 大阪城point = turf.point(大阪城)

    const 大阪市 = 'https://geoshape.ex.nii.ac.jp/jma/resource/AreaInformationCity_river/20190508/2710000.geojson'
    const {data:大阪市geoJson} = await axios.get(大阪市)
    const 大阪市multipolygon = turf.multiPolygon(大阪市geoJson.features[0].geometry.coordinates);
    const is大阪城in大阪市 = turf.booleanPointInPolygon(大阪城point,大阪市multipolygon)    
    console.log(is大阪城in大阪市)    

    const 京都市 = 'https://geoshape.ex.nii.ac.jp/jma/resource/AreaInformationCity_river/20190508/2610000.geojson'
    const {data:京都市geoJson} = await axios.get(京都市)
    const 京都市multipolygon = turf.multiPolygon(京都市geoJson.features[0].geometry.coordinates);
    const is大阪城in京都市 = turf.booleanPointInPolygon(大阪城point,京都市multipolygon) 
    console.log(is大阪城in京都市)
})()

Discussion