2010-11-16 25 views
9

Tengo una ubicación (latitud & longitud). ¿Cómo puedo obtener una lista de códigos postales parcial o totalmente dentro del radio de 10 millas de mi ubicación?Dadas las coordenadas, ¿cómo obtengo todos los códigos postales dentro de un radio de 10 millas?

La solución podría ser una llamada a un servicio web bien conocido (google maps, bing maps, etc ...) o una solución de base de datos local (el cliente tiene sql server 2005) o un algoritmo.

He visto el algo similar question, pero todas las respuestas allí se relacionan bastante con el uso de la funcionalidad de geografía de SQL Server 2008 que no está disponible para mí.

+2

¿En qué país está tratando de encontrar los códigos postales? – Pedery

+0

@Pedery. Estados Unidos de A – AngryHacker

Respuesta

5

En primer lugar, necesitará una base de datos de todos los códigos postales y sus correspondientes latitudes y longitudes. En Australia, solo hay unos pocos miles de estos (y la información es de fácil acceso), sin embargo, supongo que probablemente sea una tarea más difícil en los EE. UU.

En segundo lugar, dado que usted sabe dónde se encuentra, y sabe el radio que está buscando, puede buscar todos los códigos postales que se encuentren dentro de ese radio. Algo simple escrito en PHP sería la siguiente: (disculpas no es en C#)

function distanceFromTo($latitude1,$longitude1,$latitude2,$longitude2,$km){ 
    $latitude1 = deg2rad($latitude1); 
    $longitude1 = deg2rad($longitude1); 
    $latitude2 = deg2rad($latitude2); 
    $longitude2 = deg2rad($longitude2); 
    $delta_latitude = $latitude2 - $latitude1; 
    $delta_longitude = $longitude2 - $longitude1; 
    $temp = pow(sin($delta_latitude/2.0),2) + cos($latitude1) * cos($latitude2) * pow(sin($delta_longitude/2.0),2); 
    $earth_radius = 3956; 
    $distance = $earth_radius * 2 * atan2(sqrt($temp),sqrt(1-$temp)); 
    if ($km) 
    $distance = $distance * 1.609344; 
    return $distance; 
} 
+0

AngryHacker: Luke ha publicado una implementación PHP de la fórmula Haversine que mencioné. – winwaed

5

mayoría de las búsquedas trabajan con los centroides. Para trabajar con códigos postales parciales dentro de las 10 millas, tendrá que comprar una base de datos de polígonos de código postal (*). Luego, implemente un algoritmo que compruebe códigos postales con vértices dentro de su radio de 10 millas. Para hacerlo correctamente, debes usar la fórmula de Haversine para la medición de distancia. Con algunas estructuras de datos inteligentes, puede reducir significativamente el espacio de búsqueda. Del mismo modo, las búsquedas se pueden acelerar mucho almacenando y comparando inicialmente contra extensiones zipcoe (Norte, Oeste, Este, Sur).

(*) Nota: los códigos postales, técnicamente, no son polígonos! Sé que todos pensamos en ellos de esa manera, pero en realidad son colecciones de puntos de datos (direcciones) y así es como USPS realmente los usa. Esto significa que los códigos postales pueden incluir otros códigos postales; los códigos postales se pueden hacer de múltiples "polígonos"; y los códigos postales pueden superponerse a otros códigos postales. La mayoría de estas situaciones no deberían ser un problema, pero tendrá que manejar códigos postales que se pueden definir como múltiples polígonos.

9

Comience con una base de datos de código zip que contiene códigos postales y su correspondiente latitud y la longitud coordina:

http://www.zipcodedownload.com/Products/Product/Z5Commercial/Standard/Overview/

Para obtener la distancia entre la latitud y la longitud, necesitará una buena fórmula de distancia. Este sitio tiene un par de variaciones:

http://www.meridianworlddata.com/distance-calculation/

La fórmula "distancia ortodrómica" es un poco extremo. Esta funciona lo suficientemente bien de mi experiencia:

sqrt(x * x + y * y) 

where x = 69.1 * (lat2 - lat1) 
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

Su consulta SQL entonces ser algo como esto:

select zd.ZipCode 
from ZipData zd 
where 
    sqrt(
     square(69.1 * (zd.Latitude - @Latitude)) + 
     square(69.1 * (zd.Longitude - @Longitude) * cos(@Latitude/57.3)) 
    ) < @Distance 

Buena suerte!

+2

Esto fue realmente una gran respuesta ... todas las distancias están dentro de un cuarto de milla que he calculado ...+1 –

+0

excelente respuesta +1 - ¿Puede decirme de dónde provienen las matemáticas? ¿Qué representan los números decimales? –

+0

El enlace a meridianworld.com ya no es válido, así que lo actualicé a una versión en caché. Creo que los números mágicos provienen de una aproximación a distancia que calcula distancias en la superficie de una esfera. Existen fórmulas más precisas, pero para su escenario básico de "localizador de tiendas", este me ha funcionado bien. – dana

Cuestiones relacionadas