Skip to content

Commit cf6e35d

Browse files
committedNov 13, 2011
Merge branch 'master' of github.com:qgis/Quantum-GIS
2 parents 27e770a + d52c510 commit cf6e35d

File tree

6 files changed

+412
-7
lines changed

6 files changed

+412
-7
lines changed
 

‎python/plugins/GdalTools/GdalTools.py

+11
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,12 @@ def initGui( self ):
180180
QObject.connect( self.nearBlack, SIGNAL( "triggered()" ), self.doNearBlack )
181181
self.analysisMenu.addAction( self.nearBlack )
182182

183+
if self.GdalVersion >= "1.7":
184+
self.fillNodata = QAction( QIcon(":/icons/fillnodata.png"), QCoreApplication.translate( "GdalTools", "Fill nodata" ), self.iface.mainWindow() )
185+
self.fillNodata.setStatusTip( QCoreApplication.translate( "GdalTools", "Fill raster regions by interpolation from edges") )
186+
QObject.connect( self.fillNodata, SIGNAL( "triggered()" ), self.doFillNodata )
187+
self.analysisMenu.addAction( self.fillNodata )
188+
183189
if self.GdalVersion >= "1.6":
184190
self.proximity = QAction( QIcon(":/icons/proximity.png"), QCoreApplication.translate( "GdalTools", "Proximity (Raster distance)" ), self.iface.mainWindow() )
185191
self.proximity.setStatusTip( QCoreApplication.translate( "GdalTools", "Produces a raster proximity map") )
@@ -295,6 +301,11 @@ def doNearBlack( self ):
295301
d = NearBlack( self.iface )
296302
self.runToolDialog( d )
297303

304+
def doFillNodata( self ):
305+
from tools.doFillNodata import GdalToolsDialog as FillNodata
306+
d = FillNodata( self.iface )
307+
self.runToolDialog( d )
308+
298309
def doWarp( self ):
299310
from tools.doWarp import GdalToolsDialog as Warp
300311
d = Warp( self.iface )
1.55 KB
Loading

‎python/plugins/GdalTools/resources.qrc

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
<file>icons/about.png</file>
2222
<file>icons/dem.png</file>
2323
<file>icons/projection-export.png</file>
24+
<file>icons/fillnodata.png</file>
2425
<file>icons/edit.png</file>
2526
<file>icons/reset.png</file>
2627
</qresource>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
# -*- coding: utf-8 -*-
2+
from PyQt4.QtCore import *
3+
from PyQt4.QtGui import *
4+
from qgis.core import *
5+
from qgis.gui import *
6+
7+
from ui_widgetFillNodata import Ui_GdalToolsWidget as Ui_Widget
8+
from widgetBatchBase import GdalToolsBaseBatchWidget as BaseBatchWidget
9+
import GdalTools_utils as Utils
10+
11+
import os.path
12+
13+
class GdalToolsDialog( QWidget, Ui_Widget, BaseBatchWidget ):
14+
def __init__( self, iface ):
15+
QWidget.__init__( self )
16+
self.iface = iface
17+
18+
self.setupUi( self )
19+
BaseBatchWidget.__init__( self, self.iface, "gdal_fillnodata.py" )
20+
21+
self.inSelector.setType( self.inSelector.FILE_LAYER )
22+
self.outSelector.setType( self.outSelector.FILE )
23+
self.maskSelector.setType( self.maskSelector.FILE )
24+
25+
self.progressBar.setValue(0)
26+
self.progressBar.hide()
27+
self.formatLabel.hide()
28+
self.formatCombo.hide()
29+
30+
self.outputFormat = Utils.fillRasterOutputFormat()
31+
32+
self.setParamsStatus(
33+
[
34+
( self.inSelector, SIGNAL( "filenameChanged()" ) ),
35+
( self.outSelector, SIGNAL( "filenameChanged()" ) ),
36+
( self.maskSelector, SIGNAL( "filenameChanged()" ), self.maskCheck ),
37+
( self.distanceSpin, SIGNAL( "valueChanged( int )" ), self.distanceCheck ),
38+
( self.smoothSpin, SIGNAL( "valueChanged( int )" ), self.smoothCheck ),
39+
( self.bandSpin, SIGNAL( "valueChanged( int )" ), self.bandCheck ),
40+
( self.nomaskCheck, SIGNAL( "stateChanged( int )" ) )
41+
]
42+
)
43+
44+
self.connect( self.inSelector, SIGNAL( "selectClicked()" ), self.fillInputFile )
45+
self.connect( self.outSelector, SIGNAL( "selectClicked()" ), self.fillOutputFile)
46+
self.connect( self.maskSelector, SIGNAL( "selectClicked()" ), self.fillMaskFile)
47+
self.connect( self.batchCheck, SIGNAL( "stateChanged( int )" ), self.switchToolMode )
48+
49+
# add raster filters to combo
50+
self.formatCombo.addItems( Utils.FileFilter.allRastersFilter().split( ";;" ) )
51+
52+
53+
def switchToolMode( self ):
54+
self.setCommandViewerEnabled( not self.batchCheck.isChecked() )
55+
self.progressBar.setVisible( self.batchCheck.isChecked() )
56+
self.formatLabel.setVisible( self.batchCheck.isChecked() )
57+
self.formatCombo.setVisible( self.batchCheck.isChecked() )
58+
59+
self.inSelector.setType( self.inSelector.FILE if self.batchCheck.isChecked() else self.inSelector.FILE_LAYER )
60+
self.outSelector.clear()
61+
62+
if self.batchCheck.isChecked():
63+
self.inFileLabel = self.label.text()
64+
self.outFileLabel = self.label_1.text()
65+
self.label.setText( QCoreApplication.translate( "GdalTools", "&Input directory" ) )
66+
self.label_1.setText( QCoreApplication.translate( "GdalTools", "&Output directory" ) )
67+
68+
QObject.disconnect( self.inSelector, SIGNAL( "selectClicked()" ), self.fillInputFile )
69+
QObject.disconnect( self.outSelector, SIGNAL( "selectClicked()" ), self.fillOutputFile )
70+
71+
QObject.connect( self.inSelector, SIGNAL( "selectClicked()" ), self. fillInputDir )
72+
QObject.connect( self.outSelector, SIGNAL( "selectClicked()" ), self.fillOutputDir )
73+
else:
74+
self.label.setText( self.inFileLabel )
75+
self.label_1.setText( self.outFileLabel )
76+
77+
QObject.disconnect( self.inSelector, SIGNAL( "selectClicked()" ), self.fillInputDir )
78+
QObject.disconnect( self.outSelector, SIGNAL( "selectClicked()" ), self.fillOutputDir )
79+
80+
QObject.connect( self.inSelector, SIGNAL( "selectClicked()" ), self.fillInputFile )
81+
QObject.connect( self.outSelector, SIGNAL( "selectClicked()" ), self.fillOutputFile )
82+
83+
def fillInputFile( self ):
84+
lastUsedFilter = Utils.FileFilter.lastUsedRasterFilter()
85+
inputFile = Utils.FileDialog.getOpenFileName( self,
86+
self.tr( "Select the files to analyse" ),
87+
Utils.FileFilter.allRastersFilter(),
88+
lastUsedFilter )
89+
if inputFile.isEmpty():
90+
return
91+
Utils.FileFilter.setLastUsedRasterFilter( lastUsedFilter )
92+
self.inSelector.setFilename( inputFile )
93+
94+
def fillOutputFile( self ):
95+
lastUsedFilter = Utils.FileFilter.lastUsedRasterFilter()
96+
outputFile = Utils.FileDialog.getSaveFileName( self, self.tr( "Select the raster file to save the results to" ), Utils.FileFilter.allRastersFilter(), lastUsedFilter )
97+
if outputFile.isEmpty():
98+
return
99+
Utils.FileFilter.setLastUsedRasterFilter( lastUsedFilter )
100+
101+
self.outputFormat = Utils.fillRasterOutputFormat( lastUsedFilter, outputFile )
102+
self.outSelector.setFilename( outputFile )
103+
104+
def fillMaskFile( self ):
105+
lastUsedFilter = Utils.FileFilter.lastUsedRasterFilter()
106+
inputFile = Utils.FileDialog.getOpenFileName( self,
107+
self.tr( "Select the files to analyse" ),
108+
Utils.FileFilter.allRastersFilter(),
109+
lastUsedFilter )
110+
if inputFile.isEmpty():
111+
return
112+
Utils.FileFilter.setLastUsedRasterFilter( lastUsedFilter )
113+
self.maskSelector.setFilename( inputFile )
114+
115+
def fillInputDir( self ):
116+
inputDir = Utils.FileDialog.getExistingDirectory( self, self.tr( "Select the input directory with files" ))
117+
if inputDir.isEmpty():
118+
return
119+
self.inSelector.setFilename( inputDir )
120+
121+
def fillOutputDir( self ):
122+
outputDir = Utils.FileDialog.getExistingDirectory( self, self.tr( "Select the output directory to save the results to" ) )
123+
if outputDir.isEmpty():
124+
return
125+
self.outSelector.setFilename( outputDir )
126+
127+
def getArguments(self):
128+
arguments = QStringList()
129+
maskFile = self.maskSelector.filename()
130+
if self.distanceCheck.isChecked() and self.distanceSpin.value() != 0:
131+
arguments << "-md"
132+
arguments << self.distanceSpin.text()
133+
if self.smoothCheck.isChecked() and self.smoothSpin.value() != 0:
134+
arguments << "-si"
135+
arguments << str( self.smoothSpin.value() )
136+
if self.bandCheck.isChecked() and self.bandSpin.value() != 0:
137+
arguments << "-b"
138+
arguments << str( self.bandSpin.value() )
139+
if self.maskCheck.isChecked() and not maskFile.isEmpty():
140+
arguments << "-mask"
141+
arguments << maskFile
142+
if self.nomaskCheck.isChecked():
143+
arguments << "-nomask"
144+
if self.isBatchEnabled():
145+
if self.formatCombo.currentIndex() != 0:
146+
arguments << "-of"
147+
arguments << Utils.fillRasterOutputFormat( self.formatCombo.currentText() )
148+
return arguments
149+
else:
150+
outputFn = self.getOutputFileName()
151+
if not outputFn.isEmpty():
152+
arguments << "-of"
153+
arguments << self.outputFormat
154+
arguments << self.getInputFileName()
155+
arguments << outputFn
156+
return arguments
157+
158+
def onLayersChanged( self ):
159+
self.inSelector.setLayers( Utils.LayerRegistry.instance().getRasterLayers() )
160+
161+
def getInputFileName(self):
162+
return self.inSelector.filename()
163+
164+
def getOutputFileName(self):
165+
return self.outSelector.filename()
166+
167+
def addLayerIntoCanvas(self, fileInfo):
168+
self.iface.addRasterLayer(fileInfo.filePath())
169+
170+
def isBatchEnabled(self):
171+
return self.batchCheck.isChecked()
172+
173+
def setProgressRange(self, maximum):
174+
self.progressBar.setRange(0, maximum)
175+
176+
def updateProgress(self, index, total):
177+
if index < total:
178+
self.progressBar.setValue( index + 1 )
179+
else:
180+
self.progressBar.setValue( 0 )
181+
182+
def batchRun(self):
183+
exts = self.formatCombo.currentText().remove( QRegExp('^.*\(') ).remove( QRegExp('\).*$') ).split( " " )
184+
if not exts.isEmpty() and exts != "*" and exts != "*.*":
185+
outExt = exts[ 0 ].remove( "*" )
186+
else:
187+
outExt = ".tif"
188+
189+
self.base.enableRun( False )
190+
self.base.setCursor( Qt.WaitCursor )
191+
192+
inDir = self.getInputFileName()
193+
outDir = self.getOutputFileName()
194+
195+
extensions = Utils.getRasterExtensions()
196+
workDir = QDir( inDir )
197+
workDir.setFilter( QDir.Files | QDir.NoSymLinks | QDir.NoDotAndDotDot )
198+
workDir.setNameFilters( extensions )
199+
files = workDir.entryList()
200+
201+
self.inFiles = []
202+
self.outFiles = []
203+
204+
for f in files:
205+
self.inFiles.append( inDir + "/" + f )
206+
if outDir != None:
207+
outFile = f.replace( QRegExp( "\.[a-zA-Z0-9]{2,4}" ), outExt )
208+
self.outFiles.append( outDir + "/" + outFile )
209+
210+
self.errors = QStringList()
211+
self.batchIndex = 0
212+
self.batchTotal = len( self.inFiles )
213+
self.setProgressRange( self.batchTotal )
214+
215+
self.runItem( self.batchIndex, self.batchTotal )
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>GdalToolsWidget</class>
4+
<widget class="QWidget" name="GdalToolsWidget">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>368</width>
10+
<height>300</height>
11+
</rect>
12+
</property>
13+
<property name="sizePolicy">
14+
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
15+
<horstretch>0</horstretch>
16+
<verstretch>0</verstretch>
17+
</sizepolicy>
18+
</property>
19+
<property name="windowTitle">
20+
<string>Fill Nodata</string>
21+
</property>
22+
<layout class="QGridLayout" name="gridLayout">
23+
<item row="0" column="0" colspan="2">
24+
<widget class="QCheckBox" name="batchCheck">
25+
<property name="text">
26+
<string>Batch mode (for processing whole directory)</string>
27+
</property>
28+
</widget>
29+
</item>
30+
<item row="1" column="0">
31+
<widget class="QLabel" name="label">
32+
<property name="text">
33+
<string>&amp;Input Layer</string>
34+
</property>
35+
<property name="buddy">
36+
<cstring>inSelector</cstring>
37+
</property>
38+
</widget>
39+
</item>
40+
<item row="1" column="1">
41+
<widget class="GdalToolsInOutSelector" name="inSelector" native="true"/>
42+
</item>
43+
<item row="2" column="0">
44+
<widget class="QLabel" name="label_1">
45+
<property name="text">
46+
<string>&amp;Output file</string>
47+
</property>
48+
<property name="buddy">
49+
<cstring>outSelector</cstring>
50+
</property>
51+
</widget>
52+
</item>
53+
<item row="2" column="1">
54+
<widget class="GdalToolsInOutSelector" name="outSelector" native="true"/>
55+
</item>
56+
<item row="3" column="0">
57+
<widget class="QLabel" name="formatLabel">
58+
<property name="frameShape">
59+
<enum>QFrame::NoFrame</enum>
60+
</property>
61+
<property name="text">
62+
<string>Output format</string>
63+
</property>
64+
</widget>
65+
</item>
66+
<item row="3" column="1">
67+
<widget class="QComboBox" name="formatCombo">
68+
<property name="sizePolicy">
69+
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
70+
<horstretch>0</horstretch>
71+
<verstretch>0</verstretch>
72+
</sizepolicy>
73+
</property>
74+
</widget>
75+
</item>
76+
<item row="4" column="0">
77+
<widget class="QCheckBox" name="distanceCheck">
78+
<property name="text">
79+
<string>Search distance</string>
80+
</property>
81+
</widget>
82+
</item>
83+
<item row="4" column="1">
84+
<widget class="QSpinBox" name="distanceSpin">
85+
<property name="minimum">
86+
<number>1</number>
87+
</property>
88+
<property name="maximum">
89+
<number>1000000</number>
90+
</property>
91+
<property name="value">
92+
<number>100</number>
93+
</property>
94+
</widget>
95+
</item>
96+
<item row="5" column="0">
97+
<widget class="QCheckBox" name="smoothCheck">
98+
<property name="text">
99+
<string>Smooth iterations</string>
100+
</property>
101+
</widget>
102+
</item>
103+
<item row="5" column="1">
104+
<widget class="QSpinBox" name="smoothSpin">
105+
<property name="minimum">
106+
<number>0</number>
107+
</property>
108+
<property name="value">
109+
<number>0</number>
110+
</property>
111+
</widget>
112+
</item>
113+
<item row="6" column="0">
114+
<widget class="QCheckBox" name="bandCheck">
115+
<property name="text">
116+
<string>Band to operate on</string>
117+
</property>
118+
</widget>
119+
</item>
120+
<item row="6" column="1">
121+
<widget class="QSpinBox" name="bandSpin">
122+
<property name="minimum">
123+
<number>1</number>
124+
</property>
125+
</widget>
126+
</item>
127+
<item row="7" column="0">
128+
<widget class="QCheckBox" name="maskCheck">
129+
<property name="text">
130+
<string>Validity mask</string>
131+
</property>
132+
</widget>
133+
</item>
134+
<item row="7" column="1">
135+
<widget class="GdalToolsInOutSelector" name="maskSelector" native="true"/>
136+
</item>
137+
<item row="8" column="0" colspan="2">
138+
<widget class="QCheckBox" name="nomaskCheck">
139+
<property name="text">
140+
<string>Do not use the default validity mask</string>
141+
</property>
142+
</widget>
143+
</item>
144+
<item row="9" column="0" colspan="2">
145+
<widget class="QProgressBar" name="progressBar"/>
146+
</item>
147+
</layout>
148+
</widget>
149+
<customwidgets>
150+
<customwidget>
151+
<class>GdalToolsInOutSelector</class>
152+
<extends>QWidget</extends>
153+
<header>inOutSelector</header>
154+
<container>1</container>
155+
</customwidget>
156+
</customwidgets>
157+
<resources/>
158+
<connections/>
159+
</ui>

‎src/mapserver/qgsprojectparser.cpp

+26-7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qgsprojectparser.h"
1919
#include "qgsconfigcache.h"
2020
#include "qgscrscache.h"
21+
#include "qgsdatasourceuri.h"
2122
#include "qgsmslayercache.h"
2223
#include "qgslogger.h"
2324
#include "qgsmapserviceexception.h"
@@ -773,18 +774,36 @@ QgsMapLayer* QgsProjectParser::createLayerFromElement( const QDomElement& elem,
773774
return 0;
774775
}
775776

776-
QString uri;
777-
QString absoluteUri;
778777
QDomElement dataSourceElem = elem.firstChildElement( "datasource" );
778+
QString uri = dataSourceElem.text();
779+
QString absoluteUri;
779780
if ( !dataSourceElem.isNull() )
780781
{
781782
//convert relative pathes to absolute ones if necessary
782-
uri = dataSourceElem.text();
783-
absoluteUri = convertToAbsolutePath( uri );
784-
if ( uri != absoluteUri )
783+
if ( uri.startsWith( "dbname" ) ) //database
784+
{
785+
QgsDataSourceURI dsUri( uri );
786+
if ( dsUri.host().isEmpty() ) //only convert path for file based databases
787+
{
788+
QString dbnameUri = dsUri.database();
789+
QString dbNameUriAbsolute = convertToAbsolutePath( dbnameUri );
790+
if ( dbnameUri != dbNameUriAbsolute )
791+
{
792+
dsUri.setDatabase( dbNameUriAbsolute );
793+
absoluteUri = dsUri.uri();
794+
QDomText absoluteTextNode = mXMLDoc->createTextNode( absoluteUri );
795+
dataSourceElem.replaceChild( absoluteTextNode, dataSourceElem.firstChild() );
796+
}
797+
}
798+
}
799+
else //file based data source
785800
{
786-
QDomText absoluteTextNode = mXMLDoc->createTextNode( absoluteUri );
787-
dataSourceElem.replaceChild( absoluteTextNode, dataSourceElem.firstChild() );
801+
absoluteUri = convertToAbsolutePath( uri );
802+
if ( uri != absoluteUri )
803+
{
804+
QDomText absoluteTextNode = mXMLDoc->createTextNode( absoluteUri );
805+
dataSourceElem.replaceChild( absoluteTextNode, dataSourceElem.firstChild() );
806+
}
788807
}
789808
}
790809

0 commit comments

Comments
 (0)
Please sign in to comment.