Географические координаты операций

Как спросил Эстебан А. Маринголо:

Кто-нибудь реализовал базовые методы / классы для вычисления расстояния между двумя точками (широта, долгота) и подобных операций?


person Uko    schedule 26.12.2013    source источник
comment
Кто такой Эстебан А. Маринголо и почему это актуально?   -  person JJJ    schedule 26.12.2013
comment
@Juhana человек, задавший вопрос в списке рассылки. Я решил переместить его в SO, так как здесь он более индексируется поисковыми системами, и люди могут добавлять другие вопросы, но я все же хочу указать авторов   -  person Uko    schedule 26.12.2013


Ответы (2)


Решение найдено Эстебаном А. Маринголо:

distanceFromLat: lat1 long: long1 toLat: lat2 long: long2
"Answer the distance in meters between two coordinates in float number representation."

  | lat1Rad  lon1Rad lat2Rad lon2Rad earthRadius dLat dLon dLatSinSqrd dLonSinSqrd cosLatLat a c distance |
  lat1Rad := lat1 degreesToRadians.
  lon1Rad := long1  degreesToRadians.
  lat2Rad := lat2 degreesToRadians.
  lon2Rad := long2 degreesToRadians.
  earthRadius := 6371.00.
  dLat := lat2Rad - lat1Rad.
  dLon := lon2Rad - lon1Rad.
  dLatSinSqrd := (dLat / 2) sin squared.
  dLonSinSqrd := (dLon / 2) sin squared.
  cosLatLat := lat2Rad cos * lat1Rad cos.
  a := dLatSinSqrd + (cosLatLat * dLonSinSqrd).
  c := 2 * a sqrt arcSin.
  distance := earthRadius * c.
  ^ distance
person Uko    schedule 26.12.2013
comment
Меня немного смущает вопрос и ответы, особенно потому, что оба ответа являются реализациями функции Хаверсинуса для вычисления расстояний между двумя точками в системе координат WGN83. Был вопрос, «как реализовать хаверсин в Pharo». Если да, могли бы мы переименовать вопрос. - person Andrew - OpenGeoCode; 28.12.2013

Более простое решение от Sven Van Caekenberghe:

Это формула, которая годами используется в Pharo, Java [Script], Common Lisp:

distanceBetween: firstPosition and: secondPosition
 "T3GeoTools distanceBetween: [email protected] and: [email protected]"

 | c |
 c := (firstPosition y degreeSin * secondPosition y degreeSin)
      + (firstPosition y degreeCos * secondPosition y degreeCos
         * (secondPosition x degreesToRadians - firstPosition x degreesToRadians) cos).
 c := c >= 0 ifTrue: [ 1 min: c ] ifFalse: [ -1 max: c ].
 ^ c arcCos * 6371000

Это между координатами WGS84. Используйте эту страницу как ссылку: http://www.movable-type.co.uk/scripts/latlong.html

person Uko    schedule 26.12.2013