Я пытаюсь найти лучший способ определения расстояния между населенными пунктами (у нас есть почтовый индекс и местоположение).
В принципе, для каждой записи у нас есть местоположение и почтовый индекс, пользователь на front-end может ввести почтовый индекс и выбрать записи ...
- Within 10 Miles
- Within 20 Miles
- Within 40 Miles
- Within 50 Miles
Единственный способ, который я вижу, это получить КАЖДУЮ запись из базы данных и вычислить расстояние между каждой, ввести его во временную таблицу, а затем упорядочить эту таблицу по местоположению и отфильтровать ее. Это кажется очень долгим и трудоемким способом - есть ли у кого-нибудь предложения, как это можно сделать лучше? Или это лучший способ сделать это?
Например, клиент вводит SO40 9AA (почтовый индекс Саутгемптона) и затем выбирает "в пределах 50 миль", это должно отобразить все записи в пределах 50 миль от этого почтового индекса или местоположения.
Есть ли у вас геокод в вашем наборе данных? Если нет, вы можете добавить его для имеющихся у вас почтовых индексов с помощью такой службы, как http://geocoder.us/help/city_state_zip.shtml. Или вы можете получить базу данных с готовым кодом, доступную на сайте http://www.zipinfo.com/products/z5ll/z5ll.htm. Как только вы добавите код в записи, вы сможете использовать стандартный математический расчет расстояния, используя координаты lat / long для расчета расстояния.
Если вам нужно расстояние на автомобиле, используйте Google Maps API, в противном случае это расстояние будет "как ворон летит"
Если у вас есть географические координаты всех почтовых индексов, вот функция VB для получения расстояния по прямой между любыми двумя точками. Она выдает результаты в милях, но их достаточно легко конвертировать.
Function distance(lat1 As Single, lon1 As Single, lat2 As Single, lon2 As Single)
Dim theta As Single, dist As Single
theta = deg2rad(lon1 - lon2)
lat1 = deg2rad(lat1)
lat2 = deg2rad(lat2)
dist = Sin(lat1) * Sin(lat2) + Cos(lat1) * Cos(lat2) * Cos(theta)
dist = acos(dist)
dist = rad2deg(dist)
distance = dist * 60 * 1.1515
End Function
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'::: This function get the arccos function from arctan function :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function acos(Rad)
If Abs(Rad) <> 1 Then
acos = pi / 2 - Atn(Rad / Sqr(1 - Rad * Rad))
ElseIf Rad = -1 Then
acos = pi
End If
End Function
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'::: This function converts decimal degrees to radians :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function deg2rad(Deg As Single) As Single
deg2rad = CSng(Deg * pi / 180)
End Function
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'::: This function converts radians to decimal degrees :::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Function rad2deg(Rad As Single) As Single
rad2deg = CSng(Rad * 180 / pi)
End Function