Skip to content

Commit 7f71a7d

Browse files
committedMar 28, 2012
ftools vector grid: Align extents and resolution to selected raster layer
1 parent aa2d0b8 commit 7f71a7d

File tree

2 files changed

+95
-12
lines changed

2 files changed

+95
-12
lines changed
 

‎python/plugins/fTools/tools/doVectorGrid.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import ftools_utils
3434
from qgis.core import *
3535
from ui_frmVectorGrid import Ui_Dialog
36+
import math
3637

3738
class Dialog(QDialog, Ui_Dialog):
3839
def __init__(self, iface):
@@ -44,6 +45,7 @@ def __init__(self, iface):
4445
#QObject.connect(self.inShape, SIGNAL("currentIndexChanged(QString)"), self.updateInput)
4546
QObject.connect(self.btnUpdate, SIGNAL("clicked()"), self.updateLayer)
4647
QObject.connect(self.btnCanvas, SIGNAL("clicked()"), self.updateCanvas)
48+
QObject.connect(self.chkAlign, SIGNAL("toggled(bool)"), self.chkAlignToggled)
4749
self.buttonOk = self.buttonBox_2.button( QDialogButtonBox.Ok )
4850
self.setWindowTitle(self.tr("Vector grid"))
4951
self.xMin.setValidator(QDoubleValidator(self.xMin))
@@ -66,12 +68,50 @@ def updateLayer( self ):
6668
mLayerName = self.inShape.currentText()
6769
if not mLayerName == "":
6870
mLayer = ftools_utils.getMapLayerByName( unicode( mLayerName ) )
71+
# get layer extents
6972
boundBox = mLayer.extent()
73+
# if "align extents and resolution..." button is checked
74+
if self.chkAlign.isChecked():
75+
if not mLayer.type() == QgsMapLayer.RasterLayer:
76+
QMessageBox.information(self, self.tr("Vector grid"), self.tr("Please select a raster layer"))
77+
else:
78+
dx = math.fabs(boundBox.xMaximum()-boundBox.xMinimum()) / mLayer.width()
79+
dy = math.fabs(boundBox.yMaximum()-boundBox.yMinimum()) / mLayer.height()
80+
self.spnX.setValue(dx)
81+
self.spnY.setValue(dy)
7082
self.updateExtents( boundBox )
7183

7284
def updateCanvas( self ):
7385
canvas = self.iface.mapCanvas()
7486
boundBox = canvas.extent()
87+
# if "align extents and resolution..." button is checked
88+
if self.chkAlign.isChecked():
89+
mLayerName = self.inShape.currentText()
90+
if not mLayerName == "":
91+
mLayer = ftools_utils.getMapLayerByName( unicode( mLayerName ) )
92+
if not mLayer.type() == QgsMapLayer.RasterLayer:
93+
QMessageBox.information(self, self.tr("Vector grid"), self.tr("Please select a raster layer"))
94+
else:
95+
# get extents and pixel size
96+
xMin = boundBox.xMinimum()
97+
yMin = boundBox.yMinimum()
98+
xMax = boundBox.xMaximum()
99+
yMax = boundBox.yMaximum()
100+
boundBox2 = mLayer.extent()
101+
dx = math.fabs(boundBox2.xMaximum()-boundBox2.xMinimum()) / mLayer.width()
102+
dy = math.fabs(boundBox2.yMaximum()-boundBox2.yMinimum()) / mLayer.height()
103+
# get pixels from the raster that are closest to the desired extent
104+
newXMin = self.getClosestPixel( boundBox2.xMinimum(), boundBox.xMinimum(), dx, True )
105+
newXMax = self.getClosestPixel( boundBox2.xMaximum(), boundBox.xMaximum(), dx, False )
106+
newYMin = self.getClosestPixel( boundBox2.yMinimum(), boundBox.yMinimum(), dy, True )
107+
newYMax = self.getClosestPixel( boundBox2.yMaximum(), boundBox.yMaximum(), dy, False )
108+
# apply new values if found all min/max
109+
if newXMin is not None and newXMax is not None and newYMin is not None and newYMax is not None:
110+
boundBox.set( newXMin, newYMin, newXMax, newYMax )
111+
self.spnX.setValue(dx)
112+
self.spnY.setValue(dy)
113+
else:
114+
QMessageBox.information(self, self.tr("Vector grid"), self.tr("Unable to compute extents aligned on selected raster layer"))
75115
self.updateExtents( boundBox )
76116

77117
def updateExtents( self, boundBox ):
@@ -185,3 +225,39 @@ def outFile(self):
185225
if self.shapefileName is None or self.encoding is None:
186226
return
187227
self.outShape.setText( QString( self.shapefileName ) )
228+
229+
def chkAlignToggled(self):
230+
if self.chkAlign.isChecked():
231+
self.spnX.setEnabled( False )
232+
self.lblX.setEnabled( False )
233+
self.spnY.setEnabled( False )
234+
self.lblY.setEnabled( False )
235+
else:
236+
self.spnX.setEnabled( True )
237+
self.lblX.setEnabled( True )
238+
self.spnY.setEnabled( not self.chkLock.isChecked() )
239+
self.lblY.setEnabled( not self.chkLock.isChecked() )
240+
241+
def getClosestPixel(self, startVal, targetVal, step, isMin ):
242+
foundVal = None
243+
tmpVal = startVal
244+
# find pixels covering the extent - slighlyt inneficient b/c loop on all elements before xMin
245+
if targetVal < startVal:
246+
backOneStep = not isMin
247+
step = - step
248+
while foundVal is None:
249+
if tmpVal <= targetVal:
250+
if backOneStep:
251+
tmpVal -= step
252+
foundVal = tmpVal
253+
tmpVal += step
254+
else:
255+
backOneStep = isMin
256+
while foundVal is None:
257+
if tmpVal >= targetVal:
258+
if backOneStep:
259+
tmpVal -= step
260+
foundVal = tmpVal
261+
tmpVal += step
262+
return foundVal
263+

‎python/plugins/fTools/tools/frmVectorGrid.ui

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
<rect>
1010
<x>0</x>
1111
<y>0</y>
12-
<width>438</width>
13-
<height>459</height>
12+
<width>489</width>
13+
<height>475</height>
1414
</rect>
1515
</property>
1616
<property name="windowTitle">
@@ -29,7 +29,7 @@
2929
<item row="0" column="0" colspan="2">
3030
<widget class="QComboBox" name="inShape"/>
3131
</item>
32-
<item row="1" column="0">
32+
<item row="2" column="0">
3333
<widget class="QToolButton" name="btnUpdate">
3434
<property name="minimumSize">
3535
<size>
@@ -42,7 +42,7 @@
4242
</property>
4343
</widget>
4444
</item>
45-
<item row="1" column="1">
45+
<item row="2" column="1">
4646
<widget class="QToolButton" name="btnCanvas">
4747
<property name="minimumSize">
4848
<size>
@@ -55,7 +55,7 @@
5555
</property>
5656
</widget>
5757
</item>
58-
<item row="2" column="0">
58+
<item row="3" column="0">
5959
<layout class="QHBoxLayout">
6060
<item>
6161
<widget class="QLabel" name="label">
@@ -82,7 +82,7 @@
8282
</item>
8383
</layout>
8484
</item>
85-
<item row="2" column="1">
85+
<item row="3" column="1">
8686
<layout class="QHBoxLayout">
8787
<item>
8888
<widget class="QLabel" name="label_4">
@@ -109,7 +109,7 @@
109109
</item>
110110
</layout>
111111
</item>
112-
<item row="3" column="0">
112+
<item row="4" column="0">
113113
<layout class="QHBoxLayout">
114114
<item>
115115
<widget class="QLabel" name="label_3">
@@ -136,7 +136,7 @@
136136
</item>
137137
</layout>
138138
</item>
139-
<item row="3" column="1">
139+
<item row="4" column="1">
140140
<layout class="QHBoxLayout">
141141
<item>
142142
<widget class="QLabel" name="label_5">
@@ -163,6 +163,13 @@
163163
</item>
164164
</layout>
165165
</item>
166+
<item row="1" column="0" colspan="2">
167+
<widget class="QCheckBox" name="chkAlign">
168+
<property name="text">
169+
<string>Align extents and resolution to selected raster layer</string>
170+
</property>
171+
</widget>
172+
</item>
166173
</layout>
167174
</widget>
168175
</item>
@@ -186,7 +193,7 @@
186193
</spacer>
187194
</item>
188195
<item row="0" column="1">
189-
<widget class="QLabel" name="label_7">
196+
<widget class="QLabel" name="lblX">
190197
<property name="text">
191198
<string>X</string>
192199
</property>
@@ -245,7 +252,7 @@
245252
</spacer>
246253
</item>
247254
<item row="1" column="1">
248-
<widget class="QLabel" name="label_8">
255+
<widget class="QLabel" name="lblY">
249256
<property name="enabled">
250257
<bool>false</bool>
251258
</property>
@@ -385,7 +392,7 @@
385392
</connection>
386393
<connection>
387394
<sender>chkLock</sender>
388-
<signal>clicked(bool)</signal>
395+
<signal>toggled(bool)</signal>
389396
<receiver>spnY</receiver>
390397
<slot>setDisabled(bool)</slot>
391398
<hints>
@@ -402,7 +409,7 @@
402409
<connection>
403410
<sender>chkLock</sender>
404411
<signal>toggled(bool)</signal>
405-
<receiver>label_8</receiver>
412+
<receiver>lblY</receiver>
406413
<slot>setDisabled(bool)</slot>
407414
<hints>
408415
<hint type="sourcelabel">

0 commit comments

Comments
 (0)
Please sign in to comment.