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.
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
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 –
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