„GDAL/OGR használata Python nyelvben” változatai közötti eltérés
| a (Python példakódok kijavítása) | |||
| 49. sor: | 49. sor: | ||
| milyen driverek állnak rendelkezésünkre: | milyen driverek állnak rendelkezésünkre: | ||
| − | < | + | <source lang="python"> | 
| from osgeo import ogr | from osgeo import ogr | ||
| driverList = [] | driverList = [] | ||
| 61. sor: | 61. sor: | ||
| for i in formatsList: | for i in formatsList: | ||
|    print i |    print i | ||
| − | </ | + | </source> | 
| A kiírt nevek alapján azonosíthatjuk a megfelelő drivert. A Shape fájl formátumot például az | A kiírt nevek alapján azonosíthatjuk a megfelelő drivert. A Shape fájl formátumot például az | ||
| 73. sor: | 73. sor: | ||
| 1 ha írni is szeretnénk bele. | 1 ha írni is szeretnénk bele. | ||
| − | < | + | <source lang="python"> | 
| file = driver.Open(filename, 0) | file = driver.Open(filename, 0) | ||
| if file is None: | if file is None: | ||
|    print ('Nem tudtam megnyitni a fájlt!') |    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 | Amennyiben a meghajtó nem tudta megnyitni az állományt, akkor a None értéket adja vissza. Ez a | ||
| 90. sor: | 90. sor: | ||
| 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> | 
| 97. sor: | 97. sor: | ||
| függvénnyel érhetjük el. Vagy végig lehet menni az összes featureen a következő kóddal: | függvénnyel érhetjük el. Vagy végig lehet menni az összes featureen a következő kóddal: | ||
| − | < | + | <source lang="python"> | 
| feature = layer.GetNextFeature() | feature = layer.GetNextFeature() | ||
| while feature: | while feature: | ||
| 103. sor: | 103. sor: | ||
|    feature = layer.GetNextFeature() |    feature = layer.GetNextFeature() | ||
|    layer.ResetReading() #ha újra kell kezdeni a beolvasást |    layer.ResetReading() #ha újra kell kezdeni a beolvasást | ||
| − | </ | + | </source> | 
| A Shape fájlunk csak egyetlen featuret tartalmaz, ezért a GetNextFeauter() egyszeri meghívásával | A Shape fájlunk csak egyetlen featuret tartalmaz, ezért a GetNextFeauter() egyszeri meghívásával | ||
| 111. sor: | 111. sor: | ||
| sorokban például azt ellenőrizzük le, hogy a poligon vagy multipoligon típusú elemmel vane | sorokban például azt ellenőrizzük le, hogy a poligon vagy multipoligon típusú elemmel vane | ||
| dolgunk: | dolgunk: | ||
| − | < | + | <source lang="python"> | 
| geometry = feature.GetGeometryRef() | geometry = feature.GetGeometryRef() | ||
| if geometry.GetGeometryName() == 'POLYGON' or geom.GetGeometryName() =='MULTIPOLYGON': | if geometry.GetGeometryName() == 'POLYGON' or geom.GetGeometryName() =='MULTIPOLYGON': | ||
|    # feldolgozás |    # feldolgozás | ||
| − | </ | + | </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, | ||
| 124. sor: | 124. sor: | ||
| 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: | ||
| − | < | + | <source lang="python"> | 
| attr = feature.GetField('id') | attr = feature.GetField('id') | ||
| attrstr = feature.GetFieldAsString('id') | attrstr = feature.GetFieldAsString('id') | ||
| − | </ | + | </source> | 
| 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. | ||
| 137. sor: | 137. sor: | ||
| sorokhoz magyarázatot fűztünk. | sorokhoz magyarázatot fűztünk. | ||
| − | < | + | <source lang="python"> | 
| #!/usr/bin/python | #!/usr/bin/python | ||
| 215. sor: | 215. sor: | ||
| # az egyszerűsítő függvény meghívása | # az egyszerűsítő függvény meghívása | ||
| simplify(sys.argv[1], sys.argv[2], float(sys.argv[3])) | simplify(sys.argv[1], sys.argv[2], float(sys.argv[3])) | ||
| − | </ | + | </source> | 
A lap 2016. május 15., 19:20-kori változata
Tartalomjegyzék
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 drivereket) használ. A következő Python kóddal tudjuk megvizsgálni, hogy milyen driverek á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 featureek számát a layer
GetFeatureCount() függvényével kérhetjük le, és az egyes featureek a GetFeature(index)
függvénnyel érhetjük el. Vagy végig lehet menni az összes featureen 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 featuret 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 vane 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
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: utf8 *
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ő layert 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 featuret 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]))

