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

path = "d:/geodata/"
filename2 = 'reformed'
filename3 = 'cxhull_' + filename2

reformed_layer = QgsVectorLayer(path + filename2 + ".shp", filename2, "ogr")
#processing.algorithmHelp("qgis:minimumboundinggeometry")

parameters = {'INPUT': reformed_layer,
              'TYPE': 3,
              'OUTPUT': path + filename3 + ".shp"
              }
processing.run("qgis:minimumboundinggeometry", parameters)

cxlayer = QgsVectorLayer(path + filename3 + ".shp", filename3, "ogr")
QgsProject.instance().addMapLayer(cxlayer)

Próbáljuk ki az iránytott téglalapot is (TYPE: 1).

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:

cv_alpha = 0.7
filename4 = 'cvhull_' + filename2 + str(cv_alpha)
#processing.algorithmHelp("qgis:concavehull")
parameters = {'INPUT': reformed_layer,
              'ALPHA': cv_alpha,
              'HOLES': False,
              'NO_MULTIGEOMETRY': False,
              'OUTPUT': path + filename4 + ".shp"
              }
processing.run("qgis:concavehull", parameters)

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

A befoglaló burok lehet egy jellemző a lefedettségre, de nem teljesen objektív, 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 belseje. Ehhez először tegyünk le a konvex burokban bizonyos számú véletlenszerű pontot:

point_count = 3000
parameters = {'INPUT': cxlayer,
              'STRATEGY': 0,
              'EXPRESSION': point_count,
              'MIN_DISTANCE': 5000,
              'OUTPUT': path + filename3 + '-' + str(point_count) + ".shp"
              }
              
processing.run("qgis:randompointsinsidepolygons", parameters)

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.

Megjegyzés: 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.

Töltsük be a véletlen pontok réteget (illetve annak egy kisebb részhalmazát), fűzzük fel egy-egy listába a pontjaikat (véletlen pontok, templomok). Majd írjunk egy ciklust, ami végigfut minden pontpáron, kiszámítja a pontok közti távolságokat, és eltárolja az adott véletlen ponthoz tartozó legkisebb távolság értéket:

from PyQt5.QtCore import QVariant

...

outputlayer = QgsVectorLayer(path + filename3 + '-' + str(point_count) + ".shp",
                             filename3, "ogr")
outputlayer.dataProvider().addAttributes([QgsField("mindist", QVariant.Double)])
outputlayer.updateFields()

reformed_points = [feature for feature in reformed_layer.getFeatures()]    
random_points = [feature for feature in outputlayer.getFeatures()]

idx = outputlayer.fields().lookupField('mindist')

for random_point in random_points:
    random_geom = random_point.geometry()
    distance_list = []
    for church in reformed_points:
        church_geom = church.geometry()
        distance = QgsGeometry.distance(random_geom, church_geom)
        distance_list.append(distance)
    mindist = min(distance_list)
    attrs = { idx: mindist}
    fid = random_point.id()
    outputlayer.dataProvider().changeAttributeValues({fid: attrs})
    
QgsProject.instance().addMapLayer(outputlayer)

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).

3. á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.
3. á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.

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

4. ábra: A református templomok lefedettségének TIN (Triangulated Irregular Network) modellje.
4. á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

5. ábra: A lefedettség szintvonalas térképe.
5. á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