6 votos

El cálculo de valores predominante de acuerdo a la zona dentro de los polígonos?

Estoy usando QGIS 2.18.1 Las Palmas, en Windows 10, y ese es el problema que quiero aclarar:

Tengo 2 polígono formas. 1 - Uno con las cuencas hidrográficas, y 2 - otro con diferentes niveles de dessertification riesgo:

River basins

dessertificationrisk

En las tablas de atributos para cada uno, tengo nombres para cada uno de los ríos de la cuenca en el primer mapa, y en el segundo, tengo 5 diferentes niveles (diferenciadas por colores en la imagen)

Así, lo que necesito es no sólo cortan o se cruzan dos de ellos. Lo que necesito es saber que nivel de dessertification riesgo es más predominante, dentro de cada cuenca hidrográfica. En otras palabras, necesito un final de forma similar como las cuencas de los ríos de la forma, pero con una columna adicional diciendo que el nivel de dessertification riesgo que ocupa el mayor % de la superficie dentro de cada cuenca.

Por ejemplo: voy a acercar a una de las cuencas, la configuración de las cuencas de los ríos sin relleno, de modo que usted puede ver el dessertification riesgo capa detrás:

enter image description here

Podemos ver diferentes colores dentro del polígono. Inicialmente, parece que el más predominante color es el morado, o podría ser la luz verde.

Lo que necesito es determinar que cubre el mayor % de la superficie dentro de este polígono, y se establece como un nuevo valor para las cuencas de los polígonos.

He intentado varias cosas pero no encuentro la solución.

5voto

Geoffrey Puntos 228

He creado un conjunto de datos de ejemplo para reproducir el problema y he hecho algunas hipótesis:

  • la capa de las cuencas fluviales (de color con la luz verde) almacena el nombre de cada uno de los ríos de la cuenca en un campo llamado "BASIN_NAME";
  • la capa con diferentes niveles de riesgos de desertificación (de color con una rampa de color de los tintos) almacena el valor del riesgo en un campo llamado "RISK_LEVEL";
  • el nivel de riesgo de desertificación está formateado como un valor entero (pero esto puede ser fácilmente adaptado a sus necesidades específicas).

enter image description here

Usted puede utilizar esta secuencia de comandos:

# Layer of the river basins
##risks=vector
# Layer with different levels of desertification risk
##basins=vector

from qgis.core import *
from qgis.PyQt.QtCore import QVariant

layer1 = processing.getObject(risks)
crs = layer1.crs().toWkt()
layer2 = processing.getObject(basins)

# Create the output layer
outLayer = QgsVectorLayer('Polygon?crs='+ crs, 'basins_new' , 'memory')
prov = outLayer.dataProvider()
fields = layer2.pendingFields() # Fields from the input layer
fields.append(QgsField('PREDOMIN_RISK', QVariant.Int, '', 10, 0)) # Name for the new field in the output layer
prov.addAttributes(fields) # Add input layer fields to the outLayer
outLayer.updateFields()

# Run the 'intersection' algorithm from Processing
intersect = processing.runalg('qgis:intersection', layer1, layer2, False, None)
intersected = processing.getObject(intersect['OUTPUT'])

# Create a dictionary and a spatial index with the features from the previous intersection
allfeatures = {}
index = QgsSpatialIndex()
for feat1 in intersected.getFeatures():
    index.insertFeature(feat1)
    allfeatures[feat1.id()] = feat1["RISK_LEVEL"]

for basin in layer2.getFeatures():
    inAttr = basin.attributes() # Input attributes
    basin_geom = basin.geometry() # Input geometry
    engine = QgsGeometry.createGeometryEngine(basin_geom.geometry())
    engine.prepareGeometry()
    idsList = index.intersects(basin_geom.boundingBox())
    count = 0
    if len(idsList) > 0:
        req = QgsFeatureRequest().setFilterFids(idsList)
        tmp_dict = {} # Temporary dictionary containing all the features inside the current river basin
        for ft in intersected.getFeatures(req):
            geom = ft.geometry()
            if engine.intersects(geom.geometry()):
                tmp_dict[ft.id()] = geom.area() # Calculate the area
        if len(tmp_dict.keys()) > 0:
            max_key = max(tmp_dict, key=tmp_dict.get) # Evaluate the key with the maximum value of area
            inAttr.append(allfeatures[max_key]) # Add the desertification risk value from the feature referring to max_key
    outGeom = QgsFeature()
    outGeom.setAttributes(inAttr) # Output attributes
    outGeom.setGeometry(basin_geom) # Output geometry
    prov.addFeatures([outGeom]) # Output feature

# Add the layer to the Layers panel
QgsMapLayerRegistry.instance().addMapLayer(outLayer)

El código se creará una nueva capa de polígono (como la memoria de la capa), que tiene los mismos campos de la cuenca del río de la capa, además de un campo adicional (llamado "PREDOMIN_RISK"), donde predomina un nivel de riesgo de desertificación que se cruza con la actual cuenca del río se almacena.

Por ejemplo, el zoom en una de las cuencas (resaltada con un círculo azul):

enter image description here

vamos a tener dos valores diferentes de riesgo de desertificación (la etiqueta se muestra el correspondiente valor del campo "RISK_LEVEL"):

enter image description here

Para esta cuenca, la tabla de atributos de la capa de salida se muestran:

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X