Hvordan beregner jeg avstanden mellom to GPS-koordinater (ved hjelp av breddegrad og lengdegrad)?
Beregn avstanden mellom to koordinater etter breddegrad og lengdegrad, inkludert en Javascript-implementering.
Vest og Sør steder er negative. Husk at minutter og sekunder er av 60, så S31 30' er -31,50 grader.
Ikke glem å konvertere grader til radianer. Mange språk har denne funksjonen. Eller det er en enkel beregning: radianer = grader * 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;
}
Her er noen eksempler på bruk:
distanceInKmBetweenCoordinates(0,0,0,0) // Avstand mellom samme punkter skal være 0 0 distanceInKmBetweenCoordinates(51.5, 0, 38.8, -77.1) // Fra London til Arlington 5918.185064088764
Denne Lua-koden er tilpasset fra ting som finnes på Wikipedia og i Robert Lipe&# 39s GPSbabel verktøy:
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
Jeg antar at du vil ha den langs jordens krumning. De to punktene dine og jordens sentrum ligger på et plan. Jordens sentrum er sentrum av en sirkel på det planet, og de to punktene er (omtrent) på omkretsen av den sirkelen. Ut fra dette kan du beregne avstanden ved å finne ut hva vinkelen fra det ene punktet til det andre er.
Hvis punktene ikke har samme høyde, eller hvis du må ta hensyn til at jorden ikke er en perfekt kule, blir det litt vanskeligere.