8 votos

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

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) encima del mapa. Los cuadrados deben comportarse de la siguiente manera:

  1. La plaza sólo debe ser visible si hay al menos un edificio en ella.

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

  3. El cuadrado debe ser gris si algunos de los edificios del cuadrado tienen un "download_speed" por encima de 10 (Mbit/s)

  4. El cuadrado debe ser negro si todos los edificios del cuadrado tienen un "download_speed" por encima de 10 (Mbit/s)

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

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

enter image description here

0 votos

¡Bienvenido a GIS SE! Tengo dos preguntas para ti: 1) ¿eres capaz de crear la cuadrícula por tu cuenta? No veo ningún criterio para su creación (sobre la extensión, por ejemplo). 2) ¿Quieres mantener las celdas que no almacenan ninguna información (es decir, donde no hay ningún edificio dentro de ellas)? ¿O tal vez sólo quiere que no se muestren al renderizar los colores?

0 votos

Sé cómo crear un vectorgrid con Qgis, pero tal vez el camino a seguir es hacer los cuadrados con PyQgis o alguna otra manera? No tengo que mantener los cuadrados sin edificios.

0 votos

Por favor, vea mi respuesta y dígame si se ajusta a sus necesidades.

5voto

Geoffrey Puntos 228

Hace algún tiempo escribí un post para crear una cuadrícula vectorial de polígonos:

Cómo generar una cuadrícula vectorial de polígonos en QGIS utilizando Python

que me inspiró para proponer una solución.

Mi enfoque recurre a un script personalizado del Caja de herramientas de procesamiento (por favor, consulta el post anterior si no sabes cómo hacerlo).

Como parámetros de entrada, requiere:

  • la capa de vectores de puntos;
  • la extensión de la red;
  • el espaciado horizontal, es decir, la longitud del lado horizontal de las características en la cuadrícula;
  • el espaciado vertical, es decir, la longitud del lado vertical de las características en la cuadrícula.

Suponiendo que las velocidades de descarga se almacenan en el "download_speed" campo, puede utilizar 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, deberías ser capaz de entender fácilmente el código anterior y adaptarlo a tus necesidades específicas (de lo contrario, hazme saber si necesitas alguna explicación). Una cosa más: no probé en profundidad los condicionales para la asignación de colores, pero debería ser una tarea fácil para ti.

Probando el código en estos puntos aleatorios:

enter image description here

Obtengo este resultado:

enter image description here

que parece ser lo que usted busca.

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