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

Innen: GIS Wiki
(Támogatott bemeneti adatformátumok)
(Használat)
47. sor: 47. sor:
 
*  ODBC
 
*  ODBC
  
'''Adatok beolvasása'''
+
'''Hozzáférés a filehoz'''
  
 
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 OGR könyvtár úgynevezett
 
 
meghajtókat (vagy driver­eket) használ. A következő Python kóddal tudjuk megvizsgálni, hogy
 
meghajtókat (vagy driver­eket) használ. A következő Python kóddal tudjuk megvizsgálni, hogy
 
 
milyen driver­ek állnak rendelkezésünkre:
 
milyen driver­ek állnak rendelkezésünkre:
  
 
<code>
 
<code>
 
from osgeo import ogr
 
from osgeo import ogr
 
 
driverList = []
 
driverList = []
  
 
for i in range(ogr.GetDriverCount()):
 
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
 +
</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.
 +
 +
<code>
 +
file = driver.Open(filename, 0)
 +
if file is None:
 +
  print ('Nem tudtam megnyitni a fájlt!')
 +
</code>
 +
 +
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érképészeti adat kinyerése'''
 +
 +
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
  
driver = ogr.GetDriver(i)
+
<code>
 +
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()
 +
</code>
  
driverName = driver.GetName()
+
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:
  
if not driverName in driverList:
+
<code>
 +
feature = layer.GetNextFeature()
  
formatsList.append(driverName)
+
while feature:
 +
  # feldolgozás
 +
  feature = layer.GetNextFeature()
 +
  layer.ResetReading() #ha újra kell kezdeni a beolvasást
 +
</code>
  
for i in formatsList:
+
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:
 +
<code>
 +
geometry = feature.GetGeometryRef()
 +
if geometry.GetGeometryName() == 'POLYGON' or geom.GetGeometryName() =='MULTIPOLYGON':
 +
  # feldolgozás
 +
</code>
 +
 
 +
A típusokat az OGR konstansaival (pl. ogr.wkbPoint, ogr.wkbLineString, ogr.wkbPolygon,
 +
ogr.wkbMultiPoint, ogr.wkbMultiLineString, ogr.wkbMultiPolygon, stb.) is azonosíthatjuk.
 +
 
 +
'''Attribútumok'''
 +
 
 +
Az attribútomokat a GetField() függvénnyel és annak variációival érhetjük el. Például:
  
print i
+
<code>
 +
attr = feature.GetField('id')
 +
attrstr = feature.GetFieldAsString('id')
 
</code>
 
</code>
 +
 +
Az attribútumok számát a GetFieldCount() függvénnyel kapjuk meg.
 +
 +
==Példaprogramok==

A lap 2016. május 13., 19:38-kori változata

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 OGR

könyvtárhoz úgynevezett Python kötéseket készítettek, hogy Python programokból elérhetők

legyenek az OGR funkciói: ez a Python OGR modul.

Használat

Támogatott adatformátumok

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:

  • ESRI shapefile
  • personal geodatabase (térinformatikai adatokat tároló Microsoft Access adatbázis)
  • ArcSDE adatbázis
  • MapInfo formátum
  • GRASS formátum
  • Bentley Systems MicroStation formátum
  • TIGER/Line
  • SDTS
  • GML
  • KML
  • MySQL, PostgreSQL, MariaDB, stb
  • Oracle Spatial
  • Informix
  • ODBC

Hozzáférés a filehoz

A különböző fájltípusoknak és más adatforrásoknak a kezelésére az OGR könyvtár úgynevezett meghajtókat (vagy driver­eket) használ. A következő Python kóddal tudjuk megvizsgálni, hogy milyen 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érképészeti adat kinyerése

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

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.

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.

Példaprogramok