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 .