www.map-info.ru :: Просмотр темы - Объединение объектов
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  

 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
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    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

На мой взгляд, такое поведение связано с назначением рабочей области таблицы. Попробуйте сохранить копию таблицы и установите рабочую область максимально малого размера.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 вы пользуетесь?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 возвращает объект, являющийся результатом географического объединения двух объектов, причем функция не меняет объекты аргументы. У вас один из аргументов является и результатом. Вполне возможно такой подход и имеет право на жизнь, но он явно не традиционный.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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
Откуда: Санкт-Петербург

СообщениеДобавлено: Ср Июл 06, 2016 5:46 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

так-то оно так, но даже и с использованием Set coordsys можно получить расхождения. немного наглядных картинок тут https://fedorinoff.blogspot.ru/2013/10/mapinfo.html
ну и чуток подумать....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Top.Mail.Ru