Добавить расстояние до определенной широты/долготы

Рельсы 4 + Постгрес. Новое в геопространственных данных. С удовольствием приму решения, включающие RGeo, Geokit, Geocoder или любой другой драгоценный камень, помогающий решить эту проблему.

Модель содержит два поля latitude и longitude.

У меня есть атрибут offset, который содержит расстояние в метрах, и атрибут orientation, который содержит одно из 4 сторон света (N, E, W, S).

Пример: offset: 525.5 orientation: W

Каков стандартный способ добавления расстояния offset к позиции широта-долгота, чтобы получить новую пару широта-долгота в результате добавления расстояния?


person changingrainbows    schedule 19.11.2013    source источник
comment
Это задача, связанная с геометрией. Довольно сложно разместить его здесь, в stackoverflow.   -  person marzapower    schedule 19.11.2013
comment
Ах ... Я ищу реализацию с помощью хорошо используемых рубиновых драгоценных камней ГИС, а не математику, лежащую в основе решения.   -  person changingrainbows    schedule 20.11.2013


Ответы (2)


Для небольших смещений, таких как несколько сотен метров:

Вы можете справиться с ориентацией N&S, зная, что:

R * (lat1-lat2)= NorthSouth distance

где R — радиус Земли (6335 км).

Вы можете справиться с ориентацией 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
person Mark Setchell    schedule 20.11.2013
comment
Это помогло/решило ваш вопрос? Не могли бы вы принять, если да, пожалуйста? Или скажите, что с ним не так, чтобы я мог помочь дальше? - person Mark Setchell; 21.11.2013
comment
Привет, Марк ... Я думаю, что ваше решение может работать в рамках определенных вами предположений (размер смещения и т. Д.), Но я не пробовал его из-за предположений. Я считаю, что люди, которые написали библиотеки, такие как PostGIS, RGeo и т. д., учитывают общую точность, и я всегда предпочитаю использовать свой опыт, а не заниматься предположениями. Хотя решение кажется разумным! - person changingrainbows; 25.11.2013

Потребовалось немного покопаться, и оказалось, что есть уникальная библиотечная функция (учет кривизны, геометрии, проекции, местоположения и математических допущений), которая помогает добавить расстояние к определенному положению поверхности.

Функция: ST_Project

Используется ниже:

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

Он взят из PostGIS и, следовательно, может использоваться в Ruby/Rails, хотя пока не как нативные объекты Ruby (gems ​​еще не обернули его), а вместо этого как запрос PostGIS.

offset в метрах. orientation в градусах ("N"=0, "E"=90 и т. д.)

Надеюсь, это решение поможет другим, которые ищут то же самое.

person changingrainbows    schedule 25.11.2013