2 votos

¿Consulta ST_DWithin dando error 42601?

Intento obtener de un punto concreto más información sobre los alrededores (que también son puntos). Así que escribí esto:

SELECT *
   FROM osm_point
   WHERE ST_DWithin(way,(ST_SetSRID(ST_MakePoint(12.2385578688105, 51.8435615931295), 4326, 1000);

Pero hay un error

ERROR: FEHLER: LINE 3: ...T_MakePoint(12.2385578688105, 51.8435615931295), 4326, 1000) ^ Estado SQL: 42601 Carácter: 133

¿Qué ocurre?

5voto

Andre Silva Puntos 2910

El error SQL 42601 es un error de sintaxis (ver aquí ). Básicamente, tenías un paréntesis de apertura extra antes de ST_SetSRID y también un paréntesis de cierre que falta para la misma función.

Si el tipo de datos de osm_point.way columna es geometry hay que lanzarlo a geography con el fin de ST_DWithin evaluar a distancias geodésicas (en lugar de distancias planas) y en metros (si las unidades de referencia espacial no están ya en metros). El mismo reparto a geography es válido para ST_MakePoint cuya salida es de tipo geometry y las unidades de la CRS 4326 aplicada es grados, pero usted quiere metros.

Por lo tanto, utilice la siguiente consulta:

SELECT *
FROM osm_point
WHERE ST_DWithin(way::geography, ST_SetSRID(ST_MakePoint(12.2385578688105, 51.8435615931295), 4326)::geography, 1000);

Al utilizar ST_DWithin hay que comparar los datos que tienen el mismo SRID. Así, si la columna osm_point.way tiene un SRID diferente (usted dijo EPSG:3857) desde EPSG:4326 (el SRID que utilizó para definir las coordenadas con ST_MakePoint ), primero hay que transformar las coordenadas. Para ello, utilice ST_Transformación . Ver:

SELECT * 
FROM osm_point 
WHERE ST_DWithin(ST_Transform(way, 4326)::geography, ST_SetSRID(ST_MakePoint(12.2385578688105, 51.8435615931295), 4326)::geography, 1000);

Sobre el uso de índices para acelerar las consultas, como sugiere @Vince, echa un vistazo en:

Configuración de índices para consultas de distancia en PostGIS .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X