10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PostgreSQLで緯度経度指定の2点間の距離を求める関数※地球を平面と仮定した式なので近距離用

Last updated at Posted at 2016-10-22

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となりました。

10
9
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?