„GDAL/OGR használata Python nyelvben” változatai közötti eltérés

Innen: GIS Wiki
(Bővebb bevezető, függőségek hozzáadása)
 
(11 közbenső módosítás ugyanattól a szerkesztőtől nincs mutatva)
1. sor: 1. sor:
==GDAL/OGR modul leírása==
 
 
 
A nyílt GDAL/OGR (Geospatial Data Abstraction Library, OpenGIS Simple Features Reference
 
A nyílt GDAL/OGR (Geospatial Data Abstraction Library, OpenGIS Simple Features Reference
 
Implementation) könyvtárak számos eszközzel segítik a térképészeti adatok feldolgozását. A
 
Implementation) könyvtárak számos eszközzel segítik a térképészeti adatok feldolgozását. A
 
GDAL a raszteres, az OGR pedig a vektoros adatok kezeléséért felel. A C++ nyelven írt  
 
GDAL a raszteres, az OGR pedig a vektoros adatok kezeléséért felel. A C++ nyelven írt  
 
könyvtárakhoz úgynevezett Python kötéseket készítettek, hogy Python programokból elérhetők
 
könyvtárakhoz úgynevezett Python kötéseket készítettek, hogy Python programokból elérhetők
legyenek a funkciók. A két könyvtár Python kötését a [http://www.swig.org/index.php SWIG] eszköz segítségével generálják. Az alkalmazásprogramozási felület (API) általában pontosan követi a GDAL és OGR könyvtárak C++  implementációiban használt osztályok és eljárások megnevezéseit. Az elérhető hivatalos dokumentáció (http://gdal.org/python) is automatikusan generált, a meglévő C/C++ függvények leírásai alapján.  
+
legyenek a funkciók. Az alkalmazásprogramozási felület (API) általában pontosan követi a GDAL és OGR könyvtárak C++  implementációiban használt osztályok és eljárások megnevezéseit.  
  
== Függőségek ==
+
== Telepítés ==
  
 
A GDAL/OGR könyvtárak használatához a következőkre van szükség:
 
A GDAL/OGR könyvtárak használatához a következőkre van szükség:
15. sor: 13. sor:
 
A numpy telepítése nem feltétlenül szükséges, viszont sok példaprogram és eszköz használja, ezért ajánlott.
 
A numpy telepítése nem feltétlenül szükséges, viszont sok példaprogram és eszköz használja, ezért ajánlott.
  
 +
=== GNU/Linux ===
 +
A GDAL/OGR könyvtár és a Python kötések telepítését elvégezhetjük [https://docs.python.org/2/library/distutils.html distutils] vagy [https://pypi.python.org/pypi/setuptools setuptools] segítségével (az utóbbi használata ajánlott). Setuptools-t használva a telepítést a következő paranccsal végezhetjük el:
 +
 +
$ sudo easy_install GDAL
 +
 +
Ha nem szeretnénk feltétlenül a legfrissebb verziót használni és megelégszünk az adott Linux disztribúció repozitóriumában fellelhető verzióval, akkor talán legegyszerűbb a csomagkezelőt használni a telepítésre. Ubuntu operációs rendszeren például a következő paranccsal telepíthető a GDAL/OGR könyvtárak Python kötése:
 +
 +
$ sudo apt-get install gdal-bin python-gdal
 +
 +
Ha [https://trac.osgeo.org/gdal/wiki/DownloadSource forrásból] szeretnénk lefordítani a legújabb verziót, akkor a Python kötéshez a <code>--with-python</code> kapcsolót kell használni:
  
== Telepítés ==
+
$ ./configure --with-python
 +
 
 +
Ezután a szokásos módon a <code>make</code> eszköz elvégzi a fordítást és a telepítést:
 +
 
 +
$ make
 +
$ make install
 +
 
 +
A két könyvtár Python kötését a [http://www.swig.org/index.php SWIG] eszköz segítségével generálják. Az elérhető hivatalos dokumentáció (http://gdal.org/python) is automatikusan generált, a meglévő C/C++ függvények leírásai alapján.
  
 +
=== Windows ===
 +
A GDAL/OGR könyvtár Python kötésének telepítéséhez a következő lépésekre lesz szükség:
 +
* [http://download.osgeo.org/gdal/win32/1.6/ GDAL Windows bináris fájlok] letöltése és kicsomagolása. Alapesetben csak a gdalwin32exe160.zip nevű fájlra lesz szükség. A könyvtárban fellelhető többi fájl bővítmények fejlesztéséhez szükséges. A zip fájlt bárhova ki lehet csomagolni, példa gyanánt a <code>C:\gdalwin32-1.6</code> könyvtárat fogjuk használni. A kicsomagolás után a <code>PATH</code> rendszerváltozót [http://www.computerhope.com/issues/ch000549.htm módosítani] kell, hozzá kell adni a <code>C:\gdalwin32-1.6\bin</code> elérési útvonalat.
 +
* Létre kell hozni a <code>GDAL_DATA</code> nevű rendszerváltozót, aminek az értéke az adatokat tartalmazó könyvtár neve, jelen esetben <code>C:\gdalwin32-1.6\data</code>.
 +
* Szükséges lehet az operációs rendszer újraindítása.
  
 
== Használat ==
 
== Használat ==
  
===Támogatott adatformátumok===
+
A GDAL Python kötésében öt főmodult érhetünk el a következő módon:
 
 
Az OGR könyvtár segítségével számos vektoros formátumot (állománytípust vagy egyéb
 
  
adatforrást) tudunk kezelni, például:
+
>>> from osgeo import gdal
 +
>>> from osgeo import ogr
 +
>>> from osgeo import osr
 +
>>> from osgeo import gdal_array
 +
>>> from osgeo import gdalconst
  
*  ESRI shapefile
+
=== Buktatók ===
  
*  personal geodatabase (térinformatikai adatokat tároló Microsoft Access adatbázis)
+
Annak ellenére, hogy a Python kötések használata teljesen elrejti a mögöttes C++ könyvtárat, használata pár apró dologban mégis eltér a megszokott Python modulok használatától, amire érdemes figyelnie a Python programozónak:
  
*  ArcSDE adatbázis
+
==== A Python kötés nem használ kivételeket ====
  
*  MapInfo formátum
+
A Python kötés alapértelmezetten nem használja a kivételeket, ehelyett meghatározott hibaértéket térít vissza az adott függvény, és egy hibaüzenet jelenik meg a standard kimeneten. Például ha egy nemlétező fájlt próbálunk megnyitni, ez az alapértelmezett működés:
  
* GRASS formátum
+
  >>> from osgeo import gdal
 +
>>> gdal.Open('/home/user/nincsilyen.img')
 +
ERROR 4: `/home/user/nincsilyen.img' does not exist in the file system,
 +
and is not recognised as a supported dataset name.
 +
>>>
  
*  Bentley Systems MicroStation formátum
+
Ha mégis használni szeretnénk a kivételeket, akkor ezeket explicit módon engedélyezni kell az <code>UseExceptions()</code> meghívásával.
  
* TIGER/Line
+
  >>> from osgeo import gdal
 +
>>> gdal.UseExceptions()        # Kivetelek engedelyezese
 +
>>> gdal.Open('/home/user/nincsilyen.img')
 +
Traceback (most recent call last):
 +
  File "<stdin>", line 1, in <module>
 +
RuntimeError: `/home/user/nincsilyen.img' does not exist in the file system,
 +
and is not recognised as a supported dataset name.
 +
>>>
  
*  SDTS
+
Ez megkötés a visszamenőleges kompatibilitás miatt szükséges.
  
*  GML
 
  
*  KML
+
==== A Python összeomlik, ha egy olyan objektumot használunk, ami összefügg egy már előzőleg törölt objektummal ====
  
*  MySQL, PostgreSQL, MariaDB, stb
+
A GDAL és OGR objektumok valójában C++ objektumok, amik mutatókkal kapcsolódnak egymáshoz. Megtörténhet, hogy a Python garbage collector felszabadítja egy objektum tárhelyét (vagy a programozó töröl egy objektumot <code>del</code>-lel), miközben egy másik objektum mutatóval hivatkozik rá. Ilyenkor a Python összeomlik. A következő példában egy bemeneti állományt megnyitva létrehozunk egy objektumot, majd egy másikat, ami a háttérben hivatkozik az elsőre (C++ mutatóval). Ezután kitöröljük az első objektumot és meghívjuk a másodiknak egy metódusát. Ennyi elég ahhoz, hogy a Python összeomoljon.
  
* Oracle Spatial
+
  >>> from osgeo import gdal
 +
>>> adat = gdal.Open('/home/user/valami.img')
 +
>>> band = adat.GetRasterBand(1) # Egy uj objektum letrehozasa, ami kapcsolatban van az adat objektummal
 +
>>> del adat          # Toroljuk az adat objektumot
 +
>>> band.GetMinimum();    # A band objektum egy metodusanak hivasa es a Python osszeomlik
 +
Segmentation fault (core dumped)
  
*  Informix
+
A következő példában a garbage collector törli automatikusan az <code>osgeo.gdal.Dataset</code> típusú objektumot még mielőtt a <code>GetMinimum()</code> metódus meghívódna, mert a <code>osgeo.gdal.Band</code> objektum létrehozása után erre már nincs szükség (a Python "logikája" szerint, ami nem tudhat a háttérben levő C++ implementáció részleteiről).
  
* ODBC
+
  >>> from osgeo import gdal
 +
>>> print gdal.Open('/home/user/valami.img').GetRasterBand(1).GetMinimum()
 +
Segmentation fault (core dumped)
  
===Hozzáférés a filehoz===
+
=== Fájlkezelés ===
  
A különböző fájltípusoknak és más adatforrásoknak a kezelésére az OGR könyvtár úgynevezett
+
A különböző fájltípusoknak és más adatforrásoknak a kezelésére az GDAL/OGR könyvtárak úgynevezett
meghajtókat (vagy driver­eket) használ. A következő Python kóddal tudjuk megvizsgálni, hogy
+
meghajtókat (vagy driver­eket) használnak. Például a következő Python kóddal tudjuk megvizsgálni, hogy
milyen driver­ek állnak rendelkezésünkre:
+
milyen OGR driver­ek állnak rendelkezésünkre:
  
 
<source lang="python">
 
<source lang="python">
94. sor: 133. sor:
 
helyzet akkor fordulhat elő, ha a Shape fájl tartalma sérült vagy az shx vagy dbf fájl nem található.
 
helyzet akkor fordulhat elő, ha a Shape fájl tartalma sérült vagy az shx vagy dbf fájl nem található.
  
===Térképészeti adat kinyerése===
+
====Támogatott adatformátumok====
 +
 
 +
A GDAL segítségével számos raszteres formátumot (állománytípust vagy egyéb adatforrást) tudunk kezelni. Az OGR könyvtár vektoros formátumú fájlokat kezel. A következőkben felsoroljuk a támogatott raszteres illetve vektoros állománytípusokat:
 +
 
 +
* '''Raszteres adatformátumok (GDAL):''' [http://www.gdal.org/frmt_various.html#AAIGrid Arc/Info ASCII Grid], [http://www.gdal.org/frmt_various.html#ACE2 ACE2], [http://www.gdal.org/frmt_various.html#ADRG ADRG/ARC Digitilized Raster Graphics (.gen/.thf)], [http://www.gdal.org/frmt_various.html#AIG Arc/Info Binary Grid (.adf)], [http://www.gdal.org/frmt_airsar.html AIRSAR Polarimetric], [http://www.gdal.org/frmt_various.html#ARG Azavea Raster Grid], [http://www.gdal.org/frmt_blx.html Magellan BLX Topo (.blx, .xlb)], [http://www.gdal.org/frmt_bag.html Bathymetry Attributed Grid (.bag)], [http://www.gdal.org/frmt_bmp.html Microsoft Windows Device Independent Bitmap (.bmp)], [http://www.gdal.org/frmt_various.html#BSB BSB Nautical Chart Format (.kap)], [http://www.gdal.org/frmt_various.html#BT VTP Binary Terrain Format (.bt)], [http://www.gdal.org/frmt_cals.html CALS Type I], [http://www.gdal.org/frmt_various.html#CEOS CEOS (Spot for instance)], [http://www.gdal.org/frmt_cosar.html TerraSAR-X Complex SAR Data Product], [http://www.gdal.org/frmt_various.html#CTG USGS LULC Composite Theme Grid], [http://www.gdal.org/frmt_various.html#DDS DirectDraw Surface], [http://www.gdal.org/frmt_various.html#DIMAP Spot DIMAP (metadata.dim)], [http://www.gdal.org/frmt_dods.html DODS / OPeNDAP], [http://www.gdal.org/frmt_various.html#DOQ1 First Generation USGS DOQ (.doq)], [http://www.gdal.org/frmt_various.html#DOQ2 New Labelled USGS DOQ (.doq)], [http://www.gdal.org/frmt_dted.html Military Elevation Data (.dt0, .dt1, .dt2)], [http://www.gdal.org/frmt_various.html#E00GRID Arc/Info Export E00 GRID], [http://www.gdal.org/frmt_various.html#ECRGTOC ECRG Table Of Contents (TOC.xml)], [http://www.gdal.org/frmt_ecw.html ERDAS Compressed Wavelets (.ecw)], [http://www.gdal.org/frmt_various.html#EHdr ESRI .hdr Labelled], [http://www.gdal.org/frmt_various.html#EIR Erdas Imagine Raw], [http://www.gdal.org/frmt_elas.html NASA ELAS], [http://www.gdal.org/frmt_various.html#ENVI ENVI .hdr Labelled Raster], [http://www.gdal.org/frmt_epsilon.html Epsilon - Wavelet compressed images], [http://www.gdal.org/frmt_ers.html ERMapper (.ers)], [http://www.gdal.org/frmt_various.html#Envisat Envisat Image Product (.n1)], [http://www.gdal.org/frmt_fast.html EOSAT FAST Format], [http://www.gdal.org/frmt_various.html#FITS FITS (.fits)], [http://www.gdal.org/frmt_various.html#GenBin Generic Binary (.hdr Labelled)], [http://www.gdal.org/frmt_georaster.html Oracle Spatial GeoRaster], [http://www.gdal.org/frmt_various.html#GFF GSat File Format], [http://www.gdal.org/frmt_gif.html Graphics Interchange Format (.gif)], [http://www.gdal.org/frmt_grib.html WMO GRIB1/GRIB2 (.grb)], [http://www.gdal.org/frmt_various.html#GMT GMT Compatible netCDF], [http://www.gdal.org/frmt_grass.html GRASS Raster Format], [http://www.gdal.org/frmt_various.html#GRASSASCIIGrid GRASS ASCII Grid], [http://www.gdal.org/frmt_various.html#GSAG Golden Software ASCII Grid], [http://www.gdal.org/frmt_various.html#GSBG Golden Software Binary Grid], [http://www.gdal.org/frmt_various.html#GS7BG Golden Software Surfer 7 Binary Grid], [http://www.gdal.org/frmt_gta.html Generic Tagged Arrays (.gta)], [http://www.gdal.org/frmt_gtiff.html TIFF / BigTIFF / GeoTIFF (.tif)], [http://www.gdal.org/frmt_various.html#GXF GXF - Grid eXchange File], [http://www.gdal.org/frmt_hdf4.html Hierarchical Data Format Release 4 (HDF4)], [http://www.gdal.org/frmt_hdf5.html Hierarchical Data Format Release 5 (HDF5)], [http://www.gdal.org/frmt_hf2.html HF2/HFZ heightfield raster], [http://www.gdal.org/frmt_hfa.html Erdas Imagine (.img)], [http://www.gdal.org/frmt_various.html#IDA Image Display and Analysis (WinDisp)], [http://www.gdal.org/frmt_various.html#ILWIS ILWIS Raster Map (.mpr,.mpl)], [http://www.gdal.org/frmt_intergraphraster.html Intergraph Raster], [http://www.gdal.org/frmt_various.html#IRIS IRIS], [http://www.gdal.org/frmt_various.html#ISCE ISCE raster], [http://www.gdal.org/frmt_isis2.html USGS Astrogeology ISIS cube (Version 2)], [http://www.gdal.org/frmt_isis3.html USGS Astrogeology ISIS cube (Version 3)], [http://www.gdal.org/frmt_palsar.html JAXA PALSAR Product Reader (Level 1.1/1.5)], [http://www.gdal.org/frmt_various.html#JDEM Japanese DEM (.mem)], [http://www.gdal.org/frmt_jpeg.html JPEG JFIF (.jpg)], [http://www.gdal.org/frmt_jpegls.html JPEG-LS], [http://www.gdal.org/frmt_jpeg2000.html JPEG2000 (.jp2, .j2k)], [http://www.gdal.org/frmt_jp2ecw.html JPEG2000 (.jp2, .j2k)], [http://www.gdal.org/frmt_jp2kak.html JPEG2000 (.jp2, .j2k)], [http://www.gdal.org/frmt_jp2mrsid.html JPEG2000 (.jp2, .j2k)], [http://www.gdal.org/frmt_jp2openjpeg.html JPEG2000 (.jp2, .j2k)], [http://www.gdal.org/frmt_jpipkak.html JPIP (based on Kakadu)], [http://www.gdal.org/frmt_kea.html KEA], [http://www.gdal.org/frmt_various.html#KRO KRO], [http://www.gdal.org/frmt_l1b.html NOAA Polar Orbiter Level 1b Data Set (AVHRR)], [http://www.gdal.org/frmt_various.html#LAN Erdas 7.x .LAN and .GIS], [http://www.gdal.org/frmt_lcp.html FARSITE v.4 LCP Format], [http://www.gdal.org/frmt_leveller.html Daylon Leveller Heightfield], [http://www.gdal.org/frmt_mbtiles.html MBTiles], [http://www.gdal.org/frmt_map.html OziExplorer .MAP], [http://www.gdal.org/frmt_mem.html In Memory Raster], [http://www.gdal.org/frmt_various.html#MFF Vexcel MFF], [http://www.gdal.org/frmt_mff2.html Vexcel MFF2], [http://www.gdal.org/frmt_mrsid_lidar.html MG4 Encoded Lidar], [http://www.gdal.org/frmt_marfa.html Meta Raster Format], [http://www.gdal.org/frmt_mrsid.html Multi-resolution Seamless Image Database], [http://www.gdal.org/frmt_msg.html Meteosat Second Generation], [http://www.gdal.org/frmt_msgn.html EUMETSAT Archive native (.nat)], [http://www.gdal.org/frmt_various.html#NDF NLAPS Data Format], [http://www.gdal.org/frmt_ngsgeoid.html NOAA NGS Geoid Height Grids], [http://www.gdal.org/frmt_nitf.html NITF (.ntf, .nsf, .gn?, .hr?, .ja?, .jg?, .jn?, .lf?, .on?, .tl?, .tp?, etc.)], [http://www.gdal.org/frmt_netcdf.html NetCDF], [http://www.gdal.org/frmt_ogdi.html OGDI Bridge], [http://www.gdal.org/frmt_ozi.html OZI OZF2/OZFX3], [http://www.gdal.org/frmt_various.html#PAux PCI .aux Labelled], [http://www.gdal.org/frmt_pcidsk.html PCI Geomatics Database File], [http://www.gdal.org/frmt_various.html#PCRaster PCRaster], [http://www.gdal.org/frmt_pdf.html Geospatial PDF], [http://www.gdal.org/frmt_pds.html NASA Planetary Data System], [http://www.gdal.org/frmt_plmosaic.html Planet Labs Mosaics API], [http://www.gdal.org/frmt_various.html#PNG Portable Network Graphics (.png)], [http://www.gdal.org/frmt_various.html#PNM Netpbm (.ppm,.pgm)], [http://www.gdal.org/frmt_r.html R Object Data Store], [http://www.gdal.org/frmt_rasdaman.html Rasdaman], [http://www.gdal.org/frmt_rasterlite.html Rasterlite - Rasters in SQLite DB], [http://www.gdal.org/frmt_rik.html Swedish Grid RIK (.rik)], [http://www.gdal.org/frmt_rmf.html Raster Matrix Format (*.rsw, .mtw)], [http://www.gdal.org/frmt_various.html#ROI_PAC ROI_PAC Raster], [http://www.gdal.org/frmt_various.html#RPFTOC Raster Product Format/RPF (CADRG, CIB)], [http://www.gdal.org/frmt_rs2.html RadarSat2 XML (product.xml)], [http://www.gdal.org/frmt_Idrisi.html Idrisi Raster], [http://www.gdal.org/frmt_safe.html Sentinel 1 SAR SAFE (manifest.safe)], [http://www.gdal.org/frmt_sentinel2.html Sentinel 2], [http://www.gdal.org/frmt_various.html#SAGA SAGA GIS Binary format], [http://www.gdal.org/frmt_various.html#SAR_CEOS SAR CEOS], [http://www.gdal.org/frmt_sde.html ArcSDE Raster], [http://www.gdal.org/frmt_various.html#SDTS USGS SDTS DEM (*CATD.DDF)], [http://www.gdal.org/frmt_various.html#SGI SGI Image Format], [http://www.gdal.org/frmt_various.html#SNODAS Snow Data Assimilation System], [http://www.gdal.org/frmt_various.html#SRP Standard Raster Product (ASRP/USRP)], [http://www.gdal.org/frmt_various.html#SRTMHGT SRTM HGT Format], [http://www.gdal.org/frmt_terragen.html Terragen Heightfield (.ter)], [http://www.gdal.org/frmt_usgsdem.html USGS ASCII DEM / CDED (.dem)], [http://www.gdal.org/frmt_wcs.html OGC Web Coverage Service], [http://www.gdal.org/frmt_webp.html WEBP], [http://www.gdal.org/frmt_wms.html OGC Web Map Service, and TMS, WorldWind, On Earth tiled, VirtualEarth, ArcGIS REST, IIP)], [http://www.gdal.org/frmt_wmts.html OGC Web Map Tile Service], [http://www.gdal.org/frmt_various.html#XPM X11 Pixmap (.xpm)], [http://www.gdal.org/frmt_xyz.html ASCII Gridded XYZ], [http://www.gdal.org/frmt_various.html#ZMap ZMap Plus Grid], [http://www.gdal.org/frmt_hfa.html here]
 +
 
 +
* '''Vektorgrafikus adatformátumok (OGR):''' [http://www.gdal.org/drv_aeronavfaa.html Aeronav FAA files], [http://www.gdal.org/drv_amigocloud.html AmigoCloud API], [http://www.gdal.org/drv_ao.html ESRI ArcObjects], [http://www.gdal.org/drv_avcbin.html Arc/Info Binary Coverage], [http://www.gdal.org/drv_avce00.html Arc/Info .E00 (ASCII) Coverage], [http://www.gdal.org/drv_arcgen.html Arc/Info Generate], [http://www.gdal.org/drv_bna.html Atlas BNA], [http://www.gdal.org/drv_dwg.html AutoCAD DWG], [http://www.gdal.org/drv_dxf.html AutoCAD DXF], [http://www.gdal.org/drv_cartodb.html CartoDB], [http://www.gdal.org/drv_cloudant.html Cloudant / CouchDB], [http://www.gdal.org/drv_couchdb.html CouchDB / GeoCouch], [http://www.gdal.org/drv_csv.html Comma Separated Value (.csv)], [http://www.gdal.org/drv_csw.html OGC CSW (Catalog Service for the Web)], [http://www.gdal.org/drv_vfk.html Czech Cadastral Exchange Data Format], [http://www.gdal.org/drv_db2.html DB2 Spatial], [http://www.gdal.org/drv_dods.html DODS/OPeNDAP], [http://www.gdal.org/drv_edigeo.html EDIGEO], [http://www.gdal.org/drv_elasticsearch.html ElasticSearch], [http://www.gdal.org/drv_filegdb.html ESRI FileGDB], [http://www.gdal.org/drv_pgeo.html ESRI Personal GeoDatabase], [http://www.gdal.org/drv_sde.html ESRI ArcSDE], [http://www.gdal.org/drv_shapefile.html ESRI Shapefile / DBF], [http://www.gdal.org/drv_fme.html FMEObjects Gateway], [http://www.gdal.org/drv_geojson.html GeoJSON], [http://www.gdal.org/drv_geoconcept.html G&eacute;oconcept Export], [http://www.gdal.org/drv_geomedia.html Geomedia .mdb], [http://www.gdal.org/drv_geopackage.html GeoPackage], [http://www.gdal.org/drv_georss.html GeoRSS], [http://www.gdal.org/drv_gft.html Google Fusion Tables], [http://www.gdal.org/drv_gml.html GML], [http://www.gdal.org/drv_gmt.html GMT], [http://www.gdal.org/drv_gpsbabel.html GPSBabel], [http://www.gdal.org/drv_gpx.html GPX], [http://www.gdal.org/drv_grass.html GRASS Vector Format], [http://www.gdal.org/drv_gtm.html GPSTrackMaker (.gtm, .gtz)], [http://www.gdal.org/drv_htf.html Hydrographic Transfer Format], [http://www.gdal.org/drv_idrisi.html Idrisi Vector (.VCT)], [http://www.gdal.org/drv_idb.html Informix DataBlade], [http://www.gdal.org/drv_ili.html INTERLIS], [http://www.gdal.org/drv_ingres.html INGRES], [http://www.gdal.org/drv_jml.html JML], [http://www.gdal.org/drv_kml.html KML], [http://www.gdal.org/drv_libkml.html LIBKML], [http://www.gdal.org/drv_mitab.html Mapinfo File], [http://www.gdal.org/drv_dgn.html Microstation DGN], [http://www.gdal.org/drv_mdb.html Access MDB (PGeo and Geomedia capable)], [http://www.gdal.org/drv_memory.html Memory], [http://www.gdal.org/drv_mongodb.html MongoDB], [http://www.gdal.org/drv_mysql.html MySQL], [http://www.gdal.org/drv_nas.html NAS - ALKIS], [http://www.gdal.org/drv_oci.html Oracle Spatial], [http://www.gdal.org/drv_odbc.html ODBC], [http://www.gdal.org/drv_mssqlspatial.html MS SQL Spatial], [http://www.gdal.org/drv_ods.html Open Document Spreadsheet], [http://www.gdal.org/drv_ogdi.html OGDI Vectors (VPF, VMAP, DCW)], [http://www.gdal.org/drv_openair.html OpenAir], [http://www.gdal.org/drv_openfilegdb.html ESRI FileGDB], [http://www.gdal.org/drv_osm.html OpenStreetMap XML and PBF], [http://www.gdal.org/drv_pds.html PDS], [http://www.gdal.org/drv_plscenes.html Planet Labs Scenes API], [http://www.gdal.org/drv_pgdump.html PostgreSQL SQL dump], [http://www.gdal.org/drv_pg.html PostgreSQL/PostGIS], [http://www.gdal.org/drv_s57.html S-57 (ENC)], [http://www.gdal.org/drv_sdts.html SDTS], [http://www.gdal.org/drv_segukooa.html SEG-P1 / UKOOA P1/90], [http://www.gdal.org/drv_segy.html SEG-Y], [http://www.gdal.org/drv_selafin.html Selafin/Seraphin format], [http://www.gdal.org/drv_sqlite.html SQLite/SpatiaLite], [http://www.gdal.org/drv_sua.html SUA], [http://www.gdal.org/drv_svg.html SVG], [http://www.gdal.org/drv_sxf.html Storage and eXchange Format], [http://www.gdal.org/drv_ntf.html UK .NTF], [http://www.gdal.org/drv_tiger.html U.S. Census TIGER/Line], [http://www.gdal.org/drv_vrt.html VRT - Virtual Datasource], [http://www.gdal.org/drv_wfs.html OGC WFS (Web Feature Service)], [http://www.gdal.org/drv_xls.html MS Excel format], [http://www.gdal.org/drv_xlsx.html MS Office Open XML spreadsheet], [http://www.gdal.org/drv_xplane.html X-Plane/Flightgear aeronautical data], [http://www.gdal.org/drv_vdv.html VDV-451/VDV-452/IDF], [http://www.gdal.org/drv_walk.html Walk], [http://www.gdal.org/drv_wasp.html WAsP .map format].
 +
 
 +
==Példaprogramok==
  
A következő lépés a Shape fájlban található réteghez (layer) valő hozzáférés. Ezt a funkciót a
+
===Térképészeti adat kinyerése OGR-ban===
  
GetLayer(index) függvény biztosítja. Shape fájlok esetében az index mindig 0 (vagy el is lehet
+
Röviden megmutatjuk az ESRI Shape fájlban található réteghez (layer) valő hozzáférés. Ezt a funkciót a GetLayer(index) függvény biztosítja. Shape fájlok esetében az index mindig 0 (vagy el is lehet hagyni ezt a paramétert), az index csak olyan formátumok esetében hasznos, mint pl. a GML vagy
hagyni ezt a paramétert), az index csak olyan formátumok esetében hasznos, mint pl. a GML vagy
 
 
a TIGER. A következő sorral tehát a Shape fájl egyetlen rétegét szerezzük be:
 
a TIGER. A következő sorral tehát a Shape fájl egyetlen rétegét szerezzük be:
  
 
<source lang="python">layer = datasource.GetLayer()</source>
 
<source lang="python">layer = datasource.GetLayer()</source>
  
 
+
Ezután következik a rétegen található elemek (features) beolvasása. A feature­-ek számát a layer GetFeatureCount() függvényével kérhetjük le, és az egyes feature­ek a GetFeature(index) függvénnyel érhetjük el. Vagy végig lehet menni az összes feature­en a következő kóddal:
Ezután következik a rétegen található elemek (features) beolvasása. A feature­ek számát a layer
 
GetFeatureCount() függvényével kérhetjük le, és az egyes feature­ek a GetFeature(index)
 
függvénnyel érhetjük el. Vagy végig lehet menni az összes feature­en a következő kóddal:
 
  
 
<source lang="python">
 
<source lang="python">
117. sor: 160. sor:
 
</source>
 
</source>
  
A Shape fájlunk csak egyetlen feature­t tartalmaz, ezért a GetNextFeauter() egyszeri meghívásával
+
A Shape fájlunk csak egyetlen feature­t tartalmaz, ezért a GetNextFeauter() egyszeri meghívásával megoldjuk a hozzáférést. Az elem mértani objetkumát a GetGeometryRef() függvénnyel kérhetjük le, típusát pedig a GetGeometryType() vagy GetGeometryName() függvénnyekkel ellenőrizhetjük le. A következő
megoldjuk a hozzáférést.
+
sorokban például azt ellenőrizzük le, hogy a poligon vagy multipoligon típusú elemmel van­-e dolgunk:
Az elem mértani objetkumát a GetGeometryRef() függvénnyel kérhetjük le, típusát pedig a
+
 
GetGeometryType() vagy GetGeometryName() függvénnyekkel ellenőrizhetjük le. A következő
 
sorokban például azt ellenőrizzük le, hogy a poligon vagy multipoligon típusú elemmel van­e
 
dolgunk:
 
 
<source lang="python">
 
<source lang="python">
 
geometry = feature.GetGeometryRef()
 
geometry = feature.GetGeometryRef()
129. sor: 169. sor:
 
</source>
 
</source>
  
A típusokat az OGR konstansaival (pl. ogr.wkbPoint, ogr.wkbLineString, ogr.wkbPolygon,
+
A típusokat az OGR konstansaival (pl. ogr.wkbPoint, ogr.wkbLineString, ogr.wkbPolygon, ogr.wkbMultiPoint, ogr.wkbMultiLineString, ogr.wkbMultiPolygon, stb.) is azonosíthatjuk.
ogr.wkbMultiPoint, ogr.wkbMultiLineString, ogr.wkbMultiPolygon, stb.) is azonosíthatjuk.
 
  
===Attribútumok===
+
=== OGR Attribútumok ===
  
 
Az attribútomokat a GetField() függvénnyel és annak variációival érhetjük el. Például:
 
Az attribútomokat a GetField() függvénnyel és annak variációival érhetjük el. Például:
143. sor: 182. sor:
 
Az attribútumok számát a GetFieldCount() függvénnyel kapjuk meg.
 
Az attribútumok számát a GetFieldCount() függvénnyel kapjuk meg.
  
==Példaprogramok==
+
 
===Shape file geometriájának egyszerűsítése===
+
=== Shape file geometriájának egyszerűsítése ===
  
 
A következő Python kód egy Shape file geometriáját egyszerűsíti, adott toleranciával. A fontosabb
 
A következő Python kód egy Shape file geometriáját egyszerűsíti, adott toleranciával. A fontosabb

A lap jelenlegi, 2016. június 30., 22:13-kori változata

A nyílt GDAL/OGR (Geospatial Data Abstraction Library, OpenGIS Simple Features Reference Implementation) könyvtárak számos eszközzel segítik a térképészeti adatok feldolgozását. A GDAL a raszteres, az OGR pedig a vektoros adatok kezeléséért felel. A C++ nyelven írt könyvtárakhoz úgynevezett Python kötéseket készítettek, hogy Python programokból elérhetők legyenek a funkciók. Az alkalmazásprogramozási felület (API) általában pontosan követi a GDAL és OGR könyvtárak C++ implementációiban használt osztályok és eljárások megnevezéseit.

Telepítés

A GDAL/OGR könyvtárak használatához a következőkre van szükség:

  • Python 2.X (Python 3.X a GDAL 1.7.0 verziójától kezdődően). Python 2-höz ajánlott 2.3 és 2.7 közötti verziót használni.
  • libgdal (1.5.0 vagy ennél újabb verzió) a hozzá tartozó header fájlokkal együtt (gdal-devel)
  • numpy (1.0.0 vagy ennél újabb verzió) a hozzá tartozó header fájlokkal együtt (numpy-devel)

A numpy telepítése nem feltétlenül szükséges, viszont sok példaprogram és eszköz használja, ezért ajánlott.

GNU/Linux

A GDAL/OGR könyvtár és a Python kötések telepítését elvégezhetjük distutils vagy setuptools segítségével (az utóbbi használata ajánlott). Setuptools-t használva a telepítést a következő paranccsal végezhetjük el:

$ sudo easy_install GDAL

Ha nem szeretnénk feltétlenül a legfrissebb verziót használni és megelégszünk az adott Linux disztribúció repozitóriumában fellelhető verzióval, akkor talán legegyszerűbb a csomagkezelőt használni a telepítésre. Ubuntu operációs rendszeren például a következő paranccsal telepíthető a GDAL/OGR könyvtárak Python kötése:

$ sudo apt-get install gdal-bin python-gdal

Ha forrásból szeretnénk lefordítani a legújabb verziót, akkor a Python kötéshez a --with-python kapcsolót kell használni:

$ ./configure --with-python

Ezután a szokásos módon a make eszköz elvégzi a fordítást és a telepítést:

$ make
$ make install

A két könyvtár Python kötését a SWIG eszköz segítségével generálják. Az elérhető hivatalos dokumentáció (http://gdal.org/python) is automatikusan generált, a meglévő C/C++ függvények leírásai alapján.

Windows

A GDAL/OGR könyvtár Python kötésének telepítéséhez a következő lépésekre lesz szükség:

  • GDAL Windows bináris fájlok letöltése és kicsomagolása. Alapesetben csak a gdalwin32exe160.zip nevű fájlra lesz szükség. A könyvtárban fellelhető többi fájl bővítmények fejlesztéséhez szükséges. A zip fájlt bárhova ki lehet csomagolni, példa gyanánt a C:\gdalwin32-1.6 könyvtárat fogjuk használni. A kicsomagolás után a PATH rendszerváltozót módosítani kell, hozzá kell adni a C:\gdalwin32-1.6\bin elérési útvonalat.
  • Létre kell hozni a GDAL_DATA nevű rendszerváltozót, aminek az értéke az adatokat tartalmazó könyvtár neve, jelen esetben C:\gdalwin32-1.6\data.
  • Szükséges lehet az operációs rendszer újraindítása.

Használat

A GDAL Python kötésében öt főmodult érhetünk el a következő módon:

>>> from osgeo import gdal
>>> from osgeo import ogr
>>> from osgeo import osr
>>> from osgeo import gdal_array
>>> from osgeo import gdalconst

Buktatók

Annak ellenére, hogy a Python kötések használata teljesen elrejti a mögöttes C++ könyvtárat, használata pár apró dologban mégis eltér a megszokott Python modulok használatától, amire érdemes figyelnie a Python programozónak:

A Python kötés nem használ kivételeket

A Python kötés alapértelmezetten nem használja a kivételeket, ehelyett meghatározott hibaértéket térít vissza az adott függvény, és egy hibaüzenet jelenik meg a standard kimeneten. Például ha egy nemlétező fájlt próbálunk megnyitni, ez az alapértelmezett működés:

>>> from osgeo import gdal
>>> gdal.Open('/home/user/nincsilyen.img')
ERROR 4: `/home/user/nincsilyen.img' does not exist in the file system,
and is not recognised as a supported dataset name.
>>>

Ha mégis használni szeretnénk a kivételeket, akkor ezeket explicit módon engedélyezni kell az UseExceptions() meghívásával.

>>> from osgeo import gdal
>>> gdal.UseExceptions()        # Kivetelek engedelyezese
>>> gdal.Open('/home/user/nincsilyen.img')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: `/home/user/nincsilyen.img' does not exist in the file system,
and is not recognised as a supported dataset name.
>>>

Ez megkötés a visszamenőleges kompatibilitás miatt szükséges.


A Python összeomlik, ha egy olyan objektumot használunk, ami összefügg egy már előzőleg törölt objektummal

A GDAL és OGR objektumok valójában C++ objektumok, amik mutatókkal kapcsolódnak egymáshoz. Megtörténhet, hogy a Python garbage collector felszabadítja egy objektum tárhelyét (vagy a programozó töröl egy objektumot del-lel), miközben egy másik objektum mutatóval hivatkozik rá. Ilyenkor a Python összeomlik. A következő példában egy bemeneti állományt megnyitva létrehozunk egy objektumot, majd egy másikat, ami a háttérben hivatkozik az elsőre (C++ mutatóval). Ezután kitöröljük az első objektumot és meghívjuk a másodiknak egy metódusát. Ennyi elég ahhoz, hogy a Python összeomoljon.

>>> from osgeo import gdal
>>> adat = gdal.Open('/home/user/valami.img')
>>> band = adat.GetRasterBand(1) # Egy uj objektum letrehozasa, ami kapcsolatban van az adat objektummal
>>> del adat           # Toroljuk az adat objektumot
>>> band.GetMinimum();    # A band objektum egy metodusanak hivasa es a Python osszeomlik
Segmentation fault (core dumped)

A következő példában a garbage collector törli automatikusan az osgeo.gdal.Dataset típusú objektumot még mielőtt a GetMinimum() metódus meghívódna, mert a osgeo.gdal.Band objektum létrehozása után erre már nincs szükség (a Python "logikája" szerint, ami nem tudhat a háttérben levő C++ implementáció részleteiről).

>>> from osgeo import gdal
>>> print gdal.Open('/home/user/valami.img').GetRasterBand(1).GetMinimum()
Segmentation fault (core dumped)

Fájlkezelés

A különböző fájltípusoknak és más adatforrásoknak a kezelésére az GDAL/OGR könyvtárak úgynevezett meghajtókat (vagy driver­eket) használnak. Például a következő Python kóddal tudjuk megvizsgálni, hogy milyen OGR driver­ek állnak rendelkezésünkre:

from osgeo import ogr
driverList = []

for i in range(ogr.GetDriverCount()):
  driver = ogr.GetDriver(i)
  driverName = driver.GetName()
  if not driverName in driverList:
    formatsList.append(driverName)

for i in formatsList:
  print i

A kiírt nevek alapján azonosíthatjuk a megfelelő drivert. A Shape fájl formátumot például az „ESRI Shapefile” nevű meghajtóval kezelhetjük. A megfelelő driver név szerint is elérhető (ha nincs telepíve az adott nevű driver, akkor a GetDriverByName függvény None értéket térít vissza). A Shape fájlokat kezelő meghajtót tehát a következő függvényhívással érhetjük el: driver = ogr.GetDriverByName('ESRI Shapefile') Az állományt ezután a meghatón keresztül nyitjuk meg az Open függvény segítségével, aminek első paramétere az állomány neve (teljes elérési útvonal), a második pedig egy egész szám, aminek értéke 0 vagy 1 lehet. A második paraméter 0, ha az állományt csak olvasásra nyitjuk meg, az érték 1 ha írni is szeretnénk bele.

file = driver.Open(filename, 0)
if file is None:
  print ('Nem tudtam megnyitni a fájlt!')

Amennyiben a meghajtó nem tudta megnyitni az állományt, akkor a None értéket adja vissza. Ez a helyzet akkor fordulhat elő, ha a Shape fájl tartalma sérült vagy az shx vagy dbf fájl nem található.

Támogatott adatformátumok

A GDAL segítségével számos raszteres formátumot (állománytípust vagy egyéb adatforrást) tudunk kezelni. Az OGR könyvtár vektoros formátumú fájlokat kezel. A következőkben felsoroljuk a támogatott raszteres illetve vektoros állománytípusokat:

Példaprogramok

Térképészeti adat kinyerése OGR-ban

Röviden megmutatjuk az ESRI Shape fájlban található réteghez (layer) valő hozzáférés. Ezt a funkciót a GetLayer(index) függvény biztosítja. Shape fájlok esetében az index mindig 0 (vagy el is lehet hagyni ezt a paramétert), az index csak olyan formátumok esetében hasznos, mint pl. a GML vagy a TIGER. A következő sorral tehát a Shape fájl egyetlen rétegét szerezzük be:

layer = datasource.GetLayer()

Ezután következik a rétegen található elemek (features) beolvasása. A feature­-ek számát a layer GetFeatureCount() függvényével kérhetjük le, és az egyes feature­ek a GetFeature(index) függvénnyel érhetjük el. Vagy végig lehet menni az összes feature­en a következő kóddal:

feature = layer.GetNextFeature()
while feature:
  # feldolgozás
  feature = layer.GetNextFeature()
  layer.ResetReading() #ha újra kell kezdeni a beolvasást

A Shape fájlunk csak egyetlen feature­t tartalmaz, ezért a GetNextFeauter() egyszeri meghívásával megoldjuk a hozzáférést. Az elem mértani objetkumát a GetGeometryRef() függvénnyel kérhetjük le, típusát pedig a GetGeometryType() vagy GetGeometryName() függvénnyekkel ellenőrizhetjük le. A következő sorokban például azt ellenőrizzük le, hogy a poligon vagy multipoligon típusú elemmel van­-e dolgunk:

geometry = feature.GetGeometryRef()
if geometry.GetGeometryName() == 'POLYGON' or geom.GetGeometryName() =='MULTIPOLYGON':
  # feldolgozás

A típusokat az OGR konstansaival (pl. ogr.wkbPoint, ogr.wkbLineString, ogr.wkbPolygon, ogr.wkbMultiPoint, ogr.wkbMultiLineString, ogr.wkbMultiPolygon, stb.) is azonosíthatjuk.

OGR Attribútumok

Az attribútomokat a GetField() függvénnyel és annak variációival érhetjük el. Például:

attr = feature.GetField('id')
attrstr = feature.GetFieldAsString('id')

Az attribútumok számát a GetFieldCount() függvénnyel kapjuk meg.


Shape file geometriájának egyszerűsítése

A következő Python kód egy Shape file geometriáját egyszerűsíti, adott toleranciával. A fontosabb sorokhoz magyarázatot fűztünk.

#!/usr/bin/python
# ­*­ coding: utf­8 ­*­

import os, sys
from osgeo import ogr

# infile ­ bemeneti állomány neve
# outfile ­ kimeneti állomány neve
# tolerance ­ a egyszerűsítés paramétere

def simplify(infile, outfile, tolerance):
  # az ESRI Shapefile meghajtó
  driver = ogr.GetDriverByName('ESRI Shapefile')
  
  # olvasásra nyitjuk meg a bemeneti állományt
  infile = driver.Open(infile,0)
  if infile is None:
    print 'Nem tudom megnyitni a(z) ', infile, ' nevű állományt!'
    sys.exit(1)

  # a bemeneti állomány adatai: layer, feature, geometry
  inputLayer = infile.GetLayer()
  inputFeature = inputLayer.GetNextFeature()
  geom = inputFeature.GetGeometryRef()
  geomType = geom.GetGeometryType()

  # a kimeneti állomány létrehozása
  if os.path.exists(outfile):
    os.remove(outfile)
  try:
    output = driver.CreateDataSource(outfile)
  except:
    print 'Nem tudom létrehozni a(z)', outfile, ' nevű állományt!'
    sys.exit(1)

  # réteg létrehozása a kimeneten
  outputLayer = output.CreateLayer('Tolerance',geom_type=geomType,srs=inputLayer.GetSpatialRef())
  if outputLayer is None:
    print 'Nem tudom lérehozni a megfelelő layer­t a kimeneti állományban!'
    sys.exit(1)
  outputLayerDef = outputLayer.GetLayerDefn()
  featureID = 0

# végigmegyünk az összes elemen
while inputFeature:
  # az eredeti geometria
  geometry = inputFeature.GetGeometryRef()
  # az egyszerűsített geometria
  simplifiedGeom = geometry.Simplify(tolerance)
  # megpróbálunk létrehozni egy új feature­t az egyszerűsített geometriával
  try:
    newFeature = ogr.Feature(outputLayerDef)
    newFeature.SetGeometry(simplifiedGeom)
    newFeature.SetFID(featureID)
    outputLayer.CreateFeature(newFeature)

  except:
    print "Nem tudtam létrehozni az egyszerűsített geomatriát!"

  newFeature.Destroy()
  inputFeature.Destroy()
  inputFeature = inputLayer.GetNextFeature()
  featureID += 1
  infile.Destroy()
  output.Destroy()
  print "Az egyszerűsítést sikeresen végrehajtottam"

return

# a parancssorban átadott paraméterek
if (len(sys.argv) < 4):
  print ('Használat: python simplify.py <bemenet> <kimenet> <tolerancia>')
  sys.exit(0)

# az egyszerűsítő függvény meghívása
simplify(sys.argv[1], sys.argv[2], float(sys.argv[3]))


Népsűrűség ábrázolása térképen

Az alábbi kód, egy meglévő shapefile rétegre egy másikat generál, egy megadott atríbútum táblából, aminek segítségével szemlélteti, hogy az adott területeken mekkora a népsűrűség. Ehhez pontokat generál, egy pont 100 embert reprezentál.

from osgeo import ogr
import random
# shapefile megnyitasa ogr reteg letrehozasa elso feature lekerese
source = ogr.Open("GIS_CensusTract_poly.shp")
county = source.GetLayer("GIS_CensusTract_poly")
feature = county.GetNextFeature()
# kimeneti shapefile es reteg letrehozasa
driver = ogr.GetDriverByName('ESRI Shapefile')
output = driver.CreateDataSource("PopDensity.shp")
dots = output.CreateLayer("PopDensity", geom_type=ogr.wkbPoint)
while feature is not None:
  field_index = feature.GetFieldIndex("POPULAT11")
  population = int(feature.GetField(field_index))
  # 1 pont szaz embert reprezental 
  density = population / 100
  count = 0   
  while count < density:
    geometry = feature.GetGeometryRef()
    minx, maxx, miny, maxy = geometry.GetEnvelope()
    x = random.uniform(minx,maxx)
    y = random.uniform(miny,maxy)
    f = ogr.Feature(feature_def=dots.GetLayerDefn())
    wkt = "POINT(%f %f)" % (x,y)
    point = ogr.CreateGeometryFromWkt(wkt)
    # Csak akkor hasznaljuk a pontot, ha benne van az adott alakzatban
    if feature.GetGeometryRef().Contains(point):
        f.SetGeometryDirectly(point)
        dots.CreateFeature(f)
        count += 1
    # objektum eltorlese
    f.Destroy()
  feature = county.GetNextFeature()
source.Destroy()
output.Destroy()

Hivatkozások

http://www.gdal.org/

https://pcjericks.github.io/py-gdalogr-cookbook/

http://www.osgeo.org/gdal_ogr

http://geoexamples.com/

http://www.digital-geography.com/create-and-edit-shapefiles-with-python-only/