OSMデータを使った距離計算
OSMデータの性質
OSMのノードには緯度経度が定義されています。
この緯度経度はWGS84座標系という主にGPSの運用に用いられている測地系を利用しています。
ここから距離計算を行うために3つの選択肢があります。
ユークリッド距離
(x2 - x1)^2 + (y2 - y1)^2 の平方根を利用して、座標を単純に平面とみなして計算する方法
局所的な距離(数百m〜数km)の計算で、PostGISなどで ST_Distance(geometry, geometry) を使う場合にはユークリッド距離で計算している。
Geometry型(平面の場合)
code:Geometry
SELECT ST_Distance(
ST_GeomFromText('POINT(137.726 34.703)', 4326)::geometry,
ST_GeomFromText('POINT(137.731 34.705)', 4326)::geometry
);
球面距離
地球を球(または楕円体)として扱い、Haversine公式などで計算。
実装や説明などは上のリンクで詳しく説明しているので気になった人は是非
都市間距離や経度差が大きい場合に球面距離を利用するのは必須。
Geography型(地球上の場合)
code:Geography
SELECT ST_Distance(
ST_GeogFromText('SRID=4326;POINT(137.726 34.703)'),
ST_GeogFromText('SRID=4326;POINT(137.731 34.705)')
);
経路距離
OSMのwayやrelationをグラフとして使い、経路を求めることが出来る。
実際のルート検索やナビゲーションを作るときには必須。
code:Route
import osmnx as ox
# 地図データを取得(3km範囲)
G = ox.graph_from_point((34.703, 137.726), dist=3000, network_type='walk')
# 出発点と到着点を設定
orig = ox.distance.nearest_nodes(G, 137.726, 34.703)
dest = ox.distance.nearest_nodes(G, 137.731, 34.705)
# 経路(最短距離)を計算
route = ox.shortest_path(G, orig, dest, weight='length')
length_m = sum(ox.utils_graph.get_route_edge_attributes(G, route, 'length'))
print(f"経路距離: {length_m:.1f} m")
network_type = '交通手段'
この部分をdriveに変えると車道での距離になる
PostGISを使った方法もあるので気になった人は調べてみてください。