Страница 1 из 1

помощь с ST_Distance

Добавлено: 25 апр 2018, 09:13
t[0]p
Здравствуйте!
У меня вопрос по расчету расстояния до точки.
Есть 2 большие таблички с точками. В обеих таблицах есть поле с геометрией (geom). Хочу выбрать объекты из таблицы schema2.table2, которые находятся на расстоянии ближе чем 100 м от объектов из таблицы scema1.table1 т.е. хочу получить расстояние между каждым объектом из table1 и каждым объектом tabl2, а потом выбрать только те объекты, расстояния м/у которыми меньше 100 м. Как это делается?

Попытался в MSSQL сделать что то подобное:

Код: Выделить всё

DECLARE @g geometry
SET @g = (SELECT geom FROM scema1.table1)
SELECT * 
FROM schema2.table2
WHERE (geom.STDistance(@g)) < 100
GO
Нельзя так:

Код: Выделить всё

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Мало того что не понятно как перебрать все расстояния (видимо postgres так же будет ругаться), так в PostgreSQL нету переменных DECLARE =)
Подскажите пожалуйста как быть?

Re: помощь с ST_Distance

Добавлено: 25 апр 2018, 09:31
trir
нужно делать полное пересечение... но не лучше построить буфер по первой таблице и использовать его как фильтр?

Код: Выделить всё

SET @g = (SELECT geometry::UnionAggregate(geom.STBuffer(100)) FROM scema1.table1)

Re: помощь с ST_Distance

Добавлено: 25 апр 2018, 10:51
t[0]p
trir, про буфер то я и не подумал. Похоже это хороший вариант. Единственный его минус - требует версию MSSQL выше чем та что у меня =) А вот про полное пересечение не понял. Имеете в виду UNION/EXCEPT/INTERSECT?

Код: Выделить всё

SELECT geom FROM scema1.table1
UNION ALL
SELECT geom FROM schema2.table2
Если да, то по прежнему не понимаю как с этим что то можно сделать. Если нет, то не понятно, что имеется в виду =) Уточните пожалуйста?

Re: помощь с ST_Distance

Добавлено: 25 апр 2018, 10:56
trir
CROSS JOIN
SELECT t1.geom, t2.geom
FROM scema1.table1 as t1, schema2.table2 as t2
where (t1.geom.STDistance(t2.geom)) < 100

Re: помощь с ST_Distance

Добавлено: 25 апр 2018, 11:11
t[0]p
trir, большое спасибо.
Я малость по другому сделал, но не суть...

Код: Выделить всё

SELECT s.geom AS g1, a.geom AS g2, (s.geom).STDistance(a.geom) AS distance
FROM scema1.table1 AS s
CROSS JOIN schema2.table2 AS a
WHERE ((s.geom).STDistance(a.geom)) < 100

Re: помощь с ST_Distance

Добавлено: 25 апр 2018, 11:17
trir
самое смешное, что CROSS JOIN писать не нужно... а вот помнить про него нужно