Cortando una rejilla (grid) hexagonal creada con PyQGIS

En el post anterior se consideró la creación de una rejilla hexagonal. Esta contenía unos “salientes” laterales y en las partes superior e inferior de la rejilla. Además, el punto de referencia usado para su confección luce desplazado por la necesidad de encajar las filas de la manera adecuada.

Las modificaciones al código exigen ubicar el punto de inicio y final del corte para crear una geometría asociada a la clase QgsRectangle. Esta geometría se intersectará con la correspondiente a cada feature en el mismo loop de creación de la memory layer.

El código completo se incluye a continuación:

import numpy as np

bufferLength = 1000
polygonSides = 6

inc_x = 2 * bufferLength * np.cos(np.pi*30/180)
inc_y = inc_x * np.cos(np.pi*30/180)

p_init = QgsPoint(354972.451507, 4473926.04508)

p1 = QgsPoint(p_init.x(), p_init.y() - bufferLength/2)

points = []

x = p1.x() + inc_x/2
y = p1.y()

rows = 8
cols = 10

p_final = QgsPoint(p_init.x() + cols*inc_x - inc_x/2, p_init.y() - (rows-1)*inc_y - bufferLength)
    
for i in range(rows):
    for j in range(cols):
        point = QgsPoint(x, y)
        points.append(point)
        x += inc_x
    y -= inc_y
    ver = i%2

    if ver ==0:
        h = 0
    else:
        h = inc_x/2
    x = p1.x() + h

epsg = 32612

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'buffer',
                           'memory')

prov = mem_layer.dataProvider()

extent = QgsRectangle(p_init, p_final)

geom_rect = QgsGeometry.fromRect(extent)

for i, point in enumerate(points):
    outFeat = QgsFeature()
    geom = QgsGeometry.fromPolygon([[ QgsPoint(point[0] + np.sin(angle)*bufferLength, point[1] + np.cos(angle)*bufferLength)
                                   for angle in np.linspace(0, 2*np.pi, polygonSides + 1, endpoint = True) ]])

    new_geom = geom.intersection(geom_rect)

    outFeat.setGeometry(new_geom)
    
    outFeat.setAttributes([i])
    prov.addFeatures([outFeat])

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Después de ejecutado en la Python Console de QGIS se obtiene lo siguiente:

cut1

En la imagen anterior, sólo como referencia, se incluyen los puntos inicial y final de corte. Por otra parte, la lista ‘points’ contiene todos los centroides de los hexágonos antes del corte. Si se desea, se puede conformar una memory layer de puntos con ellos.

Esta entrada fue publicada en PyQGIS, SIG, Software Libre. Guarda el enlace permanente.

Una respuesta a Cortando una rejilla (grid) hexagonal creada con PyQGIS

  1. Pingback: Cómo producir rejillas (grid) triangulares mediante PyQGIS | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s