Расстояние между почтовыми индексами

Я пытаюсь найти лучший способ определения расстояния между населенными пунктами (у нас есть почтовый индекс и местоположение).

В принципе, для каждой записи у нас есть местоположение и почтовый индекс, пользователь на 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, в противном случае это расстояние будет "как ворон летит"

Комментарии (2)

Если у вас есть географические координаты всех почтовых индексов, вот функция 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
Комментарии (0)