Поиск и удаление пересекающихся полигонов в MapInfo

MapInfo, MapBasic
Ответить
Balaclawa_Crew
Новоприбывший
Сообщения: 5
Зарегистрирован: 17 дек 2018, 17:33
Репутация: 0
Откуда: Россия, Москва

Поиск и удаление пересекающихся полигонов в MapInfo

Сообщение Balaclawa_Crew » 17 дек 2018, 17:48

Уважаемые Форумчане, доброго дня. Облазил кучу форумов и сайтов, но конкретного ответа так и не нашел.
Поставлена задача: Найти и удалить все пересекающиеся полигоны на карте. Примерное кол-во полигонов примерно 80.000. Про стандартную функцию по поиску пересечений знаю, но как это применить для решения данной задачи не приложу ума. Про SQL запросы тоже читал. Но конкретики, и пошаговых действий так и не нашел.
Может быть найдется тот человек, который сможет все объяснить ОТ и ДО доходчиво.
Возможно ли это сделать в MapInfo и если да, то как? Если это делается через SQL запрос, то что и в какой строке нужно прописывать. Заранее Всем спасибо за ответы! :D :D :D

Аватара пользователя
MI user
Участник
Сообщения: 63
Зарегистрирован: 14 янв 2013, 17:08
Репутация: 33
Откуда: Оренбург

Re: Поиск и удаление пересекающихся полигонов в MapInfo

Сообщение MI user » 17 дек 2018, 18:02

Если нужно использовать SQL-запрос, то:
1) В таблицу добавить колонку для хранения уникального идентификатора. Например, "UID".
2) Заполнить UID не повторяющимися значениями. Меню "Таблица\Обновить колонку", значение ROWID.
3) Сделать копию таблицы. Меню "Таблица\Сохранить копию".
4) Открыть копию.

В итоге должно быть открыто две таблицы, содержащих одинаковые данные. Допустим Tab1 и Tab2.
Тогда SQL-запрос будет такой:

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

SELECT 
Tab1.UID, Tab1.obj 
FROM Tab1, Tab2
WHERE Tab2.obj contains  Tab2.obj and Tab1.UID <> Tab2.UID
Получим список пересекающихся объектов и их UID.

Balaclawa_Crew
Новоприбывший
Сообщения: 5
Зарегистрирован: 17 дек 2018, 17:33
Репутация: 0
Откуда: Россия, Москва

Re: Поиск и удаление пересекающихся полигонов в MapInfo

Сообщение Balaclawa_Crew » 17 дек 2018, 18:08

MI user писал(а):
17 дек 2018, 18:02
В итоге должно быть открыто две таблицы, содержащих одинаковые данные. Допустим Tab1 и Tab2.
Тогда SQL-запрос будет такой:
КОД: ВЫДЕЛИТЬ ВСЁ

SELECT
Tab1.UID, Tab1.obj
FROM Tab1, Tab2
WHERE Tab2.obj contains Tab2.obj and Tab1.UID <> Tab2.UID
Понял, а где в форме SQL-pзапроса прописывать весь этот код? В графе "C Условием"?

Balaclawa_Crew
Новоприбывший
Сообщения: 5
Зарегистрирован: 17 дек 2018, 17:33
Репутация: 0
Откуда: Россия, Москва

Re: Поиск и удаление пересекающихся полигонов в MapInfo

Сообщение Balaclawa_Crew » 17 дек 2018, 18:10

MI user писал(а):
17 дек 2018, 18:02
В итоге должно быть открыто две таблицы, содержащих одинаковые данные. Допустим Tab1 и Tab2.
Тогда SQL-запрос будет такой:
И не направлена ли эта операция на поиск наложений в двух таблицах? Мне нужно найти пересечение полигонов в 1 таблице....

Аватара пользователя
MI user
Участник
Сообщения: 63
Зарегистрирован: 14 янв 2013, 17:08
Репутация: 33
Откуда: Оренбург

Re: Поиск и удаление пересекающихся полигонов в MapInfo

Сообщение MI user » 17 дек 2018, 18:18

Balaclawa_Crew писал(а):
17 дек 2018, 18:10
И не направлена ли эта операция на поиск наложений в двух таблицах? Мне нужно найти пересечение полигонов в 1 таблице....
Да, оператор "contains" ищет вхождение центроида первого объекта во второй. Моя оплошность, не правильно понял задачу. Самому как-то надо было найти объекты-дубли, для этого и код.

Код записывать в окно SQL.
SQL-contains.png
SQL-contains.png (8.84 КБ) 13257 просмотров

Аватара пользователя
MI user
Участник
Сообщения: 63
Зарегистрирован: 14 янв 2013, 17:08
Репутация: 33
Откуда: Оренбург

Re: Поиск и удаление пересекающихся полигонов в MapInfo

Сообщение MI user » 17 дек 2018, 19:02

Пожалуй, вот так можно:

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

Select Area(Overlap(Tab1.Obj, Tab2.Obj), "sq m") "П_Пересечения", Tab1.UID "UID1", Tab2.UID "UID2"
FROM Tab1, Tab2 
WHERE (Tab1.obj intersects Tab2.obj) AND (Tab1.UID <> Tab2.UID) 
Order By П_Пересечения 
Into Пересечения
В результате получим таблицу Пересечения, в которой будет указана площадь пересечения объектов. Если площадь больше 0, значит объект с этим UID точно пересекается с каким-то другим объектом.
Вот например:
SQL-intersects.png
SQL-intersects.png (72.35 КБ) 13227 просмотров

Balaclawa_Crew
Новоприбывший
Сообщения: 5
Зарегистрирован: 17 дек 2018, 17:33
Репутация: 0
Откуда: Россия, Москва

Re: Поиск и удаление пересекающихся полигонов в MapInfo

Сообщение Balaclawa_Crew » 18 дек 2018, 09:57

Это уже интереснее. Только не могу понять, для чего в данном случае Tab2? Как должна выглядеть структура таблиц Tab1 и Tab2?

Balaclawa_Crew
Новоприбывший
Сообщения: 5
Зарегистрирован: 17 дек 2018, 17:33
Репутация: 0
Откуда: Россия, Москва

Re: Поиск и удаление пересекающихся полигонов в MapInfo

Сообщение Balaclawa_Crew » 18 дек 2018, 10:00

MI user писал(а):
17 дек 2018, 19:02
Пожалуй, вот так можно:
Это уже интереснее. Только не могу понять, для чего в данном случае Tab2? Как должна выглядеть структура таблиц Tab1 и Tab2? И Список "Пересечения" нужно самому составлять?

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

Re: Поиск и удаление пересекающихся полигонов в MapInfo

Сообщение trir » 18 дек 2018, 10:03

Tab1 и Tab2 могут быть одной и той же таблицей

zingeroud
Интересующийся
Сообщения: 46
Зарегистрирован: 21 ноя 2013, 15:16
Репутация: 14

Re: Поиск и удаление пересекающихся полигонов в MapInfo

Сообщение zingeroud » 25 мар 2019, 13:45

Добрый день, а подскажите пожалуйста если нужна выборка не по всем объектам Tab1, а по объектам выборки из этой таблицы с неким условием, например CATEGORY_TXT="Земли населенных пунктов"

Ответить

Вернуться в «MapInfo»

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей