Работа с векторными данными при помощи OGR и Python

Обсуждение материалов сайта: вопросы, замечания, предложения
updates-bot
Bot
Сообщения: 276
Зарегистрирован: 03 фев 2008, 23:13
Репутация: 3

Работа с векторными данными при помощи OGR и Python

Сообщение updates-bot » 15 апр 2010, 05:19

Обсуждение статьи "Работа с векторными данными при помощи OGR и Python"

http://gis-lab.info/qa/ogr-python.html

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Статьи: 4
Проекты: 3
Репутация: 55
Откуда: Королев

Re: Работа с векторными данными при помощи OGR и Python

Сообщение yellow-sky » 15 апр 2010, 10:13

Статья очень хорошая и полезная!
Но хотелось бы немного добавить по тексту:
  • При открытии DataSource, все таки лучше явно указывать драйвер явно, как это сделано в 5том пункте - огр ведет себя непредсказуемо когда в одной физической директории находятся данные разных форматов. Но если в роли DataSource - конкретный файл - проблем ни каких нет.
  • При обращению к слою в GDAL 1.6 можно использовать индексаторы - это более походит на python-style:

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

         # обращаемся к слою по индексу
         layer = ogrData.GetLayer( 0 )
        # или
         layer = ogrData[0]
    
         # или по имени
          layer = ogrData.GetLayerByName( "points" )
         # или
          layer = ogrData["points"]
    
    Индексаторы очень удобны при работе в циклах:

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

    #все слои в датасорсе
    for layer in ogrData:
        print layer.GetName()
    
  • В примере получения информации и работы с объектами строку

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

    featDef = layer.GetLayerDefn() # схема (таблица атрибутов) слоя 
    нужно вынести за границы цикла (такая же опечатка и в самом последнем скрипте) (кстати куда то пропал пункт за номером 6 )

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 8896
Зарегистрирован: 06 окт 2003, 20:20
Статьи: 231
Проекты: 12/6
Репутация: 640
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Максим Дубинин » 15 апр 2010, 18:13

Спасибо за комментарии (хотя я не автор статьи).

Я поправил названия разделов, добавил варианты обращения к слою и вынес layer.GetLayerDefn() из цикла.

Voltron, я тоже приношу благодарности за статью, я уже на основе твоего скрипта сделал свой и OGR уже пошел перемалывать 500 мегабайтные шейп-файлы. Прощай Arcinfo. Спасибо.
пристегивайтесь, турбулентность прямо по курсу

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Статьи: 31
Проекты: 4/1
Репутация: 32
Откуда: Ukraine

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Voltron » 15 апр 2010, 20:20

Спасибо за комментарии и отзывы. Рад, что статья пришлась ко двору и уже есть первые результаты, полученные с ее помощью

antimirov
Новоприбывший
Сообщения: 1
Зарегистрирован: 11 июн 2010, 12:27
Репутация: 0

Re: Работа с векторными данными при помощи OGR и Python

Сообщение antimirov » 11 июн 2010, 12:28

Спасибо, полезная статья. Мне нужно было скопировать схему одного shapefile в другой, а тут всё уже есть :)

Boris
Гуру
Сообщения: 3927
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 349
Откуда: Париж

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Boris » 10 сен 2010, 14:51

Если можно чуть подробней как от
Будем исходить из того, что все программное обеспечение установлено при помощи установщика OSGeo4W. Для использования OGR совместно с Python необходимо наличие соответствующих обёрток для этого языка (bindings). В стеке программ OSGeo4W нужный пакет называется gdal-python (для GDAL/OGR 1.5.x) или gdal16-python (для GDAL/OGR 1.6.x). Рекомендую использовать версию 1.6.x.
перейти к общению с python? а то на команду "gdal16-python" командная строка OSGeo4W не реагирует, а если просто запустить python, то после набранной команды

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

from osgeo import ogr
выходит сообщение
>>> from osgeo import ogr
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\OSGeo4W\apps\gdal-17\pymod\osgeo\__init__.py", line 24, in <module>
import _gdal
ImportError: DLL load failed: The specified module could not be found.

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Статьи: 31
Проекты: 4/1
Репутация: 32
Откуда: Ukraine

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Voltron » 10 сен 2010, 16:01

Статья немного устарела, уже есть gdal17 и gdal17-python соответственно. И, судя по сообщению об ошибке, именно они используются по умолчанию.

Чтобы перейти к "общению с python" необходимо:
  • открыть командную строку OSGeo4W
  • дать команду gdal17.bat (или gdal16.bat, если используется старая версия)
  • запустить Python и начать работать
Перед запуском готовых скриптов тоже необходимо установить необходимые переменные окружения, т.е. запустить gdal17.bat. Если на компьютере нет еще одной инсталляции Python, то необходимые пути можно прописать один раз "Пуск-Настройки-Панель управления-Система-Дополнительно-Переменные среды"

Boris
Гуру
Сообщения: 3927
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 349
Откуда: Париж

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Boris » 11 сен 2010, 09:20

видимо придется попросить еще подробней ;(
  • gdal17 - я запускаю, видимо это и есть gdal17.bat
    запустить Python и начать работать
    - что надо большее сделать, чем набрать в строке команду Python ? если просто команду, то он у меня запускается.
    но при подключении библиотеки он же находит импортируемый файл, но не находит потом библиотеку, которая лежит рядом с импортируемым файлом:
C:\OSGeo4W\apps\gdal-17\pymod>dir /s /o:n
Volume in drive C is

Directory of C:\OSGeo4W\apps\gdal-17\pymod

10.09.2010 13:02 <DIR> .
10.09.2010 13:02 <DIR> ..
26.08.2010 17:24 128 gdal.py
26.08.2010 17:24 143 gdalconst.py
26.08.2010 17:24 147 gdalnumeric.py
26.08.2010 17:24 125 ogr.py
10.09.2010 13:02 <DIR> osgeo
26.08.2010 17:24 125 osr.py
5 File(s) 668 bytes

Directory of C:\OSGeo4W\apps\gdal-17\pymod\osgeo

10.09.2010 13:02 <DIR> .
10.09.2010 13:02 <DIR> ..
26.08.2010 17:24 778 __init__.py
10.09.2010 14:59 907 __init__.pyc
26.08.2010 17:24 13 264 _gdal.exp
26.08.2010 17:24 22 084 _gdal.lib
26.08.2010 17:24 237 568 _gdal.pyd
26.08.2010 17:24 10 804 _gdal_array.exp
26.08.2010 17:24 18 494 _gdal_array.lib
26.08.2010 17:24 45 056 _gdal_array.pyd
26.08.2010 17:24 620 _gdalconst.exp
26.08.2010 17:24 1 774 _gdalconst.lib
26.08.2010 17:24 19 456 _gdalconst.pyd
26.08.2010 17:24 3 813 _ogr.exp
26.08.2010 17:24 7 038 _ogr.lib
26.08.2010 17:24 249 856 _ogr.pyd
26.08.2010 17:24 3 813 _osr.exp
26.08.2010 17:24 7 038 _osr.lib
26.08.2010 17:24 159 744 _osr.pyd
26.08.2010 17:24 49 139 gdal.py
26.08.2010 17:24 11 441 gdal_array.py
26.08.2010 17:24 6 172 gdalconst.py
26.08.2010 17:24 45 gdalnumeric.py
26.08.2010 17:24 128 328 ogr.py
26.08.2010 17:24 29 144 osr.py
23 File(s) 1 026 376 bytes

Total Files Listed:
28 File(s) 1 027 044 bytes
5 Dir(s) 62 782 308 352 bytes free

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Статьи: 31
Проекты: 4/1
Репутация: 32
Откуда: Ukraine

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Voltron » 11 сен 2010, 13:02

Boris писал(а):gdal17 - я запускаю, видимо это и есть gdal17.bat
Все правильно. Этот файл устанавливает необходимые переменные окружения, в частности путь к папке pymod GDAL.
Boris писал(а):
запустить Python и начать работать
- что надо большее сделать, чем набрать в строке команду Python ? если просто команду, то он у меня запускается.
но при подключении библиотеки он же находит импортируемый файл, но не находит потом библиотеку, которая лежит рядом с импортируемым файлом
Просто набрать в командной строке Возможно, имеет место конфликт между двумя версиями GDAL. В соседней теме видно, что в PATH есть еще одна папка

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

C:\GIS\gdal\gdalwin32-1.6\bin
Может и в PYTHONPATH она тоже присутсвует?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3303
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 487
Ваше звание: Author
Контактная информация:

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Denis Rykov » 31 июл 2011, 15:52

2Voltron
А можно ссылку на документацию, где говорится, что в SetField можно использовать имя поля? Может я что-то не так понимаю, но например здесь вроде указан тип int, хотя с именем поля прекрасно работает.
Spatial is now, more than ever, just another column- The Geometry Column.

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Статьи: 31
Проекты: 4/1
Репутация: 32
Откуда: Ukraine

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Voltron » 31 июл 2011, 16:40

В документации в явном виде такого нет. Но в том же API Tutorial'е используется SetField с именем поля, а если заглянуть в код, то увидим следующее

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


void SetField( const char *pszFName, int nValue )
{ SetField( GetFieldIndex(pszFName), nValue ); }
void SetField( const char *pszFName, double dfValue )
{ SetField( GetFieldIndex(pszFName), dfValue ); }
void SetField( const char *pszFName, const char * pszValue)
{ SetField( GetFieldIndex(pszFName), pszValue ); }
void SetField( const char *pszFName, int nCount,
int * panValues )
{ SetField(GetFieldIndex(pszFName),nCount,panValues);}
void SetField( const char *pszFName, int nCount,
double * padfValues )
{SetField(GetFieldIndex(pszFName),nCount,padfValues);}
void SetField( const char *pszFName, char ** papszValues )
{ SetField( GetFieldIndex(pszFName), papszValues); }
void SetField( const char *pszFName, OGRField * puValue )
{ SetField( GetFieldIndex(pszFName), puValue ); }
void SetField( const char *pszFName,
int nYear, int nMonth, int nDay,
int nHour=0, int nMinute=0, int nSecond=0,
int nTZFlag = 0 )
{ SetField( GetFieldIndex(pszFName),
nYear, nMonth, nDay,
nHour, nMinute, nSecond, nTZFlag ); }

Т.е. это просто обертки над обычным SetField.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3303
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 487
Ваше звание: Author
Контактная информация:

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Denis Rykov » 31 июл 2011, 16:48

Спасибо. Вот вот, в документации нет, а в туториале используют - не хорошо.
Spatial is now, more than ever, just another column- The Geometry Column.

alexkarta
Участник
Сообщения: 91
Зарегистрирован: 27 янв 2009, 00:22
Репутация: 0

Re: Работа с векторными данными при помощи OGR и Python

Сообщение alexkarta » 27 июл 2012, 09:37

Администраторам!

Ссылка на статью "Работа с растрами при помощи GDAL и Python" отображает неверную статью - "Работа с векторными данными при помощи OGR и Python"

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Статьи: 31
Проекты: 4/1
Репутация: 32
Откуда: Ukraine

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Voltron » 27 июл 2012, 11:18

alexkarta писал(а):Ссылка на статью "Работа с растрами при помощи GDAL и Python" отображает неверную статью - "Работа с векторными данными при помощи OGR и Python"
Ну так взяли бы и исправили

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 8896
Зарегистрирован: 06 окт 2003, 20:20
Статьи: 231
Проекты: 12/6
Репутация: 640
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Работа с векторными данными при помощи OGR и Python

Сообщение Максим Дубинин » 27 июл 2012, 12:50

alexkarta, эта статья является редактируемой, вы можете нажать "редактировать" и поправить ссылку

Изображение
пристегивайтесь, турбулентность прямо по курсу

Ответить

Вернуться в «Материалы сайта»