ハバーサイン距離の仕組みや数式、Python・PostGISでの実装方法から、球面モデルと楕円体モデルの違い、GeographicLibやH3を活用した高速・高精度な位置情報処理までを解説。距離計算を実務へ導入する際の精度と性能の判断基準を整理します。
はじめに:ハバーサイン距離とは(直観と数式)
ハバーサイン距離とは、緯度・経度で表された2地点の間の距離を、地球を球体とみなして計算する方法です。より正確には、球面上における2点間の大円距離を求めるためにハバーサイン公式を利用します。
基本となる式は次のとおりです。
a=sin2(Δφ2)+cosφ1cosφ2sin2(Δλ2)a=\sin^2\left(\frac{\Delta\varphi}{2}\right) +\cos\varphi_1\cos\varphi_2 \sin^2\left(\frac{\Delta\lambda}{2}\right)
c=2atan2(a,1−a)c=2\operatorname{atan2}(\sqrt{a},\sqrt{1-a})
d=Rcd=R c
ここで、φ\varphiは緯度、λ\lambdaは経度、RRは地球の半径です。一般的な近似計算では6371km前後の半径が使われますが、アプリケーションによって採用する値は統一しておく必要があります。
重要なのは、ハバーサイン距離が「地図上の直線距離」でも「道路を実際に移動する距離」でもないことです。あくまで地球表面上の2地点を結ぶ最短の大円弧を球面モデルで近似した距離です。そのため、店舗検索や位置情報サービスなどでは非常に使いやすい一方、車の走行距離や測量のような用途では別の計算方法が必要になります。
なぜハバーサイン公式が使われるのか
緯度・経度から距離を求める方法としては、球面余弦定理もあります。しかし2地点が非常に近い場合、角度が小さくなることで浮動小数点数の丸め誤差が問題になることがあります。
ハバーサイン公式では、角度差の半分の正弦の二乗を利用するため、小さな距離を計算するときにも比較的安定しています。この性質から、近傍検索や位置情報アプリケーションなど、膨大な数の地点を繰り返し比較する用途で現在も利用価値があります。
ただし、「ハバーサインだから高精度」という意味ではありません。数値計算として安定していても、地球を球体と仮定していることによるモデル誤差は残ります。ここを「計算誤差」と「モデル誤差」に分けて考えることが、実務では重要です。
Pythonでハバーサイン距離を計算する
Pythonでは標準ライブラリだけでも簡単に実装できます。
import math
def haversine(lat1, lon1, lat2, lon2, R=6371008.8):
phi1 = math.radians(lat1)
phi2 = math.radians(lat2)
dphi = math.radians(lat2 - lat1)
dlambda = math.radians(lon2 - lon1)
a = (
math.sin(dphi / 2) ** 2
+ math.cos(phi1)
* math.cos(phi2)
* math.sin(dlambda / 2) ** 2
)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
return R * c
例えば東京駅と大阪駅の緯度・経度を入力すれば、両地点間の球面距離をメートル単位で取得できます。
実装時に最も多い問題は、緯度・経度を度のまま三角関数へ渡してしまうことです。Pythonのsin()やcos()はラジアンを受け取るため、必ず変換します。また、戻り値をメートルで扱うのかキロメートルで扱うのか、地球半径を何にするのかも仕様として明文化しておくと、システム間の距離値が食い違う問題を防げます。
PostGISでは球面距離と測地距離を使い分ける
地理情報をデータベースで扱う場合、PostGISには距離計算のための複数の選択肢があります。
例えばST_DistanceSphere()は球面モデルによる距離をメートルで返します。高速な近似計算が必要な場合に適しています。一方、ST_Distance()でgeography型を使用すると、デフォルトでは楕円体モデルによる測地線距離を計算できます。より高速な球面計算を選択することも可能です。
つまり、現在のPostGISでは「ハバーサインを自前実装するか」という選択だけでなく、データ型と関数によって球面・楕円体の計算方式を選択できます。
大量の店舗から「10km以内の店舗」を検索するような処理では、空間インデックスなどで候補を先に絞り込み、その後に必要な精度の距離計算を行う設計が有効です。最初から全レコードに高精度計算を適用するより、検索対象を減らしてから精密計算するほうが、データ量の増加に対応しやすくなります。
ハバーサイン、投影座標、楕円体測地線はどう使い分ける?
距離計算で重要なのは、「どのアルゴリズムが最も優れているか」ではなく、「何を距離と定義するのか」です。
市街地などの限定された範囲で、数十メートル程度の距離関係を扱うのであれば、適切な投影座標系へ変換して平面距離として計算する方法も有力です。日本国内であれば、用途や地域に応じて平面直角座標系などを検討できます。
Webサービスの店舗検索やユーザー周辺検索など、緯度・経度を直接扱う一般的な用途では、ハバーサインや球面距離計算で十分な場合があります。
一方、広域の測地計算、境界付近の厳密な距離比較、測量・GISなどで高い精度が必要なら、地球を回転楕円体として扱う測地線計算を選択します。
ここで注意したいのが、道路距離との違いです。東京駅から大阪駅までの「地球表面に沿った最短距離」と、実際に自動車や鉄道が移動する距離は同じではありません。後者を求めるには道路ネットワークや経路探索エンジンが必要です。
VincentyとGeographicLibの違い
楕円体上の測地線距離を求める代表的な手法としてVincenty法があります。高精度な計算に利用されてきた一方、2地点がほぼ正反対に位置するケースでは、逆測地問題の反復計算が収束しない場合があります。
現在、高精度な汎用計算を考える場合には、Karneyのアルゴリズムを実装したGeographicLibが重要な選択肢です。GeographicLibのPython版は2025年8月に2.1がリリースされており、WGS84楕円体を標準的に利用できます。
例えば次のように距離を求められます。
from geographiclib.geodesic import Geodesic
result = Geodesic.WGS84.Inverse(
35.681236, 139.767125,
34.702485, 135.495951
)
distance_m = result["s12"]
print(distance_m)
GeographicLibのKarneyアルゴリズムは、地球上の楕円体に対して丸め誤差レベルの精度を目標として設計されており、公式ドキュメントでは距離誤差が15ナノメートル未満と説明されています。また、逆測地問題について常に解を求められることも特徴です。
もちろん、実際の測位データそのものがセンチメートル精度を持っていなければ、計算アルゴリズムだけを高精度にしても実世界の位置精度が向上するわけではありません。入力データの品質と計算モデルの精度は分けて考える必要があります。
大規模データでは「距離計算より候補削減」が重要
数百万、数千万件の位置情報を毎回すべて比較する場合、ハバーサインを高速化するだけでは限界があります。
実務では、まず空間インデックスによって候補を絞り込み、その後に距離計算を行う構成が効果的です。Geohash、S2、H3などの空間インデックスは、このような用途で利用できます。
特にH3は世界を階層的な六角形セルへ分割し、緯度・経度をセルIDへ変換できます。現在のH3 4.xではlatLngToCellなどのAPIが提供されており、周辺セルを候補として取得してから厳密な距離計算を行う設計が可能です。
例えば「ユーザーから5km以内の店舗」を検索する場合、最初にH3などで近傍候補を取得し、最後にハバーサインや楕円体距離で正確な境界判定を行う、という二段階構成にすると、大量データでもスケールさせやすくなります。
Pythonで大量の座標を処理する場合にはNumPyなどによるベクトル化も有効です。さらに店舗や拠点など位置が変わらないデータなら、頻繁に参照される距離をキャッシュしておく方法もあります。
ハバーサイン距離で起きやすい落とし穴
最も基本的な問題は、緯度・経度の順序を間違えることです。一般的な表記では緯度、経度の順ですが、GISやGeoJSON、SQLでは経度、緯度の順を採用するケースがあります。
次に、度とラジアンの混同があります。さらに地球半径の違いも結果へ影響します。例えばPostGISのST_DistanceSphere()では既定値として6371008mが使われますが、自前実装で6371000mなど別の値を採用すれば結果は完全には一致しません。
また、±180度付近の経度差にも注意が必要です。単純に経度を引き算するだけでは、日付変更線をまたぐ2地点の差を正しく扱えない場合があります。
そして最大の落とし穴は、直線距離と移動距離を混同することです。配送、タクシー、ナビゲーションなどでは、ハバーサイン距離はあくまで候補抽出や概算値として使い、最終的な移動距離には道路ネットワークを利用する必要があります。
実務での選択基準
ハバーサイン距離は、現在でも「古いだけのアルゴリズム」ではありません。球面上の近距離・近傍検索を低コストで計算するという明確な役割があります。
一般的なWebアプリや位置情報サービスであれば、ハバーサインまたはPostGISの球面距離を利用し、必要に応じて楕円体距離へ切り替える構成が現実的です。
地域限定の高精度な距離計算では、適切な投影座標系を利用する方法を検討します。広域かつ高精度な測地計算では、WGS84楕円体を利用するGeographicLibのような実装が適しています。
さらに大量データを扱う場合は、アルゴリズムそのものよりも「候補をどう減らすか」が性能を左右します。H3、S2、Geohashなどによる空間インデックスと距離計算を組み合わせることで、精度と性能の両立が可能になります。
まとめ
ハバーサイン距離の最大の価値は、緯度・経度から2地点間の球面距離をシンプルかつ安定して求められることです。一方で、地球を球体として近似する以上、楕円体モデルとの違いは避けられません。
したがって、実務では「ハバーサインかGeographicLibか」という二択で考えるのではなく、要求精度、対象範囲、データ量、レスポンスタイム、そして「直線的な地表距離なのか、実際の移動距離なのか」を整理することが重要です。
近傍検索ならハバーサインや球面距離、高精度な測地計算なら楕円体モデル、地域限定なら投影座標系、道路上の移動距離ならルーティングエンジンというように役割を分ければ、過剰な計算コストを避けながら、必要な精度を確保できます。
位置情報システムの設計では、距離計算の式そのものよりも、「どの距離を、どの精度で、どれだけ大量に求めるのか」を先に定義することが、最も重要な判断基準になります。

