Как спросил Эстебан А. Маринголо:
Кто-нибудь реализовал базовые методы / классы для вычисления расстояния между двумя точками (широта, долгота) и подобных операций?
Как спросил Эстебан А. Маринголо:
Кто-нибудь реализовал базовые методы / классы для вычисления расстояния между двумя точками (широта, долгота) и подобных операций?
Решение найдено Эстебаном А. Маринголо:
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
Более простое решение от 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