Карты, слои, таблицы

Вопросы связанные с работой ГИС Аксиома
Ответить
Аватара пользователя
Alex_Y
Сообщения: 33
Зарегистрирован: 26 янв 2021, 06:40

Карты, слои, таблицы

Сообщение Alex_Y » 21 мар 2022, 11:29

Здравствуйте.
Несколько вопросов по работе с картами и слоями и около них ;)

1. Есть минимизированное окно карты. Нашел его через view_manager.mapviews. Как его восстановить до нормального состояния или раскрыть его на весь экран?
2. В аксиоме принцип работы с областью охвата проекции такой же как а мапинфо или котличается? Я об округлении координат. В мапинфо для округления до 0.01 нужно указать область охвата от 0 до 20млн. Аксиоме также?
3. Есть слой в SQLite с проекцией план-схема. Открываю его, все нормально, но, при этом область охвата устанавливает от -20 млн до 20 млн. Как программно установить слою свою область охвата? Bли можно как-то указать область в самом sqlit? Там указано так: LOCAL_CS["NonEarth_Meter",UNIT["METER",1]].
4. Когда программно открываю таблицу из базы SQLIte, не создается файл tab. При открытии из программы аксиома предлагает сохранить такой файл. Как создать tab файл из программы, чтобы можно было его использовать и в мапинфо?

Возможно вопросы глупые, я только начал изучать аксиому и питон :)
Аватара пользователя
Дмитрий
Сообщения: 56
Зарегистрирован: 04 июн 2019, 08:33

Re: Карты, слои, таблицы

Сообщение Дмитрий » 22 мар 2022, 13:03

Здравствуйте.

1.
Это несколько нетривиальная задача. У нас для окон выведено свойство, указывающее на объект QWidget, в котором содержится окно карты, отчета или таблицы просмотра. Но это окно помещено в другое окно - область скроллинга, а последнее в QMdiSubWindow, которое и управляется поведением внутри QMDIArea.
Т.е. MapView -> ScrollArea -> QMdiSubWindow

В итоге на данный момент задачу можно решить так:

Код: Выделить всё

mv = view_manager.mapviews.active.widget
mv.widget.parent().parent().showMaximized()
ну или с проверками:

Code: Select all

mdi_child = axipy.gui.view_manager.active.widget if axipy.gui.view_manager.active is not None else None
while mdi_child is not None and mdi_child.__class__.__name__ != 'QMdiSubWindow':
mdi_child = mdi_child.parent()
if mdi_child is not None:
# mdi_child.showNormal()
mdi_child.showMaximized()
Мы подумаем как это можно упростить. И доработаем этот вопрос.

2.
Это определяется форматом файла MapInfo.
Точность данных в tab-файле равна диапазону охвата разделённому на 2 миллиарда
(20 000 000 - 0) / 2 000 000 000 = 0,01
Да, также

3.
Какая причина задания охвата в sqlite? Охват для SQLite не увеличивает точность данных (в отличие от TAB MapInfo), т.к. данные содержатся в виде вещественных чисел.

Код: Выделить всё

table = provider_manager.sqlite.open('non_earth.sqlite', 'non_earth')
layer = Layer.create(table)
print('bound:', layer.bounds)
print('cs:', layer.coordsystem)

Вывод:
>>> bound: (-1578000.0 -203000.0) (1610000.0 1485000.0)
>>> cs: wkt:LOCAL_CS["Nonearth",UNIT["Meter",1],AXIS["Easting",EAST],AXIS["Northing",NORTH]]
Используемый файл см. в аттаче.

Свою область можно указать только через таблицу mapinfo_mapcatalog по аналогии с СУБД (пример см аттач). Или использовать gpkg, где в метаданных есть охват.


4.
На данный момент эта функция не реализована. Появится в следующей версии.
Вложения
non_earth.sqlite.zip
(1.21 КБ) 249 скачиваний
Аватара пользователя
Alex_Y
Сообщения: 33
Зарегистрирован: 26 янв 2021, 06:40

Re: Карты, слои, таблицы

Сообщение Alex_Y » 23 мар 2022, 04:03

1. Во, то, что нужно. Свойство widget я нашел и на нем не сработала максимизация. Так и подумал, что есть какой-то родитель. А вот какой и сколько их не знал.
Спасибо за подсказку. Все отлично сработало.

3. В области возникает необходимость когда открываем слой в карте и тогда начинает скакать округление. Поэтому проще сразу открыть с нужной областью.
Вопрос возник по той причине, что я свой таб-файл с областью (скажем 0 до 20 000 000) сохраняю в SQLitе и информация по ней пропадает. При открытии получаю область, которую ставит Аксиома, а это от -20 000 000 до 20 000 000. Если в ней округление как в мапинфо, то это получается округление координаты до 0.02, что не есть хорошо.

Т.е. получается Аксиома хоть и не создает таблицу mapinfo_mapcatlog, но при открытии слоя его использует, если он есть?
Аватара пользователя
Александр
Сообщения: 405
Зарегистрирован: 18 апр 2019, 08:21

Re: Карты, слои, таблицы

Сообщение Александр » 23 мар 2022, 16:37

Alex_Y писал(а): 23 мар 2022, 04:03 3. В области возникает необходимость когда открываем слой в карте и тогда начинает скакать округление.
Это касается только если Вы работаете с TAB-форматом.
В SQLite координаты хранятся в вещественных числах с точностью 15 значащих десятичных знаков.
Вопрос возник по той причине, что я свой таб-файл с областью (скажем 0 до 20 000 000) сохраняю в SQLitе и информация по ней пропадает.
Да пропадает, т.к. информация о системе координат сохраняется в формате WKT. А в нём нет информации об охвате.
При открытии получаю область, которую ставит Аксиома, а это от -20 000 000 до 20 000 000.
То, что в этом случае можно получить такой охват это наша недоработка. Я завёл задачу на её решение.
Если в ней округление как в мапинфо, то это получается округление координаты до 0.02, что не есть хорошо.
Округление не как в MapInfo, точнее не как в TAB-файле. Точность, как уже, писал 15 знаков. Если 8 знаков до запятой, то после запятой точность составит 0.0000001.
Т.е. получается Аксиома хоть и не создает таблицу mapinfo_mapcatlog, но при открытии слоя его использует, если он есть?
Да, если в SQLite есть таблица mapinfo_mapcatlog, то Аксиома прочитает данные о системе координат и другую информацию
Аватара пользователя
Alex_Y
Сообщения: 33
Зарегистрирован: 26 янв 2021, 06:40

Re: Карты, слои, таблицы

Сообщение Alex_Y » 28 мар 2022, 06:59

Здравствуйте.

Поясните пожалуйста отличия работы команд close (close_all) и remove (remove_all).
Если я закрываю таблицу в DataObject.close()? то она исчезает из DataManager, но физически не закрывается, т.к. если сохранить рабочий набор и посмотреть его, то эта таблица в нем будет и она откроется при открытии рабочего набора. Приходится делать data_manager.remove(tab). Это ошибка в аксиоме или такая фича?

Также, если я выполняю команду в аксиоме "Закрыть все", вроде все закрывается. Но, при этом папку со слоями, которые закрыл, я удалить не могу, пишет объект открыть в axioma.exe.
Хотя я уже открыл сои из другой папки и с этой меня ничего связывать не должно. Т.е. при закрытии, источник данных не освобождается. Может причина в использовании SQLLite, но, я же вообще все закрываю, значит и все связи должны закрываться?

И еще вопрос, есть ли возможность вызвать диалог действия с измененной таблицей при закрытии (по аналогии с мапинфо Interactive)?
Аватара пользователя
Дмитрий
Сообщения: 56
Зарегистрирован: 04 июн 2019, 08:33

Re: Карты, слои, таблицы

Сообщение Дмитрий » 28 мар 2022, 09:50

Здравствуйте!

Как написано в помощи, при вызове Table.close она закрывается не сразу. Это связано с тем, что у нее могут быть зависимые объекты, такие как запросы и чтобы обработать это нужно некоторое время.
DataManager.remove удаляет таблицу из каталога, но не дает команду на ее закрытие.

2. открываю фйл sqlite в аксиоме. Закрываю его. Каталог из файловой системы удаляется. Что нужно сделать дополнительно, чтобы повторить проблему?

3. Диалог не вынесен в интерфейс. Это можно сделать самостоятельно:

Код: Выделить всё

table = provider_manager.openfile('world.tab')

p = Point(3,3)
fpoint = Feature(
        {},
        geometry = p,
        style = Style.for_geometry(p)
)

table.insert(fpoint)

if table.is_modified:
    if QMessageBox.question(None, 'Вопрос', 'Восстановить?') == QMessageBox.Yes:
        table.restore()
Аватара пользователя
Alex_Y
Сообщения: 33
Зарегистрирован: 26 янв 2021, 06:40

Re: Карты, слои, таблицы

Сообщение Alex_Y » 29 мар 2022, 05:19

Здравствуйте.

2. Установил версию 3.7, проблема исчезла. То ли в версии дело, то ли я у себя косяк устранил непонятно. Главное, что работает :)
3. Ясно, спасибо.

Еще пару вопросов:
1. Как мне получить источник данных открытой таблицы?
Многострадальный SQLIite.
DataObject.provider выдает только название провайдера, от которого пользы никакой.
DataObject.properties выдает пустой список.
Можно бы было прочитать из метаданных tab-файла, но при программном открытии из SQLIite он не создается.
Есть еще какие-нибудь варианты?
Или придется делать костыль в виде своего создания tab-файла...

2. Вешаю сигнал на data_changed. Вопрос, как мне в сигнале обработать эти изменения? Никакие параметры в него не передаются.
Аватара пользователя
Дмитрий
Сообщения: 56
Зарегистрирован: 04 июн 2019, 08:33

Re: Карты, слои, таблицы

Сообщение Дмитрий » 29 мар 2022, 13:13

Здравствуйте!

1. Генерацию TAB файла мы реализовали. Релиз ориентировочно в мае.
Ссылку на локальный файл, если источник открывался как файл, добавили.
Если необходимо, ссылку на техническую версию можем выслать по запросу на почту support @ axioma-gis.ru (без пробелов).

2. На данный момент фиксируется только факт изменения. Попробуем подумать в этом направлении.
Аватара пользователя
Alex_Y
Сообщения: 33
Зарегистрирован: 26 янв 2021, 06:40

Re: Карты, слои, таблицы

Сообщение Alex_Y » 27 ноя 2023, 10:45

1. Так и не понял, как создать tab программно из SQLite базы.
Пробую два варианта открытия.

Код: Выделить всё

1.
provider_manager.sqlite.open(os.path.join(path, DB_FILE), sql=Sql, alias=lay_alias)
2.
provider_manager.openfile(os.path.join(path, DB_FILE), sql=Sql, alias=lay_alias)
Ни один не создает tab-файл.

2. Если я при открытии указываю не dataobject, а sql запрос, то при внесении объектов, при сохранении выходит ошибка:
Ошибка SQL: (SQLITE):no such table: : Select * From Parcels_Contours_2401 (path: 'D:\qqqq\mis_prj.db')
Таблица такая есть, sqk запрос корректный.
Ответить