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

MapInfo, MapBasic
Ответить
ram876
Новоприбывший
Сообщения: 1
Зарегистрирован: 26 июл 2023, 09:32
Репутация: 0
Откуда: Татарстан

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

Сообщение ram876 » 26 июл 2023, 10:41

Здравствуйте! У меня есть огромная карта (tab1) с земельными участками. Также есть другая (tab2) почти такая же карта. Мне нужно получить разницу этих карт, а точнее подобъекты (пустоты) из tab1 и чтобы эти пустоты не имелись в tab2. Я удалил часть карты tab1 из tab2. В результате получил те самые искомые пустоты, но на карте также остались и погрешности по краям границы tab2. Они мне не нужны. Если бы их было мало, я бы проверил вручную, но их больше 6 тыс. Попробовал через sql запрос найти эти тонкие линии задав среднюю ширину полигона вот такой формулой:
(Perimeter(obj, "m")-Sqr(Perimeter(obj, "m")*Perimeter(obj, "m")-16*Area(obj, "sq m")))/4
Сначала обрадовался, что теперь могу удалить полигоны со слишком малыми значениями, но потом нашел, что есть пустоты которые имеют площадь 0,07 кв.м. Далее заметил, что у них есть хотя бы один угол близкий к 90 градусам. Такого sql запроса, который бы проверял все углы полигона я не нашел. Потом поискав натолкнулся на мысль, что придется поучить mapbasic. Учебников с подробным объяснением не нашел, в найденных книгах в большинстве сухая документация. На данный момент я написал вот такой код:

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

Dim name as String
name = SelectionInfo(1)
Select (Perimeter(obj, "m")-Sqr(Perimeter(obj, "m")*Perimeter(obj, "m")-16*Area(obj, "sq m")))/4, Area(obj, "sq m")
From name
Where Col1 < 1
Order By Col1 desc
Пока идея была в следующем, в mapinfo я выбираю карту, далее запускаю свой плагин и он должен был выбрать те полигоны, у которых первая колонка имеет значение меньше 1, но так не происходит, плагин ничего не выбирает, а если я задаю условие больше единицы, то он выбирает все. Я так понял, что в select надо как-то задавать тип данных в колонке и как это сделать? И не могу понять, как мне пройтись по каждому полигону, чтобы я смог взять его координаты и посчитать углы? Я знаю, что есть цикл For...Next и нашел, что есть ObjectInfo(obj, OBJ_INFO_NPOLYGONS+i) - показывает количество вершин полигона, есть ObjectNodeX(new_obj, i, n) и ObjectNodeY(new_obj, i, n) - для получения координат вершин. Но не знаю как его использовать в select. Можете помочь с данной задачей? Спасибо!

Ответить

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

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

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