gamm писал(а): ↑22 ноя 2024, 18:35
Никакие структуры gdal в Питон не передает (незачем), в Питоне есть обертки для функций gdal, и все, вот они и вызываются. Все структуры описаны в головниках gdal, если хотите чего-нибудь изучить, смотрите головники и исходники, или пишите программу на С++, и бродите в отладчике.
Я хотел просто распечатать названия слоев в GPKG, имена и типы полей. В перспективе пройтись по выбранным полям, чтобы проанализировать их состав и размер, в следующей перспективе - поправить.
OGRINFO выдает с одной стороны лишние, с другой стороны недостаточные данные - не считает правильно тип и размер полей. Сидеть вычленять из текстового файла поля, по нетривиальным параметрам, я посчитал глупым, если есть, как я полагал, доступ к данным через язык программирования. В С и С++ лезть не хотелось, я взял официально декларированный как "вам хватит" python. Опыт программирования в нем, при разумной документации, у меня есть.
Но, тут я потерялся сразу - запустил тестовый пример:
Код: Выделить всё
# Is Ogr Installed ?
try:
from osgeo import ogr
print('Import of ogr from osgeo worked. Hurray!\n')
except:
print('Import of ogr from osgeo failed\n\n')
# Get List of Ogr Drivers Alphabetically (A- Z)
# It’s always driven me a little nuts that the command line ogr2ogr –formats
# returns a ‘random’ list of drivers. This code returns the list of OGR
# drivers alphabetically from A - Z. .
# import ogr
cnt = ogr.GetDriverCount()
formatsList = [] # Empty List
for i in range(cnt):
driver = ogr.GetDriver(i)
driverName = driver.GetName()
if not driverName in formatsList:
formatsList.append(driverName)
t = (driver.name, driver.GetDescription(), [b]driver.getLongName())
# driver.GetShortName(), \
# driver.GetLongName(), )[/b]
print(t)
formatsList.sort() # Sorting the messy list of ogr drivers
for i in formatsList:
print(i)
Ради интереса, я захотел увидеть дополнительную информацию о драйверах OGR, для начала
driver.getLongName() и
driver.GetShortName()
Описание класса
driver ссылаются один на другой и отсылают к классу C++ (наверное). В документации python API описание функции дано строкой, без расшифровки полей, и возвращаемого значения. Предложено посмотреть исходную документации на функцию С++. Но, я что-то и там не нашел никаких разъяснений какими свойствами обладает возвращенный объект. Во многих языках, если были у меня сомнения в документации, я загружал код в отладчик и смотрел, что за объект мне вернулся. Если функци он мне мог и не показать, то поля (свойтва) должен отобразить. В python'е в pyCharm'е я так делал. Из того, что вместо
driver.GetName() можно использовать
driver.name я предположил, что все таки возвращается некий объект класса. Возможно, что в части GDAL я ошибся.
В любом случае, программирование без элементарного отладчика - занятие очень странное.
PS
Я хочу использовать python+GDAL+[ IDE с отладчиком | отдельный отладчик ]. GDAL я не компилировал:
1. Взял тот, что входит в OSGeo4W и его python 3.12. Создал как смог, быстро, venv в PyCharm по мотивам переменных окружения, что устанавливает OSGeo4W для свое оболочки командной строки. GDAL подключился, отработал. НО отладчик работать с этой версией(?), компиляцией(?) python отказался. Много букв выдал при запуске - смысл "не нахожу какого-то модуля, который считаю, что должен быть". Ок - не хочу разбираться.
Попробую иной вариант:
2. Создаю пустую venv в PyCharm. Проверяю - отладчик на ней работает. Пытаюсь поставить GDAL через встроенный механизм установки - пишет, что хочет что-то скомпилировать и для этого надо поставить "Windows Kits" с сайта микрософта. Ок. Поставил. Запустил заново - похоже, действительно, зачем-то запустилась компиляция GDAL из исходных файлов c/h. На каком-то из них не хватает заголовочного h-файла. Запустил pip из оболочки с теми же переменными окружения - результат такой же. Не хочу вникать и разбираться что и зачем компилирует.
Хочу чтобы работало: python+GDAL+[ IDE с отладчиком | отдельный отладчик ]
Собственно в этом в весь вопрос : "Какой пакет или среду поставить чтобы реализовать эту хотелку?" Неужели все GDAL python API программируют без среды и отладчика? Может где-то и документация по функциям есть написанная для использования API, а не для изучения исходных кодов библиотек на С? Или книжка какая?