Как найти пересечение объектов

При анализе картографических данных часто бывает нужно найти объекты из одного слоя, относящиеся к определенным объектам в другом слое. Например, у нас есть слой c административными районами и слой с дорожной сетью, и мы хотим выделить все дороги, относящиеся к одному из районов.

Для этого в MapInfo Pro можно написать небольшой универсальный скрипт на MapBasic, который можно будет сохранить и использовать в дальнейшем во всех таких случаях. Скрипт будет сравнивать выбранные в данный момент объекты (текущую выборку) с объектами из указанной таблицы, и будет отбирать только те записи, которые пересекаются.

Создание скрипта

Откроем окно «SQL», добавленное в MapInfo v2019, из меню на вкладке «Объекты» и создадим в нем следующий скрипт.

Вот его текст для вашего удобства:

Select *
From sTabToQuery
Where OBJ Intersects
(Select AggregateCombine(obj) From Selection)
Into Selection

Давайте рассмотрим запрос немного подробнее.

Таблица, которую мы указали для выбора — sTabToQuery, является не конкретной таблицей, а переменной. Создадим эту переменную с помощью «Редактирования переменных» из раскрывающего списка «Переменные» в окне SQL.

Тип переменной — Таблица. Это означает, что при запуске скрипта MapInfo Pro предложит выбрать таблицу из списка всех открытых таблиц. В поле «Значения» укажем следующее выражение: TableInfo(ScriptContext(SCRIPT_CONTEXT_TABLEALIAS), TAB_INFO_MAPPABLE), чтобы ограничить список таблиц только таблицами с возможностью отображения. В выражение также можно добавить и другие дополнительные условия на ваше усмотрение, например, чтобы в списке были только TABы или нельзя было выбрать растры.

Сохраним новую переменную и вернемся назад в окно SQL.

Обратите внимание на две вещи в «Where» части запроса. Первый заключается в том, что мы указали Intersect в качестве пространственного оператора. Если вы знаете, что будете сравнивать точки с полигонами, вы также можете использовать оператор Within/Contains. Почему не стоит использовать Within/Contains для полигонов и полилиний? Потому, что эти операторы сравнивают центроиды объектов, а центроиды полигона и полилинии зачастую не дают хорошего представления об объекте, т.к. находятся вне его пределов.

Второе, на что следует обратить внимание, это то, что мы используем подвыборку, в которой объединяем объекты из текущей выборки в один объект с помощью пространственного агрегата AggregateCombine. Объединение выбранных объектов обычно выполняется очень быстро. Особенно, если вы используете небольшие полигоны, такие как зоны транспортной доступности или административные границы. Однако, если вы используете полигоны большего размера — например, огромные полигоны покрытия телекоммуникационных компаний, можно заметить, что запрос выполняется медленее обычного.

Не забудьте указать имя для скрипта, а также сохранить его.

Использование скрипта

Выберем интересующий нас площадной объект, например, парковую зону, как в данном примере, состоящую из нескольких полигонов.

Далее из раскрывающегося списка «SQL» на вкладке «Объекты» выберем и запустим созданный нами скрипт.

Появится окошко, где нужно будет только указать талицу, в которой будет производиться поиск пересечений. В данном случае выбран слой с дорогами.

В результате выполнения скрипта создастся новый запрос с объектами из указанного слоя, пересекающими изначальный выбранный объект.

Заключение

Несмотря на то что запрос составлен правильно, он может не дать вам именно то, что вы ищете. Данный запрос возвращает любую запись, которая каким-либо образом пересекает выборку. Это означает, что возвращаемые записи могут лишь частично пересекаться с выборкой. Может быть и такое, что они вообще имеют только один общий узел, формально это тоже считается пересечением.

Поэтому обратите внимание: если вы используете результат этого запроса, то будете использовать объект целиком, а не только ту его часть, которая пересекает выборку. То же самое относится и к значениям атрибутов. Возможно, вы захотите воспользоваться функцией ProportionalOverlap для вычисления пропорциональных значений. Если вы знаете, какие столбцы есть в вашей таблице, вы можете также включить эти пропорциональные вычисления непосредственно в запрос. То есть вместо использования простого оператора Intersect можно добавить более сложные методы для принятия решения о включении или невключении записи в набор результатов.

Другие полезные статьи:

Новые возможности SQL в MapInfo Pro 2019
Расположение файлов таблиц и рабочих наборов в MapInfo Pro
Использование функции ProportionOverlap в MapInfo Pro

Форумы GIS-Lab.info

Геоинформационные системы (ГИС) и Дистанционное зондирование Земли

как найти пересечение двух объектов

Sesc25

Новоприбывший

Сообщения: 7
Зарегистрирован: 18 ноя 2011, 16:14

Репутация: 0

как найти пересечение двух объектов

помогите пожалуйста найти и исправить, где я сделал ошибку

include «mapbasic.def»
Declare Sub Main
Sub Main
Dim pol as object
Dim i As Integer
Dim x1, y1, x2, y2, x3, y3, x4, y4 As Float
Open Table «Poligon.TAB»
map from Poligon
set map layer 1 editable
Fetch first from Poligon
pol=Poligon.obj
Insert Into poligon (obj)
Values (CreateLine (-0.864913, 0.043692, -0.412056, 0.518248))
Set Target pol=poligon.obj
Objects Overlay=poligon.obj
End Sub

делаю компиляцию пишет ошибок нет, запускаю утилиту пишет некорректно выбран изменяемый объект


Andrew

Активный участник

Сообщения: 134
Зарегистрирован: 01 окт 2009, 08:52

Репутация: 3
Откуда: Москва

Re: как найти пересечение двух объектов

Сообщение

Andrew » 28 ноя 2011, 09:59

Если не ошибаюсь, то не хватает выбора объекта перед назначением его изменяемым.


Sesc25

Новоприбывший

Сообщения: 7
Зарегистрирован: 18 ноя 2011, 16:14

Репутация: 0

Re: как найти пересечение двух объектов

Сообщение

Sesc25 » 28 ноя 2011, 11:20

include «mapbasic.def»
Declare Sub Main
Sub Main
Dim pol as object
Dim i As Integer
Dim x1, y1, x2, y2, x3, y3, x4, y4 As Float
Open Table «Poligon.TAB»
map from Poligon
set map layer 1 editable
Fetch first from Poligon
pol=Poligon.obj
Insert Into poligon (obj)
Values (CreateLine (-0.864913, 0.043692, -0.412056, 0.518248))
Select * from poligon
Set Target on pol=poligon.obj
Objects Overlay set target
End Sub
поставил выбрать объект но программа не работает точки не ставятся может другой оператор брать надо?


Boris

Гуру

Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1

Репутация: 433
Откуда: Париж

Re: как найти пересечение двух объектов

Сообщение

Boris » 05 дек 2011, 18:20

Все пересечения мапинфо заточены под пересечение полигонов. Даже полилинии перед пересечением переводятся в них.
Может вот такая функция поможет — IntersectNodes( ) ?


© GIS-Lab и авторы, 2002-2017. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов — ответственность авторов (подробнее).

  • Примеры: Входные полигоны
  • Примеры: Входные линии
  • Пример: Входные точки
  • Примеры: Смешенная геометрия на входе

Инструмент Пересечение (Intersect) вычисляет геометрическое пересечение любого количества классов пространственных объектов и векторных слоёв. Пространственные объекты или части пространственных объектов, общие для всех входных данных (т.е. они пересекаются), будут записаны в выходной класс объектов.

Пересечение делает следующее:

  • Определяет пространственную привязку для обработки. Она также будет пространственной привязкой выходного класса объектов. Более подробно о том, как это происходит, см. в разделе Пространственная привязка (Spatial Reference). Все входные объекты проецируются в эту пространственную привязку для обработки.
  • Выполняет разбиение и кластеризацию пространственных объектов. Разбиение добавляет вершины в местах пересечении ребер пространственных объектов; кластеризация состыковывает вершины в пределах допуска xy.
  • Обнаруживает геометрические отношения (пересечения) между пространственными объектами из всех классов пространственных объектов или слоёв.
  • Записывает эти пересечения как пространственные объекты (точки, линии или полигоны) в выходные данные.

Если в списке входных объектов задано несколько классов пространственных объектов или слоёв, порядок объектов в списке не влияет на тип выходных объектов, но пространственная привязка верхнего объекта в диалоговом окне инструмента (первый объект в скриптах) в списке будет использоваться в процессе обработки и будет установлена на выходные данные.

Чтобы контролировать выходную пространственную привязку (систему координат и домены), установите правильно параметры среды: Выходные Z значения (Output Z Aware) и Выходные M значения (Output M Aware).

Входными данными может быть любая комбинация типов геометрии (точки, мультиточки, линии или полигоны). Геометрия выходного класса объектов должна быть того же измерения, что и входной класс объектов, или на порядок ниже (точка = 0-е измерение, линия = 1-е измерение, полигон = 2-е измерение). Определение разных типов геометрии для выходных данных дает разные типы пересечений входных классов объектов. Это не разное представление одних и тех же пересечений; это пересечения, которые могут быть представлены соответствующим типом геометрии (точки, линии или полигоны).

Примеры: Входные полигоны

Полигоны могут пересекаться тремя способами:

  • Пересечение – Область пересечения создается при установке для параметра Выходной тип значения по умолчанию (INPUT).
  • Общая граница/соприкосновение линий – Этот тип пересечения создается при установке для параметра Выходной тип значения LINE.
  • Соприкосновение в точке – Этот тип пересечения создается при установке для параметра Выходной тип значения POINT.

Входные и выходные полигоны

На рисунке ниже показан результат пересечения двух полигональных классов пространственных объектов с установленным параметром Выходной тип (Output Type) по умолчанию (INPUT). Выходные полигональные объекты соответствуют участкам, где полигон одного из входных классов объектов или слоев пересекает полигон из другого входного класса объектов или слоя.

Пересечение полигонов

Входные полигоны и выходные линии

На рисунке ниже показан результат пересечения двух классов полигональных объектов, где для параметра Выходной тип (Output Type) установлено значение LINE. Выходные линейные объекты находятся там, где полигон одного входного класса имеют общую границу (пересекаются на линии) с полигоном другого входного класса объектов.

Пересечение полигона и линии

Входные полигоны и выходные точки

На рисунке ниже показан результат пересечения двух классов полигональных объектов, где для параметра Выходной тип (Output Type) установлено POINT. Выходные точечные объекты находятся там, где вершина полигона одного входного класса объектов пересекает границу (пересекаются в точке) полигона другого входного класса объектов.

Пересечение полигона с точкой

Пересечение полигона с точкой

Примеры: Входные линии

Если все входные классы пространственных объектов линейные, инструмент Пересечение можно использовать, чтобы выявить места наложения или пересечения входных данных.

Входные и выходные линии. На рисунке ниже показан результат пересечения двух классов линейных объектов, где для параметра Выходной тип (Output Type) установлено LOWEST или LINE. Выходные линейные объекты находятся там, где линейный объект одного входного класса совпадает с линейным объектом другого входного класса объектов.

Принцип работы инструмента Пересечение для линий

Входные линии и выходные точки

На рисунке ниже показан результат пересечения двух классов линейных объектов, где для параметра Выходной тип (Output Type) установлено POINT. Выходные точечные объекты находятся там, где линейный объект одного входного класса объектов пересекает линейный объект другого входного класса объектов.

Пересечение линии и точки

Пример: Входные точки

Если все входные данные являются классами точечных объектов, можно использовать инструмент Пересечение (Intersect) для определения того, какие точки являются общими для всех входных классов объектов.

Пересечение для входных точечных данных

Примеры: Смешенная геометрия на входе

Можно вычислять пересечение для классов пространственных объектов с разными типами геометрии. Используемый по умолчанию Выходной тип (Output Type) аналогичен классу пространственных объектов с геометрией самого низкого порядка.

Входные полигоны и линии и выходные линии

На рисунке ниже показан результат пересечения линейного и полигонального классов объектов, где для параметра Выходной тип (Output Type) установлено LINE. Выходные линейные объекты находятся там, где линия одного входного класса объектов пересекает полигон другого входного класса объектов.

Пересечение полигонов и линий для получения линейных объектов

Входные полигоны и линии и выходные точки

На рисунке ниже показан результат пересечения линейного и полигонального классов объектов, где для параметра Выходной тип (Output Type) установлено POINT. Выходные точечные объекты находятся там, где линии проходят через границы полигонов или оканчиваются на них. Если линии проходят прямо по границам полигонов, выходные точки не создаются.

Пересечение полигонов и линий для получения точечных объектов

Входные полигоны, линии и точки на входе и выходные точки

На рисунке ниже показан результат пересечения точечного, линейного и полигонального классов пространственных объектов. Выходной класс объектов может быть только точечным. Каждая точка выходных данных должна пересекать хотя бы по одному объекту из каждого входного класса пространственных объектов.

Пересечение полигонов и линий для получения точечных объектов

Связанные разделы

  • Пересечение

Понравилась статья? Поделить с друзьями:
  • Убежал кот как найти кота
  • Как найти свитки банастор
  • Как составить уравнение линии по координатам точек
  • Как найти подходящего мужчину для секса
  • Как найти градус география 5 класс