Pregunta

Tengo una localización (latitud y longitud). ¿Cómo puedo obtener una lista de códigos postales que están parcial o totalmente dentro del radio de 10 millas de mi ubicación?

La solución podría ser una llamada a un servicio web muy 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 un poco la pregunta similar , pero todas las respuestas allí casi pertenecen a la utilización de la funcionalidad de la geografía de SQL Server 2008 que no está disponible para mí.

¿Fue útil?

Solución

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

En segundo lugar, dado que saber dónde se encuentra, y que conoce el radio que busca, puede buscar todos los códigos postales que caen 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;
}

Otros consejos

Comience con una base de datos de código zip que contiene códigos postales y sus correspondientes coordenadas de latitud y longitud:

http://www.zipcodedownload.com/Products/Product/ Z5Commercial / Estándar / Resumen /

Para obtener la distancia entre la latitud y longitud, se necesita una fórmula buena 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 bastante bien desde 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 a continuación, se verá 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!

La mayoría de las búsquedas trabajan con los centroides. Con el fin de trabajar con códigos postales parciales estar dentro de las 10 millas, usted va a tener que comprar una base de datos de polígonos código postal (*). A continuación, aplicar un algoritmo que comprueba los códigos postales con vértices dentro de su radio de 10 millas. Que se hace correctamente, se utiliza la fórmula owuld Haversine para la medición de la distancia. Con algunas estructuras de datos inteligentes, puede significativa reducir el espacio de búsqueda. Del mismo modo, las búsquedas se pueden acelerar en gran medida por el almacenamiento e inicialmente comparando contra extensiones zipcoe (Norte, Oeste, Este, Sur).

(*) Nota: los códigos postales, técnicamente, no son polígonos! Yo sé que todos pensamos de ellos de esa manera, pero en realidad son conjuntos de puntos de datos (direcciones de la calle) y así es como el USPS realmente los usa. Esto significa códigos postales pueden incluir otros códigos postales; códigos postales pueden estar hechas de múltiples "polígonos"; y códigos postales se pueden superponer otros códigos postales. La mayoría de estas situaciones no debería ser un problema, pero usted tendrá que códigos postales de la manija que se pueden definir como varios polígonos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top