У вашего клиента, вероятно, истекло время ожидания.
В действительности вы выполняете перекрестное соединение между двумя таблицами, поэтому, если полигон из t1
находится в пределах 100 м от 10 объектов в t2
, будет возвращено 10 раз. Вы, вероятно, хотите отличные полигоны от t1
. чтобы сделать это, вы должны выбрать только на t1
и сохранить строку, когда условие, примененное на t2
, будет выполнено.
Вторая проблема, которая, к сожалению, не вызовет никаких ошибок, заключается в том, что неправильно вычислять расстояния, используя 3857. В Québe c искажение длины составляет около 40%, что огромно. Вам придется либо использовать подходящую локальную проекцию (например, MTM или UTM) для обеих геометрий, либо, если это невозможно, привести к географии, чтобы выполнить вычисление расстояния.
И поскольку вы действительно преобразуете обе геометрии в новый CRS, нельзя использовать пространственный индекс исключительно по геометриям, а вычисление расстояния займет много-много времени, что заставит вашего клиента истечь.
SELECT *
FROM table1 t1
WHERE EXISTS (
SELECT FROM table2 t2
WHERE ST_DWithin(t1.geom::geography, ST_Transform(t2.geom, 4326)::geography, 100)
);
Не забудьте создать пространственный индекс для географии (и / или для преобразованной геометрии)
CREATE INDEX t1_geog ON t1 USING gist(geography(t1.geom);
или
CREATE INDEX t1_32188 ON t1 USING gist(st_transform(geom,32188));