Por ejemplo, digamos que tengo una tabla:
Business(BusinessID, Lattitude, Longitude)
Todos están indexados, por supuesto. También hay 1 millón de registros
Digamos que quiero encontrar negocios más cercanos a 106,5, por ejemplo, ¿cómo lo haría?
Si lo hago
SELECT *
FROM Business
WHERE (Some formula to compute distance here) < 2000
por ejemplo, o si lo hago
SELECT *
FROM Business
TOP 20
En teoría, la computadora tendrá que calcular la distancia para todos los negocios, mientras que en la práctica solo aquellos con latitud y longitud dentro de un cierto rango que deben calcularse.
Entonces, ¿cómo puedo hacer lo que quiero en PhP o SQL, por ejemplo?
Estoy agradecido con la respuesta hasta ahora. Estoy usando mysql y no tienen nada más eficiente que la solución obvia. MySQL espacial tampoco tiene función de cálculo de distancia.
fuente
(Divulgación: soy un chico de Microsoft SQL Server, así que mis respuestas están influenciadas por eso).
Para hacerlo realmente eficientemente, hay dos cosas que desea: almacenamiento en caché y soporte de datos espaciales nativos. El soporte de datos espaciales le permite almacenar datos de geografía y geometría directamente en la base de datos sin hacer cálculos intensivos / costosos sobre la marcha, y le permite construir índices para encontrar muy rápidamente el punto más cercano a su ubicación actual (o la ruta más eficiente o lo que sea).
El almacenamiento en caché es importante si desea escalar, punto. La consulta más rápida es la que nunca haces. Cada vez que un usuario le pide lo más cercano, usted almacena su ubicación y el conjunto de resultados en un caché como Redis o memcached durante un período de horas. Las ubicaciones de las empresas no cambiarán durante 4 horas; bueno, podrían cambiar si alguien edita una empresa, pero no necesariamente necesita que se actualice de inmediato en todos los conjuntos de resultados.
fuente
Yelp probablemente usa SIG
PostgreSQL tiene la implementación de referencia para SIG con PostGIS . Yelp puede estar usando MySQL, que es inferior en todos los sentidos . En el caso de algo como Yelp, casi con seguridad mantienen las coordenadas para,
Esas coordenadas están casi seguramente en WGS84 y se almacenan como tipo de Geografía. En PostgreSQL y PostGIS se vería algo así,
Ellos llenarían esa mesa. Luego toman las coordenadas WGS84 de su teléfono y generan una consulta, como esta con SQL Alchemy (en el caso de Yelp),
Para obtener más información, consulte nuestro espacio y consulte Sistemas de información geográfica en StackExchange
fuente