JavaScript:中心地点から指定された距離の範囲内に別の地点が含まれるかを判断する関数
November 6, 2021
かつて自分が使うために作ったものですが、もし誰かの役にたてばと公開しておきます。
説明 #
経度緯度で指定された中心地点 A から、引数で指定された距離(x)km の範囲内に、経度緯度で指定された地点 B が含まれれば true
を、含まれなければ false
を返します。
関数(TypeScript / JavaScript) #
TypeScript で記載しています。型定義があるのは引数部分のみですので、JavaScript として使いたい場合は引数部分の型を削除してください。
/**
* 中心地点Aから指定された距離の範囲内に地点Bが含まれるかを取得する。
* @param range - 地点Aからの距離(km)
* @param center.lat - 地点Aの緯度
* @param center.lng - 地点Aの経度
* @param target.lat - 地点Bの緯度
* @param target.lng - 地点Bの経度
*/
const isInRange = (
range: number,
center: { lat: number; lng: number },
target: { lat: number; lng: number }
) => {
const R = Math.PI / 180; // 円周率をラジアンRに変換
const lat1 = center.lat * R;
const lng1 = center.lng * R;
const lat2 = target.lat * R;
const lng2 = target.lng * R;
const earthRadius = 6371; // 地球の半径(6,371km)
const distance =
earthRadius *
Math.acos(
Math.cos(lat1) * Math.cos(lat2) * Math.cos(lng1 - lng2) + Math.sin(lat1) * Math.sin(lat2)
);
return distance <= range;
};
実行結果
- 東京タワー(緯度:35.65858404079、経度:139.7454316446)
- 東京スカイツリー(緯度:35.710006892117、経度:139.81081025188)
- 東京タワーから 8km 以内に、東京スカイツリーは含まれているか。
- 東京タワーから 9km 以内に、東京スカイツリーは含まれているか。
const tokyoTower = { lat: 35.65858404079, lng: 139.74543164468 };
const tokyoSkytree = { lat: 35.710006892117, lng: 139.81081025188 };
const result1 = isInRange(8, tokyoTower, tokyoSkytree); // false
const result2 = isInRange(9, tokyoTower, tokyoSkytree); // true
両者は直線距離で約 8.2km 離れているようなので、上記判定結果はあっていそうですね。