Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Online
Зарегистрирован: 10.06.2008 Сообщения: 26
|
Добавлено: Ср Июн 29, 2016 4:33 pm Заголовок сообщения: Объединение объектов |
|
|
Есть таблица в план-схеме метры. Пусть в ней будет только один полигон (когда их несколько - все тоже самое). Почему, когда я создаю обобщенный объект (применяя операции Union или Combine) - результирующий объект хоть на немного, но отличается от исходного: и площадью, и координатами узлов? Ведь он должен быть один в один с исходным объектом: скриншот.
Код: |
Dim myObj As Object
Create Object As Union From MyTable Into Variable myObj |
Код: |
Dim myObj As Object
Create Region Into Variable myObj 0
Fetch First From MyTable
myObj = Combine(myObj, MyTable.obj) |
|
|
Вернуться к началу |
|
|
thegeo
Зарегистрирован: 17.01.2012 Сообщения: 119
|
Добавлено: Ср Июн 29, 2016 7:48 pm Заголовок сообщения: |
|
|
На мой взгляд, такое поведение связано с назначением рабочей области таблицы. Попробуйте сохранить копию таблицы и установите рабочую область максимально малого размера. |
|
Вернуться к началу |
|
|
Online
Зарегистрирован: 10.06.2008 Сообщения: 26
|
Добавлено: Чт Июн 30, 2016 9:07 am Заголовок сообщения: |
|
|
Попробовать-то можно, но это не выход, согласитесь. Таблицы у меня имеют рабочую область (0,0) (200000, 200000), объекты могут занимать площадь примерно 60-65%. То есть перед операциями объединения (программно) надо пересохранить таблицу (по сути - временно), определив MBR() - как-то это не правильно, даже если поможет... |
|
Вернуться к началу |
|
|
thegeo
Зарегистрирован: 17.01.2012 Сообщения: 119
|
Добавлено: Чт Июн 30, 2016 12:08 pm Заголовок сообщения: |
|
|
Рабочая область 200000x200000 дает дискретность поля координат 0.1 мм, что вообще-то вполне достаточно для большинства применений. Ну и вы меня неправильно поняли, я не предлагал вносить в рабочий процесс процедуру изменения рабочей области.
Без примера таблицы с подобными свойствами можно долго гадать о причинах этого поведения. Какой версией MapInfo вы пользуетесь? |
|
Вернуться к началу |
|
|
Online
Зарегистрирован: 10.06.2008 Сообщения: 26
|
Добавлено: Чт Июн 30, 2016 1:56 pm Заголовок сообщения: |
|
|
Тогда что такое "с назначением рабочей области таблицы"? MapInfo разные, от 11-й версии и выше (x32). А пример таблицы можно самому создать: просто таблица в план-схеме метры с указанным охватом, далее - любой объект нарисовать и попробовать. Даже интересно, какой результат будет у Вас. |
|
Вернуться к началу |
|
|
thegeo
Зарегистрирован: 17.01.2012 Сообщения: 119
|
Добавлено: Чт Июн 30, 2016 9:48 pm Заголовок сообщения: |
|
|
MapInfo 11.5, новая таблица, план-схема, X: 0-200000, Y: 0-200000.
Две области, координаты узлов до объединения полностью совпадают с координатами узлов после объединения (для общих точек). Для объединения использовал штатные средства MapInfo.
PS. Виноват, еще раз просмотрел ваше первое сообщение и приложенный код (в первый раз как то не обратил внимание). В первом случае объединение выполняется через оператор Create Object As Union и результат записывается в переменную, что потом происходит с этой переменной не ясно (что и как контролируется, как объект выводится на карту). Не указан и используемый оператор Set CoordSys.
Выполнил объединение двух объектов через оператор Create Object As Union From tb200000 Into Table tb200000a, никаких расхождений в координатах общих узлов нет (до объединения и после).
Во втором случае имеем несколько странное использование функции Combine, объединяются нулевой объект и некоторый объект из таблицы. Функция Combine возвращает объект, являющийся результатом географического объединения двух объектов, причем функция не меняет объекты аргументы. У вас один из аргументов является и результатом. Вполне возможно такой подход и имеет право на жизнь, но он явно не традиционный. |
|
Вернуться к началу |
|
|
Online
Зарегистрирован: 10.06.2008 Сообщения: 26
|
Добавлено: Чт Июн 30, 2016 10:57 pm Заголовок сообщения: |
|
|
Мне надо именно создать объект для дальнейшего использования. То есть как раз нужен такой код, как я указал в начале. Для проверки я вновь созданный объект вставляю в косметический слой:
Код: |
Dim myObj As Object
Create Object As Union From MyTable Into Variable myObj
Map From MyTable
Insert Into Cosmetic1 (obj) Values(myObj) |
На счет объединения в цикле - в данном примере один контур, когда их несколько, как я уже говорил, результат тот же. Так что, считаю, способ рабочий - к пустому объект добавлять новые объекты. Если бы не эффект смещения, назовем это так.
P.S.:
На самом деле все оказалось просто - надо в обязательном порядке указать Set CoordSys.
Вот в таком примере все работает и я в начале не понял, почему мой пример выдает неточности.
Код: |
Dim myObj, myObjUnion As Object
Create Table "MyTable" (Num Integer) File "MyTable.TAB"
Create Map For MyTable CoordSys NonEarth Units "m" Bounds (0, 0) (200000, 200000)
Set CoordSys Table MyTable
Create Region Into Variable myObj 1 5
(50000, 150000) (150000, 150000) (150000, 50000) (50000, 50000) (25000, 100000)
Insert Into MyTable (obj) Values(myObj)
Create Object As Union From MyTable Into Variable myObjUnion
Insert Into MyTable (obj) Values(myObjUnion)
Map From MyTable
Set Map Zoom Entire
Set Map Layer 1 Display Global Global Pen (1,2,0) Global Brush (1,16777215,16777215)
|
Теперь в моем примере укажем координатную систему и все теперь формируется точно!
Код: |
Dim myObj As Object
Open Table "Слой.TAB"
Set CoordSys Table Слой
Create Object As Union From Слой Into Variable myObj
Insert Into Слой (obj) Values(myObj)
Map From Слой
Set Map Zoom Entire
Set Map Layer 1 Display Global Global Pen (1,2,0) Global Brush (1,16777215,16777215)
|
|
|
Вернуться к началу |
|
|
FedorinoFF
Зарегистрирован: 01.02.2007 Сообщения: 272 Откуда: Санкт-Петербург
|
|
Вернуться к началу |
|
|
|