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:
Obtengo este resultado:
que parece ser lo que usted busca.
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.
1 votos
Muchas gracias @mgri. Esto era exactamente lo que estaba buscando :-)
0 votos
¡Oh, bueno! Me alegro de que haya sido útil.