Skip to content

Commit 98226c5

Browse files
committedOct 3, 2014
refactor Grid algorithm
1 parent 3b60bd6 commit 98226c5

File tree

2 files changed

+240
-1
lines changed

2 files changed

+240
-1
lines changed
 

‎python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
from mmqgisx.TextToFloat import TextToFloat
7979
from mmqgisx.ExtractByAttribute import ExtractByAttribute
8080
from mmqgisx.SelectByAttribute import SelectByAttribute
81+
from mmqgisx.Grid import Grid
8182

8283
from ConcaveHull import ConcaveHull
8384
from Polygonize import Polygonize
@@ -144,7 +145,7 @@ def __init__(self):
144145
# ------ mmqgisx ------
145146
DeleteColumn(), DeleteDuplicateGeometries(),
146147
TextToFloat(), ExtractByAttribute(),
147-
SelectByAttribute(),
148+
SelectByAttribute(), Grid(),
148149
#mmqgisx_delete_duplicate_geometries_algorithm(),
149150
#mmqgisx_geometry_convert_algorithm(),
150151
#mmqgisx_grid_algorithm(),
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
DeleteColumn.py
6+
---------------------
7+
Date : May 2010
8+
Copyright : (C) 2010 by Michael Minn
9+
Email : pyqgis at michaelminn dot com
10+
***************************************************************************
11+
* *
12+
* This program is free software; you can redistribute it and/or modify *
13+
* it under the terms of the GNU General Public License as published by *
14+
* the Free Software Foundation; either version 2 of the License, or *
15+
* (at your option) any later version. *
16+
* *
17+
***************************************************************************
18+
"""
19+
20+
__author__ = 'Michael Minn'
21+
__date__ = 'May 2010'
22+
__copyright__ = '(C) 2010, Michael Minn'
23+
24+
# This will get replaced with a git SHA1 when you do a git archive
25+
26+
__revision__ = '$Format:%H$'
27+
28+
from PyQt4.QtCore import *
29+
from qgis.core import *
30+
from processing.core.GeoAlgorithm import GeoAlgorithm
31+
from processing.core.GeoAlgorithmExecutionException import \
32+
GeoAlgorithmExecutionException
33+
from processing.core.parameters import ParameterNumber
34+
from processing.core.parameters import ParameterCrs
35+
from processing.core.parameters import ParameterSelection
36+
from processing.core.outputs import OutputVector
37+
38+
39+
class Grid(GeoAlgorithm):
40+
TYPE = 'TYPE'
41+
WIDTH = 'WIDTH'
42+
HEIGHT = 'HEIGHT'
43+
HSPACING = 'HSPACING'
44+
VSPACING = 'VSPACING'
45+
CENTERX = 'CENTERX'
46+
CENTERY = 'CENTERY'
47+
CRS = 'CRS'
48+
OUTPUT = 'OUTPUT'
49+
50+
TYPES = ['Rectangle (line)',
51+
'Rectangle (polygon)',
52+
'Diamond (polygon)',
53+
'Hexagon (polygon)'
54+
]
55+
56+
def defineCharacteristics(self):
57+
self.name = 'Create grid'
58+
self.group = 'Vector creation tools'
59+
60+
self.addParameter(ParameterSelection(
61+
self.TYPE, 'Grid type', self.TYPES))
62+
self.addParameter(ParameterNumber(
63+
self.WIDTH, 'Width', default=360.0))
64+
self.addParameter(ParameterNumber(
65+
self.HEIGHT, 'Height', default=180.0))
66+
self.addParameter(ParameterNumber(
67+
self.HSPACING, 'Horizontal spacing', default=10.0))
68+
self.addParameter(ParameterNumber(
69+
self.VSPACING, 'Vertical spacing', default=10.0))
70+
self.addParameter(ParameterNumber(
71+
self.CENTERX, 'Center X', default=0.0))
72+
self.addParameter(ParameterNumber(
73+
self.CENTERY, 'Center Y', default=0.0))
74+
self.addParameter(ParameterCrs(self.CRS, 'Output CRS'))
75+
76+
self.addOutput(OutputVector(self.OUTPUT, 'Output'))
77+
78+
def processAlgorithm(self, progress):
79+
idx = self.getParameterValue(self.TYPE)
80+
width = self.getParameterValue(self.WIDTH)
81+
height = self.getParameterValue(self.HEIGHT)
82+
hSpacing = self.getParameterValue(self.HSPACING)
83+
vSpacing = self.getParameterValue(self.VSPACING)
84+
centerX = self.getParameterValue(self.CENTERX)
85+
centerY = self.getParameterValue(self.CENTERY)
86+
originX = centerX - width / 2.0
87+
originY = centerY - height / 2.0
88+
crs = QgsCoordinateReferenceSystem(self.getParameterValue(self.CRS))
89+
90+
if hSpacing <= 0 or vSpacing <= 0:
91+
raise GeoAlgorithmExecutionException(
92+
'Invalid grid spacing: %s/%s' % (hSpacing, vSpacing))
93+
94+
if width < hSpacing:
95+
raise GeoAlgorithmExecutionException(
96+
'Horizontal spacing is too small for the covered area')
97+
98+
if height < vSpacing:
99+
raise GeoAlgorithmExecutionException(
100+
'Vertical spacing is too small for the covered area')
101+
102+
if self.TYPES[idx].find('polygon') >= 0:
103+
geometryType = QGis.WKBPolygon
104+
else:
105+
geometryType = QGis.WKBLineString
106+
107+
fields = [QgsField('lon', QVariant.Double, '', 24, 16),
108+
QgsField('lat', QVariant.Double, '', 24, 16)
109+
]
110+
111+
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields,
112+
geometryType, crs)
113+
114+
if idx == 0:
115+
self._rectangleGridLine(
116+
writer, width, height, originX, originY, hSpacing, vSpacing)
117+
elif idx == 1:
118+
self._rectangleGridPoly(
119+
writer, width, height, originX, originY, hSpacing, vSpacing)
120+
elif idx == 2:
121+
self._diamondGrid(
122+
writer, width, height, originX, originY, hSpacing, vSpacing)
123+
elif idx == 3:
124+
self._hexagonGrid(
125+
writer, width, height, originX, originY, hSpacing, vSpacing)
126+
127+
del writer
128+
129+
def _rectangleGridLine(self, writer, width, height, originX, originY, hSpacing, vSpacing):
130+
ft = QgsFeature()
131+
132+
x = originX
133+
while x <= originX + width:
134+
polyline = []
135+
136+
y = originY
137+
while y <= originY + height:
138+
polyline.append(QgsPoint(x, y))
139+
y += vSpacing
140+
141+
ft.setGeometry(QgsGeometry.fromPolyline(polyline))
142+
ft.setAttributes([x, 0])
143+
writer.addFeature(ft)
144+
145+
x += hSpacing
146+
147+
y = originY
148+
while y <= originY + height:
149+
polyline = []
150+
151+
x = originX
152+
while x <= originX + width:
153+
polyline.append(QgsPoint(x, y))
154+
x += hSpacing
155+
156+
ft.setGeometry(QgsGeometry.fromPolyline(polyline))
157+
ft.setAttributes([0, y])
158+
writer.addFeature(ft)
159+
160+
y += hSpacing
161+
162+
def _rectangleGridPoly(self, writer, width, height, originX, originY, hSpacing, vSpacing):
163+
ft = QgsFeature()
164+
165+
x = originX
166+
while x < originX + width:
167+
y = originY
168+
while y < originY + height:
169+
polyline = []
170+
polyline.append(QgsPoint(x, y))
171+
polyline.append(QgsPoint(x + hSpacing, y))
172+
polyline.append(QgsPoint(x + hSpacing, y + vSpacing))
173+
polyline.append(QgsPoint(x, y + vSpacing))
174+
175+
ft.setGeometry(QgsGeometry.fromPolygon([polyline]))
176+
ft.setAttributes([x + hSpacing / 2.0, y + vSpacing / 2.0])
177+
writer.addFeature(ft)
178+
y += vSpacing
179+
180+
x += hSpacing
181+
182+
def _diamondGrid(self, writer, width, height, originX, originY, hSpacing, vSpacing):
183+
ft = QgsFeature()
184+
185+
x = originX
186+
colNum = 0
187+
while x < originX + width:
188+
if colNum % 2 == 0:
189+
y = originY
190+
else:
191+
y = originY + vSpacing / 2.0
192+
193+
while y < originY + height:
194+
polyline = []
195+
polyline.append(QgsPoint(x + hSpacing / 2.0, y))
196+
polyline.append(QgsPoint(x + hSpacing, y + vSpacing / 2.0))
197+
polyline.append(QgsPoint(x + hSpacing / 2.0, y + vSpacing))
198+
polyline.append(QgsPoint(x, y + vSpacing / 2.0))
199+
200+
ft.setGeometry(QgsGeometry.fromPolygon([polyline]))
201+
ft.setAttributes([x + hSpacing / 2.0, y + vSpacing / 2.0])
202+
writer.addFeature(ft)
203+
y += vSpacing
204+
205+
x += hSpacing / 2.0
206+
colNum += 1
207+
208+
def _hexagonGrid(self, writer, width, height, originX, originY, hSpacing, vSpacing):
209+
ft = QgsFeature()
210+
211+
xVertexLo = 0.288675134594813 * vSpacing
212+
xVertexHi = 0.577350269189626 * vSpacing
213+
hSpacing = xVertexLo + xVertexHi
214+
x = originX + xVertexHi
215+
216+
colNum = 0
217+
while x < originX + width:
218+
if colNum % 2 == 0:
219+
y = originY + vSpacing / 2.0
220+
else:
221+
y = originY + vSpacing
222+
223+
while y < originY + height:
224+
polyline = []
225+
polyline.append(QgsPoint(x + xVertexHi, y))
226+
polyline.append(QgsPoint(x + xVertexLo, y + vSpacing / 2.0))
227+
polyline.append(QgsPoint(x - xVertexLo, y + vSpacing / 2.0))
228+
polyline.append(QgsPoint(x - xVertexHi, y))
229+
polyline.append(QgsPoint(x - xVertexLo, y - vSpacing / 2.0))
230+
polyline.append(QgsPoint(x + xVertexLo, y - vSpacing / 2.0))
231+
232+
ft.setGeometry(QgsGeometry.fromPolygon([polyline]))
233+
ft.setAttributes([x, y])
234+
writer.addFeature(ft)
235+
y += vSpacing
236+
237+
x += hSpacing
238+
colNum += 1

0 commit comments

Comments
 (0)
Please sign in to comment.