Как найти "сложные" объекты в таблице?

MapInfo, MapBasic
Ответить
grandred75
Интересующийся
Сообщения: 22
Зарегистрирован: 29 апр 2021, 10:38
Репутация: 1
Откуда: Москва

Как найти "сложные" объекты в таблице?

Сообщение grandred75 » 25 май 2023, 12:44

Добрый день.
Подскажите, пожалуйста, как найти "сложные" объекты в таблице. Такие, которые имеют одну запись (строку) в таблице, но состоят из нескольких линий, полигонов и т.п.? Причем, каждый найденный объект нужно разъединить и пронумеровать все элементы находящиеся в нем с 1-го до n (кол-во элементов).

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2206
Зарегистрирован: 04 янв 2011, 22:00
Статьи: 12
Проекты: 1
Репутация: 1493
Откуда: Казань

Re: Как найти "сложные" объекты в таблице?

Сообщение Игорь Белов » 29 май 2023, 09:30

В QGIS задача решается в два действия:
  1. [Multipart to singleparts] (Разбить составную геометрию)
  2. [Add autoincremental field] (Добавить поле с автоприращением);
    задействовать [Group values by] (Поле группирования)
В MapInfo задача тоже решается в два действия:
  1. Освоить MapBasic
  2. Написать утилиту
The purpose of computing is insight, not numbers

spawner
Участник
Сообщения: 62
Зарегистрирован: 09 окт 2009, 16:49
Репутация: 4

Re: Как найти "сложные" объекты в таблице?

Сообщение spawner » 01 июн 2023, 21:43

Objectinfo(obj, 1) вернёт тип обьекта
Какая цифра что означает - смотрите в документации mapbasic

Ещё можно вручную: присвоить какому нибудь полю идентификатор (например rowid), разъединить все объекты слоя

Объекты с одинаковыми идентификаторами будут бывшими членами коллекций. Ну их и нумеровать

grandred75
Интересующийся
Сообщения: 22
Зарегистрирован: 29 апр 2021, 10:38
Репутация: 1
Откуда: Москва

Re: Как найти "сложные" объекты в таблице?

Сообщение grandred75 » 05 июн 2023, 12:39

spawner писал(а):
01 июн 2023, 21:43
Objectinfo(obj, 1) вернёт тип обьекта
Какая цифра что означает - смотрите в документации mapbasic
По этой логике должно подойти ObjectInfo(obj, 21) или Val(Str$(ObjectInfo(obj,21))) > 1 , но нет, не работает ...
Попробовал вариант с OBJ_INFO_NPOLYGONS+1 тоже не выходит ...

Sub Main
Dim count, n As Integer
Dim CurrentTable as string
For n = 1 to NumTables( )
count = count + 1
Select * from CurrentTable where ObjectInfo(obj, 21)
'Select * from CurrentTable where Val(Str$(ObjectInfo(obj,21))) > 1
'Select * from CurrentTable where ObjectInfo(CurrentTable.obj, OBJ_INFO_NPOLYGONS+1)
Next
End Sub

Что-то тут не так чувствую, а что в толк не возьму

spawner
Участник
Сообщения: 62
Зарегистрирован: 09 окт 2009, 16:49
Репутация: 4

Re: Как найти "сложные" объекты в таблице?

Сообщение spawner » 05 июн 2023, 21:16

grandred75,
OBJ_INFO_NPOLYGONS+N это кол-то точек в контуре N многоконтурного полигона

Надо именно Objectinfo(obj, 1):
OBJ_INFO_TYPE values ID Corresponding object type
OBJ_TYPE_ARC 1 Arc object
OBJ_TYPE_ELLIPSE 2 Ellipse / circle objects
OBJ_TYPE_LINE 3 Line object
OBJ_TYPE_PLINE 4 Polyline object
OBJ_TYPE_POINT 5 Point object
OBJ_TYPE_FRAME 6 Layout window Frame object
OBJ_TYPE_REGION 7 Region object
OBJ_TYPE_RECT 8 Rectangle object
OBJ_TYPE_ROUNDRECT 9 Rounded rectangle object
OBJ_TYPE_TEXT 10 Text object
OBJ_TYPE_MULTIPOINT 11 Collection point object
OBJ_TYPE_COLLECTION 12 Collection object

Удобнее всего добавить временное поле, и туда записать (обновить колонку) ObjectInfo(obj,1). Все коллекции будут иметь номера 11 (мульти-точки) и 12 (все остальные)
Вложения
2023-06-05_23-13-54.png
2023-06-05_23-13-54.png (7.59 КБ) 73 просмотра

Ответить

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

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

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