🐥
turfを使った地理分析
指定ポイントが含まれるか 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