Страница 1 из 1
Как найти "сложные" объекты в таблице?
Добавлено: 25 май 2023, 12:44
grandred75
Добрый день.
Подскажите, пожалуйста, как найти "сложные" объекты в таблице. Такие, которые имеют одну запись (строку) в таблице, но состоят из нескольких линий, полигонов и т.п.? Причем, каждый найденный объект нужно разъединить и пронумеровать все элементы находящиеся в нем с 1-го до n (кол-во элементов).
Re: Как найти "сложные" объекты в таблице?
Добавлено: 29 май 2023, 09:30
Игорь Белов
В QGIS задача решается в два действия:
- [Multipart to singleparts] (Разбить составную геометрию)
- [Add autoincremental field] (Добавить поле с автоприращением);
задействовать [Group values by] (Поле группирования)
В MapInfo задача тоже решается в два действия:
- Освоить MapBasic
- Написать утилиту
Re: Как найти "сложные" объекты в таблице?
Добавлено: 01 июн 2023, 21:43
spawner
Objectinfo(obj, 1) вернёт тип обьекта
Какая цифра что означает - смотрите в документации mapbasic
Ещё можно вручную: присвоить какому нибудь полю идентификатор (например rowid), разъединить все объекты слоя
Объекты с одинаковыми идентификаторами будут бывшими членами коллекций. Ну их и нумеровать
Re: Как найти "сложные" объекты в таблице?
Добавлено: 05 июн 2023, 12:39
grandred75
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
Что-то тут не так чувствую, а что в толк не возьму
Re: Как найти "сложные" объекты в таблице?
Добавлено: 05 июн 2023, 21:16
spawner
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 (все остальные)
Re: Как найти "сложные" объекты в таблице?
Добавлено: 09 июн 2023, 14:41
grandred75
spawner писал(а): ↑05 июн 2023, 21:16
Надо именно Objectinfo(obj, 1):
OBJ_INFO_TYPE values ID Corresponding object type
Я благодарен Вам за советы, но в моем случае это не подходит. Возможно, я не правильно сформулировал задачу. Нужно выделить именно линии, а точнее мультилинии, которые пришли из автокада в виде 2-х, 3-х и т.д. объединенных линий.
Такая формула ...:
SELECT * FROM МОЯ_ТАБЛИЦА WHERE int(objectinfo(obj,1))=12
note objectinfo(selection.obj,1)
... годится только для коллекций, которые состоят из полилиний, полигонов и точек или полилиний и полигонов или точек и полигонов и т.д. Но для "коллекций", состоящих только из полилиний такя формула не годится ...
Нужно выделить именно мультилинии (несколько объединенных полилиний) - вот какая задачка.
Re: Как найти "сложные" объекты в таблице?
Добавлено: 09 июн 2023, 16:04
gamm
пример в виде MIF/MID выложите того, что нужно. Гадать по картинкам это такое

Re: Как найти "сложные" объекты в таблице?
Добавлено: 10 июн 2023, 21:15
spawner
grandred75 писал(а): ↑09 июн 2023, 14:41
Нужно выделить именно линии, а точнее мультилинии, которые пришли из автокада в виде 2-х, 3-х и т.д. объединенных линий
В Mapinfo это не коллекции, это просто полилинии из нескольких не связных кусков. Выделять так (запускаете команду в окне mapbasic):
Select * From МОЯ_ТАБЛИЦА where Int(ObjectInfo(obj,1))=4 into tmp noselect
Select * from tmp where Int(ObjectInfo(obj,21))>1
первая строка делает временную таблицу со всеми полилиниями
вторая строка из этой таблицы выбирает все полилинии у которых кол-во кусков больше 1
Re: Как найти "сложные" объекты в таблице?
Добавлено: 23 июн 2023, 09:02
grandred75
spawner писал(а): ↑10 июн 2023, 21:15
Select * From МОЯ_ТАБЛИЦА where Int(ObjectInfo(obj,1))=4 into tmp noselect
Select * from tmp where Int(ObjectInfo(obj,21))>1
Большое спасибо за формулу, она работает! Буду пробовать решить задачу дальше
