[TypeScript]Turf.jsを使って座標間の距離を計算する

2021.01.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CX事業本部の吉川@広島です。

案件で座標間の距離を計算する必要がありTurf.jsを利用しました。

Turf.js | Advanced geospatial analysis

A modular geospatial engine written in JavaScript

「JavaScriptで書かれたモジュール式の地理空間エンジン」だそうです。
TypeScriptにも対応しています (本記事のサンプルコードはTSで書いていきます) 。

本記事の内容は公式ドキュメント以外に下記も参考にさせて頂きました。

Turf.jsを使用して地球上の2点間の距離を計測する

インストール

yarn add @turf/turf

で良いのですが、全機能を使わない場合は必要なモジュールだけインストールすることもできるようです。

@turf/distance

今回は距離計算がしたいだけなのでこの@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ってどっちがどうだっけ」となっちゃうんですけどね。