Cálculo de colores de los cuadrados en una cuadrícula de vectores en QGIS 2.18.5

8

Tengo una capa con muchos edificios como puntos en un mapa. Uno de los atributos de cada edificio es "download_speed".

Quiero poner una cuadrícula cuadrada (100 x 100 metros) en la parte superior del mapa. Los cuadrados deben comportarse de la siguiente manera:

  1. El cuadrado solo debe ser visible si hay al menos un edificio en el cuadrado.

  2. El cuadrado debe ser rojo si ninguno de los edificios del cuadrado tiene un valor "download_speed"superior a 10 (Mbit / s).

  3. El cuadrado debe ser gris si algunos de los edificios en el cuadrado tienen un valor "download_speed"superior a 10 (Mbit / s)

  4. El cuadrado debe ser negro si todos los edificios del cuadrado tienen un valor "download_speed"superior a 10 (Mbit / s)

Soy un novato en QGIS (y software GIS en general), pero un usuario experimentado de Python en ciencia de datos.

El resultado final debería parecerse a la imagen de abajo:

ingrese la descripción de la imagen aquí

Roger Markussen
fuente
Bienvenido a GIS SE! Tengo dos preguntas para usted: 1) ¿puede crear la cuadrícula por su cuenta? No veo ningún criterio para su creación (sobre la extensión, por ejemplo). 2) ¿Desea mantener las celdas que no almacenan ninguna información (es decir, donde no hay edificio dentro de ellas)? ¿O tal vez solo desea no mostrarlos al renderizar los colores?
mgri
Sé cómo crear una cuadrícula de vectores con Qgis, pero tal vez el camino a seguir es hacer los cuadrados con PyQgis o de alguna otra manera. No tengo que mantener las plazas sin edificios.
Roger Markussen
Por favor, vea mi respuesta y avíseme si se ajusta a sus necesidades.
mgri 01 de
1
Muchas gracias @mgri. Esto era exactamente lo que estaba buscando :-)
Roger Markussen
¡Oh bien! ¡Me alegra que haya sido útil!
mgri

Respuestas:

5

Hace algún tiempo escribí una publicación para crear una cuadrícula de polígonos vectoriales:

Cómo generar una grilla vectorial de polígonos en QGIS usando Python

lo que me inspiró para proponer una solución.

Mi enfoque recurre a un script personalizado de Processing Toolbox (consulte la publicación anterior si no sabe cómo hacerlo).

Como parámetros de entrada, requiere:

  • la capa del vector de puntos;
  • la extensión de la cuadrícula;
  • el espaciado horizontal, es decir, la longitud lateral horizontal para las entidades en la cuadrícula;
  • el espacio vertical, es decir, la longitud lateral vertical para las entidades en la cuadrícula.

Suponiendo que las velocidades de descarga se almacenan en el "download_speed"campo, puede usar este código:

##Point_layer=vector point
##Grid_extent=extent
##Horizontal_spacing=number 10
##Vertical_spacing=number 10

from qgis.core import *
from qgis.PyQt.QtCore import QVariant
from PyQt4.QtGui import QColor

layer = processing.getObject(Point_layer)
crs = layer.crs().toWkt()

extent = Grid_extent.split(',')
(xmin, xmax, ymin, ymax) = (float(extent[0]), float(extent[1]), float(extent[2]), float(extent[3]))
hspacing = Horizontal_spacing
vspacing = Vertical_spacing

# Create the grid layer
vector_grid = QgsVectorLayer('Polygon?crs='+ crs, 'vector_grid' , 'memory')
prov = vector_grid.dataProvider()

all_features = {}
index = QgsSpatialIndex() # Spatial index
for ft in layer.getFeatures():
    index.insertFeature(ft)
    all_features[ft.id()] = ft

# Add ids and coordinates fields
fields = QgsFields()
fields.append(QgsField('ID', QVariant.Int, '', 10, 0))
fields.append(QgsField('XMIN', QVariant.Double, '', 24, 6))
fields.append(QgsField('XMAX', QVariant.Double, '', 24, 6))
fields.append(QgsField('YMIN', QVariant.Double, '', 24, 6))
fields.append(QgsField('YMAX', QVariant.Double, '', 24, 6))
fields.append(QgsField('Color', QVariant.String, '', 10))
prov.addAttributes(fields)

# Generate the features for the vector grid
id = 0
y = ymax
while y >= ymin:
    x = xmin
    while x <= xmax:
        point1 = QgsPoint(x, y)
        point2 = QgsPoint(x + hspacing, y)
        point3 = QgsPoint(x + hspacing, y - vspacing)
        point4 = QgsPoint(x, y - vspacing)
        vertices = [point1, point2, point3, point4] # Vertices of the polygon for the current id
        inAttr = [id, x, x + hspacing, y - vspacing, y]
        tmp_geom = QgsGeometry().fromPolygon([vertices])
        idsList = index.intersects(tmp_geom.boundingBox())
        if idsList:
            tmp_list = [all_features[id]['download_speed'] for id in idsList]
            if max(tmp_list) <= 10:
                inAttr.append('Red')
            elif min(tmp_list) > 10:
                inAttr.append('Black')
            else:
                inAttr.append('Grey')
            feat = QgsFeature()
            feat.setGeometry(tmp_geom) # Set geometry for the current id
            feat.setAttributes(inAttr) # Set attributes for the current id
            prov.addFeatures([feat])
            id += 1
        x = x + hspacing
    y = y - vspacing

# Update fields for the vector grid
vector_grid.updateFields()

# define the lookup: value -> (color, label)
speeds_colors = {'Red': ('#e31a1c', 'Red'), 'Black': ('#000000', 'Black'), 'Grey': ('#82807f', 'Grey'),}

# create a category for each item in speeds_colors
categories = []
for speed_color, (color, label) in speeds_colors.items():
    symbol = QgsSymbolV2.defaultSymbol(vector_grid.geometryType())
    symbol.setColor(QColor(color))
    category = QgsRendererCategoryV2(speed_color, symbol, label)
    categories.append(category)
print categories
# create the renderer and assign it to the layer
expression = 'Color' # field name
renderer = QgsCategorizedSymbolRendererV2(expression, categories) # categorized symbol renderer
vector_grid.setRendererV2(renderer) # assign the renderer to the layer
vector_grid.triggerRepaint()

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

Como usuario experimentado de Python, debe poder comprender fácilmente el código anterior y adaptarlo a sus necesidades específicas (de lo contrario, avíseme si necesita alguna explicación). Una cosa más: no probé profundamente los condicionales para la asignación de colores, pero debería ser una tarea fácil para usted.

Probar el código en estos puntos aleatorios:

ingrese la descripción de la imagen aquí

Obtengo este resultado:

ingrese la descripción de la imagen aquí

que parece ser lo que estás buscando.

mgri
fuente