Второе изображение имеет некоторые проблемы, вот правильное: введите описание изображения здесь
'below is from
'http://www.zipcodeworld.com/samples/distance.vbnet.html
Public Function distance(ByVal lat1 As Double, ByVal lon1 As Double, _
ByVal lat2 As Double, ByVal lon2 As Double, _
Optional ByVal unit As Char = "M"c) As Double
Dim theta As Double = lon1 - lon2
Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
Math.Cos(deg2rad(theta))
dist = Math.Acos(dist)
dist = rad2deg(dist)
dist = dist * 60 * 1.1515
If unit = "K" Then
dist = dist * 1.609344
ElseIf unit = "N" Then
dist = dist * 0.8684
End If
Return dist
End Function
Public Function Haversine(ByVal lat1 As Double, ByVal lon1 As Double, _
ByVal lat2 As Double, ByVal lon2 As Double, _
Optional ByVal unit As Char = "M"c) As Double
Dim R As Double = 6371 'earth radius in km
Dim dLat As Double
Dim dLon As Double
Dim a As Double
Dim c As Double
Dim d As Double
dLat = deg2rad(lat2 - lat1)
dLon = deg2rad((lon2 - lon1))
a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(deg2rad(lat1)) * _
Math.Cos(deg2rad(lat2)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a))
d = R * c
Select Case unit.ToString.ToUpper
Case "M"c
d = d * 0.62137119
Case "N"c
d = d * 0.5399568
End Select
Return d
End Function
Private Function deg2rad(ByVal deg As Double) As Double
Return (deg * Math.PI / 180.0)
End Function
Private Function rad2deg(ByVal rad As Double) As Double
Return rad / Math.PI * 180.0
End Function
Существует довольно много способов вычислить это. Все они используют приближения сферической тригонометрии, где радиус является тем земли.
попытка http://www.movable-type.co.uk/scripts/latlong.html некоторое время методов и кода на различных языках.
Существует много инструментов, которые сделают это легким. См. ответ monjardin для получения дополнительной информации о том, что включено.
Однако выполнение этого является не обязательно трудным. Это кажется на использование Java таким образом, я рекомендовал бы изучить что-то как GDAL. Это обеспечивает обертки Java для их стандартных программ, и у них есть все инструменты, требуемые преобразовать из Lat/Lon (географические координаты) к UTM (спроектированная система координат) или некоторая другая разумная проекция карты.
UTM хорош, потому что это - метры, настолько легкие работать с. Однако необходимо будет получить соответствующее зона UTM , чтобы она сделала хорошее задание. Существуют некоторые простые коды, доступные через гугление для нахождения соответствующей зоны для lat/long пары.
Земля является раздражающе неправильной поверхностью, таким образом, нет никакой простой формулы, чтобы сделать это точно. Необходимо жить с приблизительной моделью земли и спроектировать координаты на нее. Модель, которую я обычно вижу используемый для этого, WGS 84. Это - то, что устройства GPS обычно используют для решения той же самой проблемы.
NOAA имеет некоторое программное обеспечение, которое можно загрузить для помощи с этим на их веб-сайте .
Широты и долготы определяют точки, не расстояния, таким образом, Ваш вопрос несколько бессмыслен. Если Вы спрашиваете о кратчайшем расстоянии между два (lat, lon) точки, см. эта статья Wikipedia о больших круговых расстояниях.
Одна морская миля (1 852 метра) определяется как один аркминута из долготы на экватор. Однако необходимо определить проекция карты (см. также UTM), в котором Вы работаете на преобразование, чтобы действительно иметь смысл.
Вам нужно преобразовать координаты в радианы, чтобы создать сферическую геометрию. После преобразования вы можете рассчитать расстояние между двумя точками. Затем расстояние можно преобразовать в любую нужную меру.
Если это достаточно близко, вы можете рассматривать их как координаты на плоской плоскости. Это работает, скажем, на уровне улицы или города, если безупречная точность не требуется, и все, что вам нужно, - это приблизительное предположение о расстоянии, которое нужно сравнить с произвольным пределом.