Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Вт Окт 28, 2014 2:38 pm Заголовок сообщения: Пересечения, с ними всегда так? |
|
|
Уважаемая аудитория, приветствую.
есть нужда через SQL-запрос и его оператор Intersects отыскать точки пересечения полигона и полилинии.
Пример простой: есть полигон.TAB с одним единственным объектом и записью про него ID = 1
есть пересекающая его неким произвольным образом полилиния.TAB с аналогичной записью ID = 1.
Пересекаются объекты, например, в двух точках.
Как разведать точки пересечения и их координаты.
Может есть иной, чем через SQL-запрос, способ.
Как мне удалось узнать, в своем простом проявлении оператор Intersects великолепно работает с объектами одного типа, а вот в случае с разными типами объектов тупик.
Большое спасибо. |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Вт Окт 28, 2014 3:27 pm Заголовок сообщения: |
|
|
Select с Intersects - отбирает объекты пересекающиеся с заданными.
Если же нужно отыскать в каких точках они пересекаются, то следом надо использовать функцию IntersectNodes. |
|
Вернуться к началу |
|
|
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Вт Окт 28, 2014 4:48 pm Заголовок сообщения: |
|
|
но правильно я понимаю, что Select и Intersects работают с объектами одного слоя или можно их применить для объектов нескольких слоев?
А в части использования IntersectNodes() опыт небольшой есть. Буду экспериментировать.
Спасибо большое. |
|
Вернуться к началу |
|
|
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Вт Окт 28, 2014 5:41 pm Заголовок сообщения: |
|
|
не дождался и разобрался.
Если интересует кого-нибудь, то дело обстоит так (для программы на MapBasic):
Select *
From Lines
Where Lines.obj Intersects (Select obj from cAreas where cAreas.ID = 2)
Into Selection
Спасибо |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Ср Окт 29, 2014 10:09 am Заголовок сообщения: |
|
|
Да, все верно. Intersect в Select можно использовать для поиска пересечений на разных слоях. |
|
Вернуться к началу |
|
|
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Ср Окт 29, 2014 11:57 pm Заголовок сообщения: |
|
|
но есть в этом всем одна хитрость:
Если в
Select *
From Lines
Where Lines.obj Intersects (Select obj from cAreas where cAreas.ID = 2)
Into Selection
значение в поле ID таблицы cAreas, равное ДВУМ, встречается больше, чем для одного объекта, в MapInfo появляется такое предупреждение
"Частичный запрос (подзапрос) возвратил более одного значения".
Т.е. если несколько ОБЪЕКТОВ типа ПЛОЩАДЬ имеют одинаковую характеристику, нет возможности через Intersects в Select установить какие линии пересекают эти ОБЪЕКТЫ?
Тогда альтернатива - предварительно выбирать ОБЪЕКТЫ с одинаковой характеристикой и в этой выборке идти построчно и находить пересечения. |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Чт Окт 30, 2014 9:14 am Заголовок сообщения: |
|
|
Странно. Не помню такого ограничения. Если секцию Where вообще уберете в подзапросе, тоже выдается такое сообщение? Хотя по сути это означает выбор объектов, пересекающих любой объект из подзапроса. |
|
Вернуться к началу |
|
|
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Чт Окт 30, 2014 11:36 am Заголовок сообщения: |
|
|
С Вашей логикой абсолютно согласен, но
если в подзапросе убираем секцию where, MapInfo показывает аналогичное сообщение:
"Частичный запрос (подзапрос) возвратил более одного значения". |
|
Вернуться к началу |
|
|
thegeo
Зарегистрирован: 17.01.2012 Сообщения: 119
|
Добавлено: Чт Окт 30, 2014 1:43 pm Заголовок сообщения: |
|
|
Ничто не мешает переформулировать запрос
Select * from Lines,cAreas where cAreas.ID=2 and cAreas.Obj Intersects Lines.Obj into Selection |
|
Вернуться к началу |
|
|
Alex
Зарегистрирован: 31.10.2008 Сообщения: 80
|
Добавлено: Пт Окт 31, 2014 12:20 am Заголовок сообщения: |
|
|
Знаете, а действительно, если нескольким объектам cAreas.ID присвоить одинаковое значение, например, число 2, то предложенная г-м thegeo строка позволит показать линии слоя Lines, что пересекают объекты cAreas.
Большое спасибо.
Всем приятных выходных. |
|
Вернуться к началу |
|
|
|