PostgreSQLで緯度経度指定の2点間の距離を求める関数を作りました。
実際には以下のサイトのPHPコードを移植したものです。
緯度経度より距離を求める方法・備忘録 | 地球は丸い!
※ 残念ながら現在サイトが閉鎖されてしまいましたのでインターネットアーカイブへのリンクです。
コード(plpgsql)
CREATE OR REPLACE FUNCTION latlon_to_dist(lat1 float,lon1 float,lat2 float,lon2 float) RETURNS float AS $$
-- 2地点間の距離を求める (Km)
-- lat1,lon1:地点1の緯度,経度
-- lat2,lon2:地点2の緯度,経度
DECLARE diffLatitudeRad float;
DECLARE diffLongitudeRad float;
DECLARE r float;
DECLARE diffLatitudeKm float;
DECLARE diffLongitudeKm float;
BEGIN
diffLatitudeRad := (lat1-lat2) * pi()/ 180.0; -- 緯度差(RADIAN)
diffLongitudeRad := (lon1-lon2) * pi() / 180.0; -- 経度差(RADIAN)
r := 6378.137; -- 地球の半径
diffLatitudeKm = diffLatitudeRad * r;
diffLongitudeKm = cos( lon1*pi()/180.0) * r * diffLongitudeRad ; -- 緯度方向の距離(Km)
RETURN sqrt(diffLatitudeKm*diffLatitudeKm + diffLongitudeKm*diffLongitudeKm); -- 2地点間の距離(Km)
END;
$$ LANGUAGE plpgsql;
利用例
select latlon_to_dist(35,139,36,140);
--
139.464554992979
(緯度:35,経度:139)から(緯度:36,経度:140)までの距離を求めています。
結果は139.464554992979Kmとなりました。