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

Innen: GIS Wiki
(Támogatott bemeneti adatformátumok)
 
(22 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
 +
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 [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:
  
A nyílt GDAL/OGR (Geospatial Data Abstraction Library, OpenGIS Simple Features Reference
+
$ 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:
 +
 
 +
$ ./configure --with-python
  
Implementation) könyvtárak számos eszközzel segítik a térképészeti adatok feldolgozását. A
+
Ezután a szokásos módon a <code>make</code> eszköz elvégzi a fordítást és a telepítést:
  
GDAL a raszteres, az OGR pedig a vektoros adatok kezeléséért felel. A C++ nyelven írt OGR
+
$ make
 +
$ make install
  
könyvtárhoz úgynevezett Python kötéseket készítettek, hogy Python programokból elérhető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 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 az OGR funkciói: ez a Python OGR modul.
+
=== 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
+
>>> from osgeo import gdal
 +
>>> from osgeo import ogr
 +
>>> from osgeo import osr
 +
>>> from osgeo import gdal_array
 +
>>> from osgeo import gdalconst
  
adatforrást) tudunk kezelni, például:
+
=== Buktatók ===
  
*  ESRI shapefile
+
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:
  
*  personal geodatabase (térinformatikai adatokat tároló Microsoft Access adatbázis)
+
==== A Python kötés nem használ kivételeket ====
  
*  ArcSDE adatbázis
+
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:
  
* MapInfo 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.
 +
>>>
  
*  GRASS 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.
  
* Bentley Systems MicroStation formátum
+
  >>> 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.
 +
>>>
  
*  TIGER/Line
+
Ez megkötés a visszamenőleges kompatibilitás miatt szükséges.
  
*  SDTS
 
  
*  GML
+
==== A Python összeomlik, ha egy olyan objektumot használunk, ami összefügg egy már előzőleg törölt objektummal ====
  
*  KML
+
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.
  
* MySQL, PostgreSQL, MariaDB, stb
+
  >>> 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)
  
*  Oracle Spatial
+
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).
  
* Informix
+
  >>> from osgeo import gdal
 +
>>> print gdal.Open('/home/user/valami.img').GetRasterBand(1).GetMinimum()
 +
Segmentation fault (core dumped)
  
*  ODBC
+
=== Fájlkezelés ===
  
'''Adatok beolvasása'''
+
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:
  
A különböző fájltípusoknak és más adatforrásoknak a kezelésére az OGR könyvtár úgynevezett
+
<source lang="python">
 +
from osgeo import ogr
 +
driverList = []
  
meghajtókat (vagy driver­eket) használ. A következő Python kóddal tudjuk megvizsgálni, hogy
+
for i in range(ogr.GetDriverCount()):
 +
  driver = ogr.GetDriver(i)
 +
  driverName = driver.GetName()
 +
  if not driverName in driverList:
 +
    formatsList.append(driverName)
  
milyen driver­ek állnak rendelkezésünkre:
+
for i in formatsList:
 +
  print i
 +
</source>
  
<code>
+
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.
 +
 
 +
<source lang="python">
 +
file = driver.Open(filename, 0)
 +
if file is None:
 +
  print ('Nem tudtam megnyitni a fájlt!')
 +
</source>
 +
 
 +
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:
 +
 
 +
* '''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==
 +
 
 +
===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:
 +
 
 +
<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:
 +
 
 +
<source lang="python">
 +
feature = layer.GetNextFeature()
 +
while feature:
 +
  # feldolgozás
 +
  feature = layer.GetNextFeature()
 +
  layer.ResetReading() #ha újra kell kezdeni a beolvasást
 +
</source>
 +
 
 +
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:
 +
 
 +
<source lang="python">
 +
geometry = feature.GetGeometryRef()
 +
if geometry.GetGeometryName() == 'POLYGON' or geom.GetGeometryName() =='MULTIPOLYGON':
 +
  # feldolgozás
 +
</source>
 +
 
 +
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:
 +
 
 +
<source lang="python">
 +
attr = feature.GetField('id')
 +
attrstr = feature.GetFieldAsString('id')
 +
</source>
 +
 
 +
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.
 +
 
 +
<source lang="python">
 +
 
 +
#!/usr/bin/python
 +
# ­*­ coding: utf­8 ­*­
 +
 
 +
import os, sys
 
from osgeo import ogr
 
from osgeo import ogr
  
driverList = []
+
# 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]))
 +
</source>
 +
 
 +
 
 +
===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.
  
for i in range(ogr.GetDriverCount()):
+
<source lang="python">
 +
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() 
 +
</source>
  
driver = ogr.GetDriver(i)
+
== Hivatkozások ==
  
driverName = driver.GetName()
+
http://www.gdal.org/
  
if not driverName in driverList:
+
https://pcjericks.github.io/py-gdalogr-cookbook/
  
formatsList.append(driverName)
+
http://www.osgeo.org/gdal_ogr
  
for i in formatsList:
+
http://geoexamples.com/
  
print i
+
http://www.digital-geography.com/create-and-edit-shapefiles-with-python-only/
</code>
 

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/