Lefedettség vizsgálata

Folytatva az előző fejezetet, vizsgáljuk meg, hogy mekkora területet fed le a református egyház:

import processing filename3 = filename2 + '_cxhull' processing.runalg('qgis:convexhull', path + filename2 + ".shp", None, 0, path + filename3 + '.shp') layer3 = QgsVectorLayer(path + filename3 + ".shp", filename3, "ogr") QgsProject.instance().addMapLayer(layer3)

A konvex (befoglaló) burok számításához a processing függvénykönyvtárt vettük igénybe.

1. ábra: Konvex burok sárga színnel, konkávburkok (küszöbértékek: 0.1, 0.3, 0.7) kékkel.
1. ábra: Konvex burok sárga színnel, konkávburkok (küszöbértékek: 0.1, 0.3, 0.7) kékkel.

A konkáv burokhoz szükséges kód minta:

processing.runalg('qgis:concavehull', input, alpha, holes, no_multigeometry, output)

A küszöbérték 1-re állításával a konvex burokot kapjuk eredményül.

A befoglaló burok lehet egy fajta jellemző a lefedettségre, de menjünk kicsit beljebb a ‘lefedettségbe’. Mivel ugyanezt az ereményt kapnánk, ha csak a szélső templomok léteznének.

Vizsgáljuk meg, hogy mennyire lefedett a lefedett terület! Tegyünk le a poligon(ok)ban bizonyos számú véletlenszerű pontokat.

Ehhez először határozzuk meg egy oszlopba, hány pontot szeretnénk. Tehát készítsünk egy új mezőt:

from PyQt4.QtCore import Qvariant layer3.dataProvider().addAttributes([QgsField("pnum", QVariant.Int)]) layer3.updateFields()

Kérjük le a mező sorszámát, és gyűjtsük össze a rétegben lévő poligonokat (1 darab):

idx = layer3.fieldNameIndex('pnum') iter = layer3.getFeatures()

Vegyünk fel egy egységet, hogy közelítőleg hány négyzetkilométerenként szeretnénk pontokat. Jusson minden 50 km2-re 1 véletlen pont:

coverunit = 50

Írjunk egy ciklust, amivel feltöltjük az új mezőt. De először nézzük meg az első és utolsó poligonunk területét négyzetkilométer dimenzióban:

for feature in iter: print feature.geometry().area() / 1000000

Bővítsük ki a ciklust a terveink alapján, módosítsuk a ‘pnum’ attribútum értéket:

for feature in iter: print feature.geometry().area() / 1000000 pnum = int(feature.geometry().area() / 1000000 / coverunit) print pnum attrs = { idx : pnum} layer3.dataProvider().changeAttributeValues({feature.id(): attrs})

Végül futassuk az eljárást, és adjuk hozzá a réteget:

filename4 = filename2 + '_points' processing.runalg('qgis:randompointsinsidepolygonsvariable', path + filename3 + ".shp", 0, "pnum", 5000, path + filename4 + ".shp") layer4 = QgsVectorLayer(path + filename4 + ".shp", filename4, "ogr") QgsProject.instance().addMapLayer(layer4)

Az 0 azt az opciót jelenti, hogy pontszámot adunk meg (1 - sűrűség helyett), a második számérték pedig a pontok közti minimális távolságot jelenti. Jelen esetben 5 kilométert adtunk meg.

2. ábra: Véletlenszerűen generált pontok a konvex burokban.
2. ábra: Véletlenszerűen generált pontok a konvex burokban.

Számítsuk ki, hogy a véletlenszerűen leszúrt pontjaiktól milyen távolságra vannak a legközelebbi templomok. A kiszámított értékeket mentsük el a véletlenszerű pontok attribútum táblájában.

Töltsük be a véletlen pontok réteget, illetve annak egy kisebb részhalmazát:

path = "d:/geodata/" filename1 = "reformed_points_test" layer1 = QgsVectorLayer(path + filename1 + ".shp", filename1, "ogr")

Először célszerű egy tesztrétegen debugolni, hogy működik-e egyáltalán az általunk megírt szkript. Nagy adathalmazok esetén egy-egy rossz sor könnyen kifagyáshoz vezethet.

Majd a református templomok tesztréteget is töltsük be:

filename2 = "reformed_test" layer2 = QgsVectorLayer(path + filename2 + ".shp", filename2, "ogr")

Adjuk hozzá a rétegeket a projekthez:

QgsProject.instance().addMapLayer(layer1) QgsProject.instance().addMapLayer(layer2)

Ezt követően minden kódsort a réteg hozzáadás elé írjunk.

3. ábra: A hozzáadott két réteg: narancssárga - véletlen pontok; zöld - templomok. Alaptérkép: Google Hybrid
3. ábra: A hozzáadott két réteg: narancssárga - véletlen pontok; zöld - templomok. Alaptérkép: Google Hybrid

Fűzzük fel egy-egy listába a pontjaikat:

points1 = [feature for feature in layer1.getFeatures()] points2 = [feature for feature in layer2.getFeatures()]

Írjunk egy ciklust, ami végigfut minden pontpáron. Kiszámítja és tárolja a pontok közti távolságokat, s az adott véletlen ponthoz tartozó legkisebb értéket kiszedi a megfelelő távolságlistából:

for point1 in points1: p1geom = point1.geometry() dlist = [] for point2 in points2: p2geom = point2.geometry() di = QgsGeometry.distance(p1geom, p2geom) dlist.append(di/1000) print min(dlist)

A d(i) egyes távolságokat leosztottuk 1000-el, hogy a mértékegység kilométer dimenzióban legyen.

Most már csak attribútumként kell tárolni az adatokat, ehhez hozzunk létre egy új mezőt a véletlen pontoknak (még a ciklus előtt):

from PyQt4.QtCore import QVariant if layer1.fieldNameIndex('tdist') == -1: layer1.dataProvider().addAttributes([QgsField("tdist", QVariant.Double)]) layer1.updateFields()

Egészítsük ki, illetve módosítsuk úgy a ciklust, hogy az egyes távolságok a létrehozott ‘tdist’ mezőbe kerüljenek:

idx = layer1.fieldNameIndex('tdist') for point1 in points1: p1geom = point1.geometry() dlist = [] for point2 in points2: p2geom = point2.geometry() di = QgsGeometry.distance(p1geom, p2geom) dlist.append(di/1000) attrs = { idx : min(dlist)} layer1.dataProvider().changeAttributeValues({point1.id(): attrs})

Színezzük a szoftveren belül, a grafikus interfész segítségével a pontokat aszerint, hogy milyen messzire vannak a templomoktól (Fokozott invertált színezés skála alapján).

4. ábra: Templomok kékkel, véletlen pontok fehér-sárga-piros árnyalattal. Minél közelebb van a templom, annál pirosabb a pont.
4. ábra: Templomok kékkel, véletlen pontok fehér-sárga-piros árnyalattal. Minél közelebb van a templom, annál pirosabb a pont.

Mivel a számítás működött a tesztrétegen, valószínűleg az eredeti rétegen is fog. Távolítsuk el a _test utótagokat. Majd futassuk újra a szkriptet. Készítsünk egy statisztikai felületet, például egy TIN hálót a pontjainkra. A cellaméreteket 1 kilométerre állítsuk:

Raster / Interpolation / Interpolation

5. ábra: A református templomok lefedettségének TIN (Triangulated Irregular Network) modellje.
5. ábra: A református templomok lefedettségének TIN (Triangulated Irregular Network) modellje.

Színezzük a rasztert a sávinformáció alapján. Ezt követőn készítsünk szintvonalakat 5 kilométeres szintvonalközzel. 11 osztály, 0 – 50 közt, invertálva.

Raster / Extraction / Contour

6. ábra: A lefedettség szintvonalas térképe.
6. ábra: A lefedettség szintvonalas térképe.

Megjegyzem, az 5. ábrához hasonló eredmény elméletileg előállítható a tempolomok raszterizálásaval, majd azt követően távolságraszter készítésével.

© Dr. Wirth Ervin