Использование пакета OGR в AstraLinux

Вопросы связанные с работой ГИС Аксиома
Ответить
Аватара пользователя
Mitrich
Сообщения: 49
Зарегистрирован: 21 фев 2024, 14:45

Использование пакета OGR в AstraLinux

Сообщение Mitrich » 30 июл 2024, 12:18

День добрый, уважаемые разработчики!

Прошу Вас подсказать, как можно воспользоваться пакетом OGR, входящим в состав ГИС Axioma, для соединения с базой данных MS SQL Server.

Для соединения с базой данных под Windows я использую строку соединения "MSSQL:Driver=SQL Server;Server=...;GeometryFormat=wkb;".

Под Astra Linux я получаю сообщение
File "/opt/axioma-gis6/python/lib/python3.8/site-packages/osgeo/ogr.py", line 7465, in Open
return _ogr.Open(*args, **kwargs)
RuntimeError: Unable to initialize connection to the server for MSSQL:Driver=SQL Server;Server=...;GeometryFormat=wkb;,

Try specifying the driver in the connection string from the list of available drivers:

И список доступных драйверов пуст
Аватара пользователя
gisamap
Сообщения: 329
Зарегистрирован: 18 окт 2019, 11:03

Re: Использование пакета OGR в AstraLinux

Сообщение gisamap » 30 июл 2024, 12:33

Добрый день.
1. В начале вам нужно получить список драйверов
from osgeo import ogr

for i in range(ogr.GetDriverCount()):
driver = ogr.GetDriver(i)
name = driver.GetName()
print(name)

2. Но не понятно что вы будете делать дальше , когда вам получится подключится к базе через ogr ?
Использовать axipy.OgrDataProvider как мне объяснили разработчики не получится .
Mitrich писал(а): 30 июл 2024, 12:18 День добрый, уважаемые разработчики!

Прошу Вас подсказать, как можно воспользоваться пакетом OGR, входящим в состав ГИС Axioma, для соединения с базой данных MS SQL Server.

Для соединения с базой данных под Windows я использую строку соединения "MSSQL:Driver=SQL Server;Server=...;GeometryFormat=wkb;".

Под Astra Linux я получаю сообщение
File "/opt/axioma-gis6/python/lib/python3.8/site-packages/osgeo/ogr.py", line 7465, in Open
return _ogr.Open(*args, **kwargs)
RuntimeError: Unable to initialize connection to the server for MSSQL:Driver=SQL Server;Server=...;GeometryFormat=wkb;,

Try specifying the driver in the connection string from the list of available drivers:

И список доступных драйверов пуст
Аватара пользователя
Mitrich
Сообщения: 49
Зарегистрирован: 21 фев 2024, 14:45

Re: Использование пакета OGR в AstraLinux

Сообщение Mitrich » 30 июл 2024, 14:26

День добрый!
Спасибо за быстрый ответ.
Я запустил указанный вами скрипт, и получил следующий список:
JP2ECW
...
ESRI Shapefile
MapInfo File
...
SQLite
ODBC
WAsP
PGeo
MSSQLSpatial
OpenFileGDB
DXF
CAD
...
HTTP

в котором есть необходимый мне MSSQLSpatial. Но скорее всего под Linux у вас не полный пакет gdal интегрирован, или какие-то настройки не заданы.

У нас сложилась странная ситуация с чтением данных из базы данных: при обращении к базе данных из ГИС Аксиома происходит блокировка таблиц, при том, что у пользователя нет прав на запись в эту базу данных.
Я написал об ошибке вашим коллегам, но мне ответили, что протестировали и блокировок данных нет viewtopic.php?f=3&t=4158
Мы протестировали на разных серверах - ошибка присутствует.
Возможно, что ошибка связана с использованием старой версии MS SQL Server, но произвести замену продуктивной базы сейчас возможности нет.

При этом, если я стандартными средствами ГИС Аксиома пытаюсь загрузить данные через запрос с использованием JOIN, то получаю ошибку:
Ошибка в функции cursorFromQueryString SQL = SELECT t.ID, t.RegISOGD, t.DOC_NUM, dt.name DOCTYPE,
t.NAME, t.OBJ_ADDRESS, t.OBJ_RAYON ID_RAYON, dist.NAME OBJ_RAYON, ut.name USE_TYPE_PZZ,
t.DOC_STATE, t.REMARK,t.GEOM_OBJ, t.GEOM_STYLE
FROM dbo.ISOGDOBJ t
LEFT JOIN dbo.ISOGDDOCTYPES dt ON dt.ID = t.DOC_TYPE
LEFT JOIN dbo.SK_DISTRICT dist ON dist.KOD = t.OBJ_RAYON
LEFT JOIN dbo.ObjectUseTypes ut ON ut.ID = t.USE_TYPE

Ошибка SQL: [Microsoft][SQL Server Native Client 11.0][SQL Server]Ambiguous column name 'ID'. [Microsoft][SQL Server Native Client 11.0][SQL Server]The cursor was not declared. (SELECT ID FROM dbo.ISOGDOBJ t
LEFT JOIN dbo.ISOGDDOCTYPES dt ON dt.ID = t.DOC_TYPE
LEFT JOIN dbo.SK_DISTRICT dist ON dist.KOD = t.OBJ_RAYON
LEFT JOIN dbo.ObjectUseTypes ut ON ut.ID = t.USE_TYPE )

Появилась идея воспользоваться пакетом OGR, который вы используете, для импорта данных из базы данных во временную таблицу TAB. "ogr2ogr.py" (https://github.com/sourcepole/ogrtools/ ... r883627251).
Под Windows все работает, данные загружаются.

Под linux столкнулся c проблемой, что нет доступных драйверов

Что можете посоветовать?
Аватара пользователя
gisamap
Сообщения: 329
Зарегистрирован: 18 окт 2019, 11:03

Re: Использование пакета OGR в AstraLinux

Сообщение gisamap » 30 июл 2024, 14:58

1. Скрипт с получением списка драйверов вы запускали под Linux ?
2. Не уверен что под Linux не полный пакет .
С проблемой открытия запроса к MSSql через Axioma б понятно это вопрос к разработчикам Axioma.
Но допустим вам через python под Axioma получится открыть layer( запроса) из MsSql , что дальше ?
Mitrich писал(а): 30 июл 2024, 14:26 День добрый!
Спасибо за быстрый ответ.
Я запустил указанный вами скрипт, и получил следующий список:
JP2ECW
...
ESRI Shapefile
MapInfo File
...
SQLite
ODBC
WAsP
PGeo
MSSQLSpatial
OpenFileGDB
DXF
CAD
...
HTTP

в котором есть необходимый мне MSSQLSpatial. Но скорее всего под Linux у вас не полный пакет gdal интегрирован, или какие-то настройки не заданы.

У нас сложилась странная ситуация с чтением данных из базы данных: при обращении к базе данных из ГИС Аксиома происходит блокировка таблиц, при том, что у пользователя нет прав на запись в эту базу данных.
Я написал об ошибке вашим коллегам, но мне ответили, что протестировали и блокировок данных нет viewtopic.php?f=3&t=4158
Мы протестировали на разных серверах - ошибка присутствует.
Возможно, что ошибка связана с использованием старой версии MS SQL Server, но произвести замену продуктивной базы сейчас возможности нет.

При этом, если я стандартными средствами ГИС Аксиома пытаюсь загрузить данные через запрос с использованием JOIN, то получаю ошибку:
Ошибка в функции cursorFromQueryString SQL = SELECT t.ID, t.RegISOGD, t.DOC_NUM, dt.name DOCTYPE,
t.NAME, t.OBJ_ADDRESS, t.OBJ_RAYON ID_RAYON, dist.NAME OBJ_RAYON, ut.name USE_TYPE_PZZ,
t.DOC_STATE, t.REMARK,t.GEOM_OBJ, t.GEOM_STYLE
FROM dbo.ISOGDOBJ t
LEFT JOIN dbo.ISOGDDOCTYPES dt ON dt.ID = t.DOC_TYPE
LEFT JOIN dbo.SK_DISTRICT dist ON dist.KOD = t.OBJ_RAYON
LEFT JOIN dbo.ObjectUseTypes ut ON ut.ID = t.USE_TYPE

Ошибка SQL: [Microsoft][SQL Server Native Client 11.0][SQL Server]Ambiguous column name 'ID'. [Microsoft][SQL Server Native Client 11.0][SQL Server]The cursor was not declared. (SELECT ID FROM dbo.ISOGDOBJ t
LEFT JOIN dbo.ISOGDDOCTYPES dt ON dt.ID = t.DOC_TYPE
LEFT JOIN dbo.SK_DISTRICT dist ON dist.KOD = t.OBJ_RAYON
LEFT JOIN dbo.ObjectUseTypes ut ON ut.ID = t.USE_TYPE )

Появилась идея воспользоваться пакетом OGR, который вы используете, для импорта данных из базы данных во временную таблицу TAB. "ogr2ogr.py" (https://github.com/sourcepole/ogrtools/ ... r883627251).
Под Windows все работает, данные загружаются.

Под linux столкнулся c проблемой, что нет доступных драйверов

Что можете посоветовать?
Аватара пользователя
Mitrich
Сообщения: 49
Зарегистрирован: 21 фев 2024, 14:45

Re: Использование пакета OGR в AstraLinux

Сообщение Mitrich » 30 июл 2024, 16:18

Есть всего 2 момента

1) Таблица в формате TAB в ГИС Аксиома работает намного быстрее, чем таблица из базы данных. На текущем этапе у меня есть потребность только в чтении данных из базы данных.
Оценить скорость работы с базой данных можно загрузив 100000-200000 объектов, которые иногда требуется отобразить пользователю, например загрузите в базу данных из OSM информацию по зданиям Москвы и Московской области попробуйте с ними поработать.
2) Проблемы с ГИС Аксиома при работе с базой данных MS SQL Server. Я немного не понимаю, как устроена ваша внутренняя структура хранения данных, но меня смущают ошибки, которые возникаю при работе с базой данных. Нам обещали, что в новой версии будет реализована возможность использования Trusted_connection при подключении к базе данных, но это осталось нереализованным.

PS.
Сроки "импортозамещания" поджимают, поэтому необходимо определяться, будет использоваться ГИС Аксиома или нет.
Аватара пользователя
Mitrich
Сообщения: 49
Зарегистрирован: 21 фев 2024, 14:45

Re: Использование пакета OGR в AstraLinux

Сообщение Mitrich » 30 июл 2024, 16:29

Отвечаю на Ваши вопросы
1) Да, список драйверов из под Linux
2) Делаем импорт данных в Tab и работаем с локальными данными.
Аватара пользователя
gisamap
Сообщения: 329
Зарегистрирован: 18 окт 2019, 11:03

Re: Использование пакета OGR в AstraLinux

Сообщение gisamap » 30 июл 2024, 16:47

Если список драйверов с Linux
В этом случае как всегда . Последовательно создает тестовые приложения:
- подключение с MsSql
- получение слоя
- копирование ( насколько я помню в ogr можно сразу выполнять copyLayer)
Mitrich писал(а): 30 июл 2024, 16:29 Отвечаю на Ваши вопросы
1) Да, список драйверов из под Linux
2) Делаем импорт данных в Tab и работаем с локальными данными.
Аватара пользователя
Mitrich
Сообщения: 49
Зарегистрирован: 21 фев 2024, 14:45

Re: Использование пакета OGR в AstraLinux

Сообщение Mitrich » 30 июл 2024, 17:39

Спасибо.
Тестовые приложения писать точно придется.
Аватара пользователя
Mitrich
Сообщения: 49
Зарегистрирован: 21 фев 2024, 14:45

Re: Использование пакета OGR в AstraLinux

Сообщение Mitrich » 07 авг 2024, 16:35

С использованием OGR под Linux разобрался. Пришлось напрямую указать путь к драйверу, который необходимо использовать для подключения к базе данных.
Строка подключения в итоге выглядит:
c_str = 'MSSQL:Driver=/opt/axioma-gis6/bin/libtdsodbc.so;Server=server;Database=database;Port=1433;Trusted_Connection=yes;GeometryFormat=wkb;'

Запрос по пространственному полю дополняю преобразованием .STAsBinary() например?
sql = "SELECT ID, NAME, ST_GEOMETRY.STAsBinary() GEOM, MI_STYLE OGR_STYLE FROM dbo.Roads WHERE NAME LIKE 'М-%' "
Конвертацию выполняю
result = ogr2ogr(['ogr2ogr', '-f', 'MapInfo File', filepath, f'{c_str}', '-sql', f'{sql}'])

Конвертация по сравнению со стандартными алгоритмами гис Аксиома выполняется на пару порядков быстрее.

Под Windows не могу разобраться, как в запросе использовать русские символы.
c_str = 'MSSQL:Driver=SQL Server;Server=server;Database=database;Port=1433;Trusted_Connection=yes;GeometryFormat=wkb;'
По умолчанию в скрипте используется кодировка utf-8
запрос "SELECT ID, NAME, ST_GEOMETRY.STAsBinary() GEOM, MI_STYLE OGR_STYLE FROM dbo.Roads WHERE NAME LIKE 'М-%' ".encode('cp1251').decode('cp1251')
В логах ODBC запрос отображается "SELECT ID, NAME, ST_GEOMETRY.STAsBinary() GEOM, MI_STYLE OGR_STYLE FROM dbo.Roads WHERE NAME LIKE '??-%' - т.е. вместо одного русского символа приходят 2 байта (вероятнее всего unicode)

Может быть кто-то подскажет, как корректно передать строку в необходимой кодировке?
Ответить