Tengo un script PHP en funcionamiento que obtiene valores de longitud y latitud y luego los ingresa en una consulta MySQL. Me gustaría hacerlo únicamente MySQL. Aquí está mi código PHP actual:
if ($distance != "Any" && $customer_zip != "") { //get the great circle distance
//get the origin zip code info
$zip_sql = "SELECT * FROM zip_code WHERE zip_code = '$customer_zip'";
$result = mysql_query($zip_sql);
$row = mysql_fetch_array($result);
$origin_lat = $row['lat'];
$origin_lon = $row['lon'];
//get the range
$lat_range = $distance/69.172;
$lon_range = abs($distance/(cos($details[0]) * 69.172));
$min_lat = number_format($origin_lat - $lat_range, "4", ".", "");
$max_lat = number_format($origin_lat + $lat_range, "4", ".", "");
$min_lon = number_format($origin_lon - $lon_range, "4", ".", "");
$max_lon = number_format($origin_lon + $lon_range, "4", ".", "");
$sql .= "lat BETWEEN '$min_lat' AND '$max_lat' AND lon BETWEEN '$min_lon' AND '$max_lon' AND ";
}
¿Alguien sabe cómo hacer esto completamente MySQL? He navegado un poco por Internet, pero la mayor parte de la literatura es bastante confusa.
php
mysql
great-circle
Nick Woodhams
fuente
fuente
Respuestas:
Desde Google Code FAQ - Crear un localizador de tiendas con PHP, MySQL y Google Maps :
fuente
markers
tabla con los campos id, lan y lng.$greatCircleDistance = acos( cos($latitude0) * cos($latitude1) * cos($longitude0 - $longitude1) + sin($latitude0) * sin($latitude1));
con latitud y longitud en radianes.
entonces
es tu consulta SQL
para obtener sus resultados en Km o millas, multiplique el resultado con el radio medio de la Tierra (
3959
millas,6371
Km o3440
millas náuticas)Lo que está calculando en su ejemplo es un cuadro delimitador. Si coloca sus datos de coordenadas en una columna MySQL espacial habilitada , puede usar la funcionalidad integrada de MySQL para consultar los datos.
fuente
Si agrega campos auxiliares a la tabla de coordenadas, puede mejorar el tiempo de respuesta de la consulta.
Me gusta esto:
Si está utilizando TokuDB, obtendrá un rendimiento aún mejor si agrega índices de agrupación en cualquiera de los predicados, por ejemplo, así:
Necesitará los lat y lon básicos en grados, así como sin (lat) en radianes, cos (lat) * cos (lon) en radianes y cos (lat) * sin (lon) en radianes para cada punto. Luego creas una función mysql, algo así:
Esto te da la distancia.
No olvide agregar un índice en lat / lon para que el cuadro delimitador pueda ayudar a la búsqueda en lugar de ralentizarlo (el índice ya se agregó en la consulta CREAR TABLA anterior).
Dada una tabla antigua con solo coordenadas lat / lon, puede configurar una secuencia de comandos para actualizarla así: (php usando meekrodb)
Luego, optimiza la consulta real para hacer solo el cálculo de la distancia cuando realmente se necesita, por ejemplo, delimitando el círculo (bueno, ovalado) desde adentro y desde afuera. Para eso, deberá calcular previamente varias métricas para la consulta en sí:
Dados esos preparativos, la consulta es algo como esto (php):
EXPLICAR en la consulta anterior podría decir que no está usando el índice a menos que haya suficientes resultados para activarlo. El índice se usará cuando haya suficientes datos en la tabla de coordenadas. Puede agregar FORCE INDEX (lat_lon_idx) a SELECT para que use el índice sin tener en cuenta el tamaño de la tabla, para que pueda verificar con EXPLAIN que funciona correctamente.
Con los ejemplos de código anteriores, debe tener una implementación funcional y escalable de búsqueda de objetos por distancia con un error mínimo.
fuente
He tenido que resolver esto con cierto detalle, así que compartiré mi resultado. Esto usa una
zip
tabla conlatitude
ylongitude
tablas. No depende de Google Maps; más bien puede adaptarlo a cualquier tabla que contenga lat / long.Mire esta línea en el medio de esa consulta:
Esto busca las 30 entradas más cercanas en la
zip
tabla dentro de 50.0 millas del punto lat / long 42.81 / -70.81. Cuando construyes esto en una aplicación, ahí es donde pones tu propio punto y radio de búsqueda.Si desea trabajar en kilómetros en lugar de millas, el cambio
69
a111.045
y el cambio3963.17
a6378.10
la consulta.Aquí hay una reseña detallada. Espero que ayude a alguien. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
fuente
He escrito un procedimiento que puede calcular lo mismo, pero debe ingresar la latitud y la longitud en la tabla respectiva.
fuente
No puedo comentar sobre la respuesta anterior, pero tenga cuidado con la respuesta de @Pavel Chuchuva. Esa fórmula no devolverá un resultado si ambas coordenadas son iguales. En ese caso, la distancia es nula, por lo que esa fila no se devolverá con esa fórmula tal como está.
No soy un experto en MySQL, pero esto parece estar funcionando para mí:
fuente
ACOS(1)
es 0). Es posible que vea problemas de redondeo con el xaxis * xaxis + yaxis * yaxis + zaxis * zaxis fuera de rango para ACOS, pero ¿no parece estar evitando eso?para una distancia de 25 km
fuente
Pensé que mi implementación de JavaScript sería una buena referencia para:
fuente
calcular la distancia en Mysql
por lo tanto, se calculará el valor de distancia y cualquiera puede solicitarlo según sea necesario
fuente