помощь с ST_Distance

Ответить
Аватара пользователя
t[0]p
Участник
Сообщения: 93
Зарегистрирован: 15 ноя 2014, 14:35
Репутация: 7
Откуда: Томск

помощь с ST_Distance

Сообщение t[0]p » 25 апр 2018, 09:13

Здравствуйте!
У меня вопрос по расчету расстояния до точки.
Есть 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 =)
Подскажите пожалуйста как быть?
Последний раз редактировалось t[0]p 25 апр 2018, 12:02, всего редактировалось 1 раз.

trir
Гуру
Сообщения: 5271
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1013
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: помощь с ST_Distance

Сообщение trir » 25 апр 2018, 09:31

нужно делать полное пересечение... но не лучше построить буфер по первой таблице и использовать его как фильтр?

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

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

Аватара пользователя
t[0]p
Участник
Сообщения: 93
Зарегистрирован: 15 ноя 2014, 14:35
Репутация: 7
Откуда: Томск

Re: помощь с ST_Distance

Сообщение t[0]p » 25 апр 2018, 10:51

trir, про буфер то я и не подумал. Похоже это хороший вариант. Единственный его минус - требует версию MSSQL выше чем та что у меня =) А вот про полное пересечение не понял. Имеете в виду UNION/EXCEPT/INTERSECT?

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

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

trir
Гуру
Сообщения: 5271
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1013
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: помощь с ST_Distance

Сообщение trir » 25 апр 2018, 10:56

CROSS JOIN
SELECT t1.geom, t2.geom
FROM scema1.table1 as t1, schema2.table2 as t2
where (t1.geom.STDistance(t2.geom)) < 100

Аватара пользователя
t[0]p
Участник
Сообщения: 93
Зарегистрирован: 15 ноя 2014, 14:35
Репутация: 7
Откуда: Томск

Re: помощь с ST_Distance

Сообщение t[0]p » 25 апр 2018, 11:11

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

trir
Гуру
Сообщения: 5271
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1013
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: помощь с ST_Distance

Сообщение trir » 25 апр 2018, 11:17

самое смешное, что CROSS JOIN писать не нужно... а вот помнить про него нужно

Ответить

Вернуться в «PostGIS/PostgreSQL»

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 2 гостя