mirror of
https://github.com/qgis/QGIS.git
synced 2025-06-20 00:03:07 -04:00
refactor Grid algorithm
This commit is contained in:
parent
3b60bd67a2
commit
98226c5cb0
@ -78,6 +78,7 @@ from mmqgisx.DeleteDuplicateGeometries import DeleteDuplicateGeometries
|
||||
from mmqgisx.TextToFloat import TextToFloat
|
||||
from mmqgisx.ExtractByAttribute import ExtractByAttribute
|
||||
from mmqgisx.SelectByAttribute import SelectByAttribute
|
||||
from mmqgisx.Grid import Grid
|
||||
|
||||
from ConcaveHull import ConcaveHull
|
||||
from Polygonize import Polygonize
|
||||
@ -144,7 +145,7 @@ class QGISAlgorithmProvider(AlgorithmProvider):
|
||||
# ------ mmqgisx ------
|
||||
DeleteColumn(), DeleteDuplicateGeometries(),
|
||||
TextToFloat(), ExtractByAttribute(),
|
||||
SelectByAttribute(),
|
||||
SelectByAttribute(), Grid(),
|
||||
#mmqgisx_delete_duplicate_geometries_algorithm(),
|
||||
#mmqgisx_geometry_convert_algorithm(),
|
||||
#mmqgisx_grid_algorithm(),
|
||||
|
238
python/plugins/processing/algs/qgis/mmqgisx/Grid.py
Normal file
238
python/plugins/processing/algs/qgis/mmqgisx/Grid.py
Normal file
@ -0,0 +1,238 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
***************************************************************************
|
||||
DeleteColumn.py
|
||||
---------------------
|
||||
Date : May 2010
|
||||
Copyright : (C) 2010 by Michael Minn
|
||||
Email : pyqgis at michaelminn dot com
|
||||
***************************************************************************
|
||||
* *
|
||||
* 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. *
|
||||
* *
|
||||
***************************************************************************
|
||||
"""
|
||||
|
||||
__author__ = 'Michael Minn'
|
||||
__date__ = 'May 2010'
|
||||
__copyright__ = '(C) 2010, Michael Minn'
|
||||
|
||||
# This will get replaced with a git SHA1 when you do a git archive
|
||||
|
||||
__revision__ = '$Format:%H$'
|
||||
|
||||
from PyQt4.QtCore import *
|
||||
from qgis.core import *
|
||||
from processing.core.GeoAlgorithm import GeoAlgorithm
|
||||
from processing.core.GeoAlgorithmExecutionException import \
|
||||
GeoAlgorithmExecutionException
|
||||
from processing.core.parameters import ParameterNumber
|
||||
from processing.core.parameters import ParameterCrs
|
||||
from processing.core.parameters import ParameterSelection
|
||||
from processing.core.outputs import OutputVector
|
||||
|
||||
|
||||
class Grid(GeoAlgorithm):
|
||||
TYPE = 'TYPE'
|
||||
WIDTH = 'WIDTH'
|
||||
HEIGHT = 'HEIGHT'
|
||||
HSPACING = 'HSPACING'
|
||||
VSPACING = 'VSPACING'
|
||||
CENTERX = 'CENTERX'
|
||||
CENTERY = 'CENTERY'
|
||||
CRS = 'CRS'
|
||||
OUTPUT = 'OUTPUT'
|
||||
|
||||
TYPES = ['Rectangle (line)',
|
||||
'Rectangle (polygon)',
|
||||
'Diamond (polygon)',
|
||||
'Hexagon (polygon)'
|
||||
]
|
||||
|
||||
def defineCharacteristics(self):
|
||||
self.name = 'Create grid'
|
||||
self.group = 'Vector creation tools'
|
||||
|
||||
self.addParameter(ParameterSelection(
|
||||
self.TYPE, 'Grid type', self.TYPES))
|
||||
self.addParameter(ParameterNumber(
|
||||
self.WIDTH, 'Width', default=360.0))
|
||||
self.addParameter(ParameterNumber(
|
||||
self.HEIGHT, 'Height', default=180.0))
|
||||
self.addParameter(ParameterNumber(
|
||||
self.HSPACING, 'Horizontal spacing', default=10.0))
|
||||
self.addParameter(ParameterNumber(
|
||||
self.VSPACING, 'Vertical spacing', default=10.0))
|
||||
self.addParameter(ParameterNumber(
|
||||
self.CENTERX, 'Center X', default=0.0))
|
||||
self.addParameter(ParameterNumber(
|
||||
self.CENTERY, 'Center Y', default=0.0))
|
||||
self.addParameter(ParameterCrs(self.CRS, 'Output CRS'))
|
||||
|
||||
self.addOutput(OutputVector(self.OUTPUT, 'Output'))
|
||||
|
||||
def processAlgorithm(self, progress):
|
||||
idx = self.getParameterValue(self.TYPE)
|
||||
width = self.getParameterValue(self.WIDTH)
|
||||
height = self.getParameterValue(self.HEIGHT)
|
||||
hSpacing = self.getParameterValue(self.HSPACING)
|
||||
vSpacing = self.getParameterValue(self.VSPACING)
|
||||
centerX = self.getParameterValue(self.CENTERX)
|
||||
centerY = self.getParameterValue(self.CENTERY)
|
||||
originX = centerX - width / 2.0
|
||||
originY = centerY - height / 2.0
|
||||
crs = QgsCoordinateReferenceSystem(self.getParameterValue(self.CRS))
|
||||
|
||||
if hSpacing <= 0 or vSpacing <= 0:
|
||||
raise GeoAlgorithmExecutionException(
|
||||
'Invalid grid spacing: %s/%s' % (hSpacing, vSpacing))
|
||||
|
||||
if width < hSpacing:
|
||||
raise GeoAlgorithmExecutionException(
|
||||
'Horizontal spacing is too small for the covered area')
|
||||
|
||||
if height < vSpacing:
|
||||
raise GeoAlgorithmExecutionException(
|
||||
'Vertical spacing is too small for the covered area')
|
||||
|
||||
if self.TYPES[idx].find('polygon') >= 0:
|
||||
geometryType = QGis.WKBPolygon
|
||||
else:
|
||||
geometryType = QGis.WKBLineString
|
||||
|
||||
fields = [QgsField('lon', QVariant.Double, '', 24, 16),
|
||||
QgsField('lat', QVariant.Double, '', 24, 16)
|
||||
]
|
||||
|
||||
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields,
|
||||
geometryType, crs)
|
||||
|
||||
if idx == 0:
|
||||
self._rectangleGridLine(
|
||||
writer, width, height, originX, originY, hSpacing, vSpacing)
|
||||
elif idx == 1:
|
||||
self._rectangleGridPoly(
|
||||
writer, width, height, originX, originY, hSpacing, vSpacing)
|
||||
elif idx == 2:
|
||||
self._diamondGrid(
|
||||
writer, width, height, originX, originY, hSpacing, vSpacing)
|
||||
elif idx == 3:
|
||||
self._hexagonGrid(
|
||||
writer, width, height, originX, originY, hSpacing, vSpacing)
|
||||
|
||||
del writer
|
||||
|
||||
def _rectangleGridLine(self, writer, width, height, originX, originY, hSpacing, vSpacing):
|
||||
ft = QgsFeature()
|
||||
|
||||
x = originX
|
||||
while x <= originX + width:
|
||||
polyline = []
|
||||
|
||||
y = originY
|
||||
while y <= originY + height:
|
||||
polyline.append(QgsPoint(x, y))
|
||||
y += vSpacing
|
||||
|
||||
ft.setGeometry(QgsGeometry.fromPolyline(polyline))
|
||||
ft.setAttributes([x, 0])
|
||||
writer.addFeature(ft)
|
||||
|
||||
x += hSpacing
|
||||
|
||||
y = originY
|
||||
while y <= originY + height:
|
||||
polyline = []
|
||||
|
||||
x = originX
|
||||
while x <= originX + width:
|
||||
polyline.append(QgsPoint(x, y))
|
||||
x += hSpacing
|
||||
|
||||
ft.setGeometry(QgsGeometry.fromPolyline(polyline))
|
||||
ft.setAttributes([0, y])
|
||||
writer.addFeature(ft)
|
||||
|
||||
y += hSpacing
|
||||
|
||||
def _rectangleGridPoly(self, writer, width, height, originX, originY, hSpacing, vSpacing):
|
||||
ft = QgsFeature()
|
||||
|
||||
x = originX
|
||||
while x < originX + width:
|
||||
y = originY
|
||||
while y < originY + height:
|
||||
polyline = []
|
||||
polyline.append(QgsPoint(x, y))
|
||||
polyline.append(QgsPoint(x + hSpacing, y))
|
||||
polyline.append(QgsPoint(x + hSpacing, y + vSpacing))
|
||||
polyline.append(QgsPoint(x, y + vSpacing))
|
||||
|
||||
ft.setGeometry(QgsGeometry.fromPolygon([polyline]))
|
||||
ft.setAttributes([x + hSpacing / 2.0, y + vSpacing / 2.0])
|
||||
writer.addFeature(ft)
|
||||
y += vSpacing
|
||||
|
||||
x += hSpacing
|
||||
|
||||
def _diamondGrid(self, writer, width, height, originX, originY, hSpacing, vSpacing):
|
||||
ft = QgsFeature()
|
||||
|
||||
x = originX
|
||||
colNum = 0
|
||||
while x < originX + width:
|
||||
if colNum % 2 == 0:
|
||||
y = originY
|
||||
else:
|
||||
y = originY + vSpacing / 2.0
|
||||
|
||||
while y < originY + height:
|
||||
polyline = []
|
||||
polyline.append(QgsPoint(x + hSpacing / 2.0, y))
|
||||
polyline.append(QgsPoint(x + hSpacing, y + vSpacing / 2.0))
|
||||
polyline.append(QgsPoint(x + hSpacing / 2.0, y + vSpacing))
|
||||
polyline.append(QgsPoint(x, y + vSpacing / 2.0))
|
||||
|
||||
ft.setGeometry(QgsGeometry.fromPolygon([polyline]))
|
||||
ft.setAttributes([x + hSpacing / 2.0, y + vSpacing / 2.0])
|
||||
writer.addFeature(ft)
|
||||
y += vSpacing
|
||||
|
||||
x += hSpacing / 2.0
|
||||
colNum += 1
|
||||
|
||||
def _hexagonGrid(self, writer, width, height, originX, originY, hSpacing, vSpacing):
|
||||
ft = QgsFeature()
|
||||
|
||||
xVertexLo = 0.288675134594813 * vSpacing
|
||||
xVertexHi = 0.577350269189626 * vSpacing
|
||||
hSpacing = xVertexLo + xVertexHi
|
||||
x = originX + xVertexHi
|
||||
|
||||
colNum = 0
|
||||
while x < originX + width:
|
||||
if colNum % 2 == 0:
|
||||
y = originY + vSpacing / 2.0
|
||||
else:
|
||||
y = originY + vSpacing
|
||||
|
||||
while y < originY + height:
|
||||
polyline = []
|
||||
polyline.append(QgsPoint(x + xVertexHi, y))
|
||||
polyline.append(QgsPoint(x + xVertexLo, y + vSpacing / 2.0))
|
||||
polyline.append(QgsPoint(x - xVertexLo, y + vSpacing / 2.0))
|
||||
polyline.append(QgsPoint(x - xVertexHi, y))
|
||||
polyline.append(QgsPoint(x - xVertexLo, y - vSpacing / 2.0))
|
||||
polyline.append(QgsPoint(x + xVertexLo, y - vSpacing / 2.0))
|
||||
|
||||
ft.setGeometry(QgsGeometry.fromPolygon([polyline]))
|
||||
ft.setAttributes([x, y])
|
||||
writer.addFeature(ft)
|
||||
y += vSpacing
|
||||
|
||||
x += hSpacing
|
||||
colNum += 1
|
Loading…
x
Reference in New Issue
Block a user