Вычислите расстояние между 2 координатами GPS

343
задан Peter O. 22 November 2016 в 02:26
поделиться

8 ответов

Вычисляют расстояние между двумя координатами широтой и долготой , включая реализацию 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

377
ответ дан ColdFire 23 November 2019 в 00:33
поделиться

Я недавно должен был сделать то же самое. Я нашел этот веб-сайт быть очень полезным объяснением, сферическим аккуратный с примерами, наряду с которыми было легко последовать.

2
ответ дан Twotymz 23 November 2019 в 00:33
поделиться

Я предполагаю, что Вы хотите его вдоль искривления земли. Ваши две точки и центр земли находятся на плоскости. Центр земли является центром круга на той плоскости, и две точки находятся (примерно) на периметре того круга. От этого можно вычислить расстояние путем обнаружения, каков угол от одной точки до другого.

, Если точки не являются теми же высотами, или если необходимо принять во внимание, что земля не является идеальной сферой, это становится немного более трудным.

2
ответ дан Guge 23 November 2019 в 00:33
поделиться

Этот код 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
3
ответ дан Norman Ramsey 23 November 2019 в 00:33
поделиться

Это очень легко сделать с типом географии в 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
23
ответ дан Marko Tintor 23 November 2019 в 00:33
поделиться

Это зависит от того, как точный Вам нужен он, чтобы быть при необходимости в сверхвысокой точности является лучшим посмотреть на алгоритм с использованием эллипсоид, а не сфера, таким как алгоритм Vincenty, который является с точностью до мм. http://en.wikipedia.org/wiki/Vincenty%27s_algorithm

15
ответ дан seanb 23 November 2019 в 00:33
поделиться

Ищите хаверсин в 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;
}
59
ответ дан 23 November 2019 в 00:33
поделиться

Вот он в 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 для преобразования в радианы.

11
ответ дан 23 November 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: