Вычисляют расстояние между двумя координатами широтой и долготой , включая реализацию JavaScript.
Запад и Юг местоположения отрицательны. Помните минуты, и секунды вне 60, таким образом, S31 30' составляет-31.50 градуса.
не забывают к , преобразовывают градусы в радианы . Много языков имеют эту функцию. Или это - простое вычисление: radians = degrees * 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;
}
Вот некоторые примеры использования:
distanceInKmBetweenCoordinates (0,0,0,0)//Расстояние между теми же точками должно быть 0 0 distanceInKmBetweenCoordinates (51.5, 0, 38.8,-77.1)//От Лондона до Арлингтона 5918.185064088764
Я недавно должен был сделать то же самое. Я нашел этот веб-сайт быть очень полезным объяснением, сферическим аккуратный с примерами, наряду с которыми было легко последовать.
Я предполагаю, что Вы хотите его вдоль искривления земли. Ваши две точки и центр земли находятся на плоскости. Центр земли является центром круга на той плоскости, и две точки находятся (примерно) на периметре того круга. От этого можно вычислить расстояние путем обнаружения, каков угол от одной точки до другого.
, Если точки не являются теми же высотами, или если необходимо принять во внимание, что земля не является идеальной сферой, это становится немного более трудным.
Этот код Lua адаптирован от материала, найденного на Википедию и в Robert Lipe инструмент GPSbabel:
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
Это очень легко сделать с типом географии в SQL Server 2008.
SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
-- computes distance in meters using eliptical model, accurate to the mm
4326 SRID для модели
WGS84 elipsoidal EarthЭто зависит от того, как точный Вам нужен он, чтобы быть при необходимости в сверхвысокой точности является лучшим посмотреть на алгоритм с использованием эллипсоид, а не сфера, таким как алгоритм Vincenty, который является с точностью до мм. http://en.wikipedia.org/wiki/Vincenty%27s_algorithm
Ищите хаверсин в Google; вот мое решение:
#include <math.h>
#include "haversine.h"
#define d2r (M_PI / 180.0)
//calculate haversine distance for linear distance
double haversine_km(double lat1, double long1, double lat2, double long2)
{
double dlong = (long2 - long1) * d2r;
double dlat = (lat2 - lat1) * d2r;
double a = pow(sin(dlat/2.0), 2) + cos(lat1*d2r) * cos(lat2*d2r) * pow(sin(dlong/2.0), 2);
double c = 2 * atan2(sqrt(a), sqrt(1-a));
double d = 6367 * c;
return d;
}
double haversine_mi(double lat1, double long1, double lat2, double long2)
{
double dlong = (long2 - long1) * d2r;
double dlat = (lat2 - lat1) * d2r;
double a = pow(sin(dlat/2.0), 2) + cos(lat1*d2r) * cos(lat2*d2r) * pow(sin(dlong/2.0), 2);
double c = 2 * atan2(sqrt(a), sqrt(1-a));
double d = 3956 * c;
return d;
}
Вот он в C # (широта и долгота в радианах):
double CalculateGreatCircleDistance(double lat1, double long1, double lat2, double long2, double radius)
{
return radius * Math.Acos(
Math.Sin(lat1) * Math.Sin(lat2)
+ Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(long2 - long1));
}
Если широта и долгота выражены в градусах, разделите их на 180 / PI для преобразования в радианы.