Страница 1 из 1

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

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

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

Добавлено: 29 май 2023, 09:30
Игорь Белов
В QGIS задача решается в два действия:
  1. [Multipart to singleparts] (Разбить составную геометрию)
  2. [Add autoincremental field] (Добавить поле с автоприращением);
    задействовать [Group values by] (Поле группирования)
В MapInfo задача тоже решается в два действия:
  1. Освоить MapBasic
  2. Написать утилиту

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 выложите того, что нужно. Гадать по картинкам это такое :mrgreen:

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
Большое спасибо за формулу, она работает! Буду пробовать решить задачу дальше :D