Más

¿Cómo saber si un punto está dentro de un rectángulo en el mapa?

¿Cómo saber si un punto está dentro de un rectángulo en el mapa?


Tengo cuatro puntos que representan un rectángulo (a, b, c, d). Obtuve estos puntos del GPS móvil.

En mi base de datos tengo esta tabla de ubicaciones comerciales:

bussId | longitud | latitud -----------------------------…

¿Cómo puedo saber qué negocios están dentro del rectángulo?

Quiero implementar esta función:

función isInsideRectangle (bus de puntos, punto a, punto b, punto c, punto d)

donde el Punto contiene longitud y latitud.


La respuesta real es una mezcla de las otras respuestas / comentarios que ya ha recibido.

MySQL es limitado

Veo por las etiquetas que está usando MySQL, el problema es que solo puede hacer cuadros delimitadores hasta 5.6, no las geometrías reales. http://dev.mysql.com/doc/refman/5.0/en/spatial-relation-functions.html

Si desea utilizar el cuadro delimitador:

SELECCIONAR * DE 'prueba' DONDE CONTAINS ('límites', geomfromtext ('POLYGON (0 0,10 0,10 10,0 10,0 0)'))

En 5.6.1 puede hacer las geometrías reales, así que simplemente cambieCONTIENEaST_CONTAINS. http://dev.mysql.com/doc/refman/5.6/en/spatial-relation-functions.html#functions-that-test-spatial-relationships-between-geometries

SELECCIONAR * DE 'prueba' DONDE ST_CONTAINS ('límites', geomfromtext ('POLYGON (0 0,10 0,10 10,0 10,0 0)'))

Índices espaciales

Tenga en cuenta que, de acuerdo con el comentario de John (y el problema con la respuesta de David), es que sea cual sea la base de datos con la que vaya, desea almacenar sus datos como unpuntotipo de datos espaciales. Consulte: https://dev.mysql.com/doc/refman/5.0/en/spatial-datatypes.html: esto le permite aprovechar una serie de optimizaciones, incluidos los índices espaciales, que harán las cosas más rápido. Consulte también esta pregunta: https://stackoverflow.com/questions/5453063/benefits-of-spatial-over-using-standard-bounding-box-query


A partir de las coordenadas de longitud y latitud, puede crear estructuras espaciales (puntos) en su base de datos (espacial), como PostGIS. (ver ST_GeomFromText)
En lugar de su bussId | longitud | latitud, tendría una base de datos bussId, Point llamada BussSpatial. A continuación, puede consultar lo siguiente

var request = 'SELECT bussID FROM BussSpatial WHERE ST_CONTAINS (ST_MakePolygon (ST_GeomFromText (' LINESTRING ('+ a +', + '+' + b + ',' + '+ c', '+ d +') '), buss) ; ';

donde a, b, cyd serían sus variables (en realidad debería ser a.longitude, a.latitude, etc ...)

Tenga cuidado: esta declaración SQL no se puede utilizar directamente así, es unaCuerdaen tus

función isInsideRectangle (bus de puntos, punto a, punto b, punto d)

y luego puede hacer la solicitud dentro de la función.


La consulta del cuadro delimitador para SQL es (usando PDO)

$ sql = "SELECT bussid FROM tablename WHERE (latitud ENTRE? Y?) Y (longitud ENTRE? Y?)"; $ stmt = $ dbh-> preparar ($ sql); // Asignar parámetros $ stmt-> bindParam (1, $ minLat); $ stmt-> bindParam (2, $ maxLat); $ stmt-> bindParam (3, $ minLng); $ stmt-> bindParam (4, $ maxLng);

DONDE los parámetros provienen de la parte superior izquierda e inferior derecha del rectángulo


Si elmapala mesa tiene un campopagde tipo PUNTO con índice ESPACIAL puede hacer esto:

set @p = concat ('Polígono ((', _ x0, ", _ y0, ',', _ x1,", _ y0, ',', _ x1, ", _ y1, ',', _ x0,", _ y1, ', ', _x0, ", _ y0,')) '); seleccione * del mapa donde mbrcontains (GeomFromText (@p), p);