添加到特定纬度/经度位置的距离

时间:2013-11-19 18:44:56

标签: ruby-on-rails-4 postgis rails-geocoder geokit rgeo

Rails 4 + Postgres。地理空间新手。很高兴接受涉及RGeo,Geokit,Geocoder或任何其他有助于解决此问题的宝石的解决方案。

模型包含两个字段latitudelongitude

我有offset属性,其中包含以米为单位的距离和orientation属性,其中包含4个基本方向之一(N,E,W,S)。

实施例: offset: 525.5 orientation: W

offset距离加到lat-long位置的标准方法是什么?为了给我一个新的lat-long对作为距离加法的结果?

2 个答案:

答案 0 :(得分:2)

对于几百米的小偏差:

您可以通过以下方式处理N& S方向:

R * (lat1-lat2)= NorthSouth distance

其中R是地球半径(6335km)。

您可以通过以下方式处理E& W方向:

R * cos(lat)* (lon1-lon2) = EastWest distance.

对不起,我不会说Ruby,但翻译这个伪代码应该很容易:

R=6335000         // This is in metres
PI=3.14159265     // Your compiler may have a better constant/macro
if(orientation is North or orientation is South)
  x = offset * 180 / (PI * R)
  if(orientation is South)
     x = -x
  endif
  newLatitude = latitude + x
else
  x = offset * 180 / (PI * R * cos(lat))
  if(orientation is West)
     x = -x
  endif
  newLongitude = longitude + x
endif

答案 1 :(得分:0)

需要花一点时间进行挖掘,结果发现有一个奇异的库函数(考虑曲率,几何,投影,位置和数学假设),它有助于增加特定曲面位置的距离。

功能:ST_Project

在下面使用:

SELECT ST_AsGeoJSON(ST_Project('POINT(longitude latitude)'::geography, offset, radians(orientation)))

它来自PostGIS,因此可用于Ruby / Rails,虽然尚未作为本机Ruby对象(宝石尚未包装它),但作为PostGIS查询。

offset以米为单位。 orientation以度为单位('N'= 0,'E'= 90等)

希望这个解决方案可以帮助其他人寻找同样的事情。