2011-11-15 52 views
12

Recientemente comencé a buscar en la API de Google Maps para probar algo nuevo en mis sitios web. Actualmente estoy usando este código:Encontrar ciudades dentro de un radio de 10 millas del código postal. Google Maps API

<?php 

$postcode = $_REQUEST['postcode']; 

$url = 'http://maps.googleapis.com/maps/api/geocode/xml?address='.$postcode.'&sensor=false'; 
$parsedXML = simplexml_load_file($url); 

if($parsedXML->status != "OK") { 
echo "There has been a problem: " . $parsedXML->status; 
} 

$myAddress = array(); 
foreach($parsedXML->result->address_component as $component) { 
if(is_array($component->type)) $type = (string)$component->type[0]; 
else $type = (string)$component->type; 

$myAddress[$type] = (string)$component->long_name; 
} 
header('Content-Type: application/json'); 
echo json_encode($myAddress); 


?> 

que simplemente se utiliza un código postal que defino y busca en la base de datos Google y luego devuelve la ciudad, condado, etc.

Si es posible, me gustaría no sólo muestran la ciudad más cercana pero también cualquier dentro de un radio de 5-10 millas. ¿Podría alguien decirme cómo iba a hacer esto por favor?

Gracias por cualquier ayuda

+0

hay un par de preguntas y respuestas prometedoras en: http://stackoverflow.com/search?q=radius+search+google+maps+php - ¿cuáles de ellas han revisado y por qué no lo han ayudado a resolver su problema? – Gordon

+0

Echaré un vistazo a esos, miré las publicaciones sugeridas mientras escribía mi pregunta, pero no vi muchas cosas útiles. ¿Sabes dónde podría obtener una base de datos de códigos postales del Reino Unido sin pagar dinero real de Royal Mail por ello? Vi un artículo que decía que wikileaks lo lanzó, pero esto fue en 2009, así que supongo que no está completamente actualizado –

+0

ni idea, lo siento. un google rápido trajo https://www.ordnancesurvey.co.uk/opendatadownload/products.html pero no estoy seguro de si estos son gratuitos o útiles. – Gordon

Respuesta

51

actualización: Me escribió una entrada de blog más detallada sobre este tema específico en http://www.mullie.eu/geographic-searches/

-

bucle a través de todas las ciudades disponibles mediante la API de Google Maps para buscar su latitud & longitud. Guarde estos en alguna parte (base de datos). - Tenga cuidado, Google no aceptará una gran cantidad de llamadas, por lo que acelerará sus llamadas.

Entonces, cuando ir a buscar una ciudad, puede utilizar código similar al código de abajo para agarrar las ciudades withing un cierto rango:

public static function getNearby($lat, $lng, $type = 'cities', $limit = 50, $distance = 50, $unit = 'km') 
{ 
    // radius of earth; @note: the earth is not perfectly spherical, but this is considered the 'mean radius' 
    if ($unit == 'km') $radius = 6371.009; // in kilometers 
    elseif ($unit == 'mi') $radius = 3958.761; // in miles 

    // latitude boundaries 
    $maxLat = (float) $lat + rad2deg($distance/$radius); 
    $minLat = (float) $lat - rad2deg($distance/$radius); 

    // longitude boundaries (longitude gets smaller when latitude increases) 
    $maxLng = (float) $lng + rad2deg($distance/$radius/cos(deg2rad((float) $lat))); 
    $minLng = (float) $lng - rad2deg($distance/$radius/cos(deg2rad((float) $lat))); 

    // get results ordered by distance (approx) 
    $nearby = (array) FrontendDB::getDB()->retrieve('SELECT * 
                FROM table 
                WHERE lat > ? AND lat < ? AND lng > ? AND lng < ? 
                ORDER BY ABS(lat - ?) + ABS(lng - ?) ASC 
                LIMIT ?;', 
                array($minLat, $maxLat, $minLng, $maxLng, (float) $lat, (float) $lng, (int) $limit)); 

    return $nearby; 
} 

Notas sobre el código anterior:

  • base de datos propia Se usa wrapper, así que transfiéralo a mysql_query, PDO, ...
  • Esto no será exacto. No podemos hacer cálculos esféricos exactos en la base de datos, por lo que hemos tomado la superior & latitud más baja & límites de longitud. Esto básicamente significa que una ubicación que está un poco más allá de su distancia (por ejemplo, en el extremo noreste, justo fuera del radio real (que en realidad es más o menos un círculo), pero aún dentro de la latitud máxima & de longitud (porque comparamos a la plaza de límites en la base de datos) esto acaba de dar una áspera pero tuerca 100% precisa selección de las ciudades withing su radio de

voy a tratar de ilustrar esto:..

_________________ 
| /\  | 
| Y/ \ | 
|/  \ | 
|(  X  )| 
| \  /| 
| \ / | 
|______\_/______| 

lo anterior círculo (un tanto) es el radio real en el que desea buscar ubicaciones dentro de la ubicación X. Esto es demasiado difícil de lograr directamente desde su base de datos, Entonces, lo que realmente buscamos del DB es el cuadrado circundante. Como puede ver, es posible que las ubicaciones (como Y) caigan dentro de estos límites máximos de &, aunque en realidad no están dentro del radio solicitado. Sin embargo, estos pueden ser filtrados a través de PHP.

Para abordar este último problema, puede recorrer todos los resultados y calcular la distancia exacta entre su ubicación raíz y las coincidencias cerradas, para calcular si están realmente dentro de su radio. Para ello, puede utilizar este código:

public static function getDistance($lat1, $lng1, $lat2, $lng2, $unit = 'km') 
{ 
    // radius of earth; @note: the earth is not perfectly spherical, but this is considered the 'mean radius' 
    if ($unit == 'km') $radius = 6371.009; // in kilometers 
    elseif ($unit == 'mi') $radius = 3958.761; // in miles 

    // convert degrees to radians 
    $lat1 = deg2rad((float) $lat1); 
    $lng1 = deg2rad((float) $lng1); 
    $lat2 = deg2rad((float) $lat2); 
    $lng2 = deg2rad((float) $lng2); 

    // great circle distance formula 
    return $radius * acos(sin($lat1) * sin($lat2) + cos($lat1) * cos($lat2) * cos($lng1 - $lng2)); 
} 

Esta calculará la (cuasi) distancia exacta entre la ubicación ubicación X e Y, y entonces se puede filtrar exactamente esas ciudades que estaban lo suficientemente cerca como para pasar el PP en bruto -fetch, pero no solo lo suficientemente cerca como para estar dentro de tus límites.

+4

No sé por qué tienes solo 6 ups =) –

+0

respuesta increíble, muchas gracias –

Cuestiones relacionadas