I'm sorry for the previous mail, here is the body of the message
previously unreadable...
From: Giovanni Pasini <[email protected]>
To: [email protected]
Subject: Re: [Qgis-user] hexagonal grid
Date: Sat, 15 Jan 2011 12:14:20 +0100
This is a very rough method, in fact requires to edit the python file
attached (is a modified python file from ftools by Carson Farmer) for
inserting parameters.
At the moment I'm not able to do better (no python skillful), but I'm
sure someone else could easily create or integrate vector tools for
making hexagonal grid.
Hope it can help.
Instructions:
1) rename your doVectorGrid.py (in
/usr/share/qgis/python/plugins/fTools/tools/ here) to
doVectorGrid_orig.py
2) edit the attached file after line 157 <<< HEXAGON OPTION >>> where
you can choose if make a hexagon by area or by heigth or edge, save the
file as doVectorGrid.py
3) copy the edited file doVectorGrid.py in in
/usr/share/qgis/python/plugins/fTools/tools/
4) start qgis and make the hexagon grid from vector menu -> research
Tools -> Vector grid. In Parameters you can only choose Output grid as
polygons
5) replace the orig doVectorGrid.py for recover to normal situation
(in linux: mv
/usr/share/qgis/python/plugins/fTools/tools/doVectorGrid_orig.py
/usr/share/qgis/python/plugins/fTools/tools/doVectorGrid.py)
Cheers,
Giovanni
Il giorno Wed, 12 Jan 2011 18:06:04 -0430
Eduardo Klein <[email protected]> ha scritto:
> Hi,
> I'm trying to construct an hexagonal grid (vector) with hexagons of x
> units of length in each side. Is there any plugin for doing that?
>
> Thanks!
>
> EKS
>
# -*- coding: utf-8 -*-
#-----------------------------------------------------------
#
# Generate Vector Grid
#
# A QGIS plugin for generating a line or polygon grid
#
# Copyright (C) 2008 Carson Farmer
#
# EMAIL: carson.farmer (at) gmail.com
# WEB : www.geog.uvic.ca/spar/carson
#
#-----------------------------------------------------------
#
# licensed under the terms of GNU GPL 2
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
#---------------------------------------------------------------------
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import ftools_utils
from qgis.core import *
from ui_frmVectorGrid import Ui_Dialog
from math import sqrt #@
class Dialog(QDialog, Ui_Dialog):
def __init__(self, iface):
QDialog.__init__(self)
self.iface = iface
self.setupUi(self)
QObject.connect(self.toolOut, SIGNAL("clicked()"), self.outFile)
QObject.connect(self.spnX, SIGNAL("valueChanged(double)"), self.offset)
#QObject.connect(self.inShape, SIGNAL("currentIndexChanged(QString)"), self.updateInput)
QObject.connect(self.btnUpdate, SIGNAL("clicked()"), self.updateLayer)
QObject.connect(self.btnCanvas, SIGNAL("clicked()"), self.updateCanvas)
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
self.setWindowTitle(self.tr("Vector grid"))
self.xMin.setValidator(QDoubleValidator(self.xMin))
self.xMax.setValidator(QDoubleValidator(self.xMax))
self.yMin.setValidator(QDoubleValidator(self.yMin))
self.yMax.setValidator(QDoubleValidator(self.yMax))
layermap = QgsMapLayerRegistry.instance().mapLayers()
for name, layer in layermap.iteritems():
self.inShape.addItem( unicode( layer.name() ) )
def offset(self, value):
if self.chkLock.isChecked():
self.spnY.setValue(value)
def updateLayer( self ):
mLayerName = self.inShape.currentText()
if not mLayerName == "":
mLayer = ftools_utils.getMapLayerByName( unicode( mLayerName ) )
boundBox = mLayer.extent()
self.updateExtents( boundBox )
def updateCanvas( self ):
canvas = self.iface.mapCanvas()
boundBox = canvas.extent()
self.updateExtents( boundBox )
def updateExtents( self, boundBox ):
self.xMin.setText( unicode( boundBox.xMinimum() ) )
self.yMin.setText( unicode( boundBox.yMinimum() ) )
self.xMax.setText( unicode( boundBox.xMaximum() ) )
self.yMax.setText( unicode( boundBox.yMaximum() ) )
def accept(self):
self.buttonOk.setEnabled( False )
if self.xMin.text() == "" or self.xMax.text() == "" or self.yMin.text() == "" or self.yMax.text() == "":
QMessageBox.information(self, self.tr("Vector grid"), self.tr("Please specify valid extent coordinates"))
elif self.outShape.text() == "":
QMessageBox.information(self, self.tr("Vector grid"), self.tr("Please specify output shapefile"))
else:
try:
boundBox = QgsRectangle(
float( self.xMin.text() ),
float( self.yMin.text() ),
float( self.xMax.text() ),
float( self.yMax.text() ) )
except:
QMessageBox.information(self, self.tr("Vector grid"), self.tr("Invalid extent coordinates entered"))
xSpace = self.spnX.value()
ySpace = self.spnY.value()
if self.rdoPolygons.isChecked(): polygon = True
else: polygon = False
self.outShape.clear()
self.compute( boundBox, xSpace, ySpace, polygon )
addToTOC = QMessageBox.question(self, self.tr("Generate Vector Grid"), self.tr("Created output shapefile:\n%1\n\nWould you like to add the new layer to the TOC?").arg(unicode(self.shapefileName)), QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton)
if addToTOC == QMessageBox.Yes:
ftools_utils.addShapeToCanvas( self.shapefileName )
self.progressBar.setValue( 0 )
self.buttonOk.setEnabled( True )
def compute( self, bound, xOffset, yOffset, polygon ):
crs = self.iface.mapCanvas().mapRenderer().destinationSrs()
if not crs.isValid(): crs = None
if polygon:
fields = {0:QgsField("ID", QVariant.Int), 1:QgsField("XMIN", QVariant.Double), 2:QgsField("XMAX", QVariant.Double),
3:QgsField("YMIN", QVariant.Double), 4:QgsField("YMAX", QVariant.Double)}
check = QFile(self.shapefileName)
if check.exists():
if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName):
return
writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fields, QGis.WKBPolygon, crs)
#writer = QgsVectorFileWriter(outPath, "CP1250", fields, QGis.WKBPolygon, None)
else:
fields = {0:QgsField("ID", QVariant.Int), 1:QgsField("COORD", QVariant.Double)}
check = QFile(self.shapefileName)
if check.exists():
if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName):
return
writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fields, QGis.WKBLineString, crs)
#writer = QgsVectorFileWriter(unicode(outPath), "CP1250", fields, QGis.WKBLineString, None)
outFeat = QgsFeature()
outGeom = QgsGeometry()
idVar = 0
self.progressBar.setRange( 0, 0 )
if not polygon:
y = bound.yMaximum()
while y >= bound.yMinimum():
pt1 = QgsPoint(bound.xMinimum(), y)
pt2 = QgsPoint(bound.xMaximum(), y)
line = [pt1, pt2]
outFeat.setGeometry(outGeom.fromPolyline(line))
outFeat.addAttribute(0, QVariant(idVar))
outFeat.addAttribute(1, QVariant(y))
writer.addFeature(outFeat)
y = y - yOffset
idVar = idVar + 1
x = bound.xMinimum()
while x <= bound.xMaximum():
pt1 = QgsPoint(x, bound.yMaximum())
pt2 = QgsPoint(x, bound.yMinimum())
line = [pt1, pt2]
outFeat.setGeometry(outGeom.fromPolyline(line))
outFeat.addAttribute(0, QVariant(idVar))
outFeat.addAttribute(1, QVariant(x))
writer.addFeature(outFeat)
x = x + xOffset
idVar = idVar + 1
else:
# <<< HEXAGON OPTION >>>
#hexagon by area
area=40000
edge=sqrt ( 2.0 / 3 * sqrt(3) * area )
height=sqrt (area / 2.0 * sqrt (3))
#hexagon by edge
#edge=500
#height=sqrt (3) / 2 * edge
#area=edge * height * 3
#hexagon by height
#height=1000
#edge=height * 2 / sqrt (3)
#area=edge * height * 3
contg = 1
x = bound.xMinimum() + 0.5 * edge #@
#y = bound.yMaximum()
while x <= bound.xMaximum() + 1.5 * edge:
y = bound.yMaximum() - height #@
if contg % 2 == 0: #@
y = y + height
while y >= bound.yMinimum() - 2 * height:
pt1 = QgsPoint(x - edge/2, y + height)
pt2 = QgsPoint(x + edge/2, y + height)
pt3 = QgsPoint(x + edge, y)
pt4 = QgsPoint(x + edge/2, y - height)
pt5 = QgsPoint(x - edge/2, y - height)
pt6 = QgsPoint(x - edge, y)
pt7 = QgsPoint(x - edge/2, y + height)
polygon = [[pt1, pt2, pt3, pt4, pt5, pt6, pt7]]
outFeat.setGeometry(outGeom.fromPolygon(polygon))
outFeat.addAttribute(0, QVariant(idVar))
outFeat.addAttribute(1, QVariant(x)) #???
outFeat.addAttribute(2, QVariant(x)) #???
outFeat.addAttribute(3, QVariant(y)) #???
outFeat.addAttribute(4, QVariant(y)) #???
writer.addFeature(outFeat)
idVar = idVar + 1
y = y - 2 * height
x = x + 1.5 * edge
contg = contg + 1
#x = bound.xMinimum()
#while x <= bound.xMaximum():
#pt1 = QgsPoint(x, y)
#pt2 = QgsPoint(x + xOffset, y)
#pt3 = QgsPoint(x + xOffset, y - yOffset)
#pt4 = QgsPoint(x, y - yOffset)
#pt5 = QgsPoint(x, y)
#polygon = [[pt1, pt2, pt3, pt4, pt5]]
#outFeat.setGeometry(outGeom.fromPolygon(polygon))
#outFeat.addAttribute(0, QVariant(idVar))
#outFeat.addAttribute(1, QVariant(x))
#outFeat.addAttribute(2, QVariant(x + xOffset))
#outFeat.addAttribute(3, QVariant(y - yOffset))
#outFeat.addAttribute(4, QVariant(y))
#writer.addFeature(outFeat)
#idVar = idVar + 1
#x = x + xOffset
#y = y - yOffset
self.progressBar.setRange( 0, 100 )
del writer
def outFile(self):
self.outShape.clear()
( self.shapefileName, self.encoding ) = ftools_utils.saveDialog( self )
if self.shapefileName is None or self.encoding is None:
return
self.outShape.setText( QString( self.shapefileName ) )
_______________________________________________
Qgis-user mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/qgis-user