[TypeScript]Turf.jsを使って座標間の距離を計算する
CX事業本部の吉川@広島です。
案件で座標間の距離を計算する必要がありTurf.jsを利用しました。
Turf.js | Advanced geospatial analysis
A modular geospatial engine written in JavaScript
「JavaScriptで書かれたモジュール式の地理空間エンジン」だそうです。
TypeScriptにも対応しています (本記事のサンプルコードはTSで書いていきます) 。
本記事の内容は公式ドキュメント以外に下記も参考にさせて頂きました。
インストール
yarn add @turf/turf
で良いのですが、全機能を使わない場合は必要なモジュールだけインストールすることもできるようです。
今回は距離計算がしたいだけなのでこの@turf/distanceのみインストールします。
yarn add @turf/distance
東京と大阪の距離を計算
早速使ってみましょう。
定番どころで東京-大阪間を計算してみました。
東京、大阪といっても漠然としているため、東京都庁と大阪府庁のそれぞれの座標をGoogleMapで取得しました。
import distance from '@turf/distance' import { point } from '@turf/helpers' const tokyo = point([139.69198077115493, 35.68978025468156]) // 東京都庁 const osaka = point([135.51980022509665, 34.6865543538711]) // 大阪府庁 const result = distance(tokyo, osaka, { units: 'kilometers' }) console.log(result) // => 395.1818245563336
395.1818245563336
と出ました。
GoogleMapでも直線距離を見てみたところ、
両者約395kmですね。
かなり正確そうです。
注意点 (?)
注意点なのかはわからないですが、このライブラリでは point
関数を呼び出す時に「経度、緯度」の順の配列で引数を渡します。
ここ、個人的には「緯度、経度」の順番なんですよね (伝わります?) 。
サンプルコードを書くだけでも数回間違えて逆にして渡してしまったので、例えばTypeScriptなら、
// distance-calculator.ts import distance from '@turf/distance' import { point } from '@turf/helpers' // 座標 export interface Coordinate { latitude: number // 緯度 longitude: number // 経度 } export const calcDistance = (a: Coordinate, b: Coordinate): number => distance(point([a.longitude, a.latitude]), point([b.longitude, b.latitude]), { units: 'kilometers', })
このように座標型とラッパー関数を用意してあげると間違いにくいのかなと思います。
以下、使い方の例です。
// main.ts import {Coordinate, calcDistance} from '/path/to/distance-calculator' const tokyo: Coordinate = { latitude: 35.68978025468156, longitude: 139.69198077115493, } const osaka: Coordinate = { latitude: 34.6865543538711, longitude: 135.51980022509665, } console.log(calcDistance(tokyo, osaka)) // => 395.1818245563336
まあ、これはこれで私は「あれ、latitudeとlongitudeってどっちがどうだっけ」となっちゃうんですけどね。