İki GPS koordinatı arasındaki mesafeyi (enlem ve boylam kullanarak) nasıl hesaplayabilirim?
Javascript uygulaması da dahil olmak üzere Enlem ve boylama göre iki koordinat arasındaki mesafeyi hesaplayın.
Batı ve Güney konumları negatiftir. Dakika ve saniyelerin 60'ın dışında olduğunu unutmayın, bu nedenle S31 30' -31,50 derecedir.
Dereceleri radyana dönüştürmeyi unutmayın. Birçok dilde bu fonksiyon vardır. Ya da basit bir hesaplama: `radyan = derece PI / 180`.
function degreesToRadians(degrees) {
return degrees * Math.PI / 180;
}
function distanceInKmBetweenEarthCoordinates(lat1, lon1, lat2, lon2) {
var earthRadiusKm = 6371;
var dLat = degreesToRadians(lat2-lat1);
var dLon = degreesToRadians(lon2-lon1);
lat1 = degreesToRadians(lat1);
lat2 = degreesToRadians(lat2);
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return earthRadiusKm * c;
}
İşte bazı kullanım örnekleri:
distanceInKmBetweenCoordinates(0,0,0,0) // Aynı noktalar arasındaki mesafe 0 olmalıdır 0 distanceInKmBetweenCoordinates(51.5, 0, 38.8, -77.1) // Londra'dan Arlington'a 5918.185064088764
Bu Lua kodu Wikipedia'da ve Robert Lipe'nin GPSbabel aracında bulunanlardan uyarlanmıştır:
local EARTH_RAD = 6378137.0
-- earth's radius in meters (official geoid datum, not 20,000km / pi)
local radmiles = EARTH_RAD*100.0/2.54/12.0/5280.0;
-- earth's radius in miles
local multipliers = {
radians = 1, miles = radmiles, mi = radmiles, feet = radmiles * 5280,
meters = EARTH_RAD, m = EARTH_RAD, km = EARTH_RAD / 1000,
degrees = 360 / (2 * math.pi), min = 60 * 360 / (2 * math.pi)
}
function gcdist(pt1, pt2, units) -- return distance in radians or given units
--- this formula works best for points close together or antipodal
--- rounding error strikes when distance is one-quarter Earth's circumference
--- (ref: wikipedia Great-circle distance)
if not pt1.radians then pt1 = rad(pt1) end
if not pt2.radians then pt2 = rad(pt2) end
local sdlat = sin((pt1.lat - pt2.lat) / 2.0);
local sdlon = sin((pt1.lon - pt2.lon) / 2.0);
local res = sqrt(sdlat * sdlat + cos(pt1.lat) * cos(pt2.lat) * sdlon * sdlon);
res = res > 1 and 1 or res < -1 and -1 or res
res = 2 * asin(res);
if units then return res * assert(multipliers[units])
else return res
end
end
Sanırım dünyanın eğriliği boyunca istiyorsunuz. Sizin iki noktanız ve dünyanın merkezi bir düzlem üzerinde. Dünyanın merkezi bu düzlem üzerindeki bir dairenin merkezidir ve iki nokta (kabaca) bu dairenin çevresi üzerindedir. Buradan, bir noktadan diğerine olan açının ne olduğunu bularak mesafeyi hesaplayabilirsiniz.
Noktalar aynı yükseklikte değilse veya dünyanın mükemmel bir küre olmadığını hesaba katmanız gerekiyorsa, iş biraz daha zorlaşır.