Skip to content

Commit cefc8d6

Browse files
authoredOct 25, 2018
Merge branch 'release-2_18' into marker_fill
2 parents 8d12733 + 5f26d1b commit cefc8d6

File tree

4 files changed

+64
-19
lines changed

4 files changed

+64
-19
lines changed
 

‎python/plugins/processing/algs/gdal/ogr2ogr.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
'ODS',
6363
'XLSX',
6464
'PDF',
65+
'GPKG'
6566
]
6667

6768
EXTS = [
@@ -87,6 +88,7 @@
8788
'.ods',
8889
'.xlsx',
8990
'.pdf',
91+
'.gpkg'
9092
]
9193

9294

@@ -127,7 +129,7 @@ def getConsoleCommands(self):
127129
output = ogrConnectionString(outFile)
128130
options = unicode(self.getParameterValue(self.OPTIONS))
129131

130-
if outFormat == 'SQLite' and os.path.isfile(output):
132+
if outFormat in ('SQLite', 'GPKG') and os.path.isfile(output):
131133
os.remove(output)
132134

133135
arguments = []

‎python/plugins/processing/tests/GdalAlgorithmsTest.py‎

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,18 @@
2727

2828
import AlgorithmsTestBase
2929
from processing.algs.gdal.ogr2ogrtopostgis import Ogr2OgrToPostGis
30+
from processing.algs.gdal.ogr2ogr import Ogr2Ogr
3031

3132
import nose2
3233
import shutil
33-
34+
import os
3435
from qgis.testing import (
3536
start_app,
3637
unittest
3738
)
3839

40+
testDataPath = os.path.join(os.path.dirname(__file__), 'testdata')
41+
3942

4043
class TestGdalAlgorithms(unittest.TestCase, AlgorithmsTestBase.AlgorithmsTest):
4144

@@ -54,6 +57,29 @@ def tearDownClass(cls):
5457
def test_definition_file(self):
5558
return 'gdal_algorithm_tests.yaml'
5659

60+
def testOgr2Ogr(self):
61+
source = os.path.join(testDataPath, 'polys.gml')
62+
63+
alg = Ogr2Ogr()
64+
alg.setParameterValue('INPUT_LAYER', source)
65+
alg.setParameterValue('FORMAT', 0)
66+
alg.setOutputValue('OUTPUT_LAYER', 'd:/temp/check.shp')
67+
self.assertEqual(
68+
alg.getConsoleCommands(),
69+
['ogr2ogr',
70+
'-f "ESRI Shapefile" "d:/temp/check.shp" ' +
71+
source + ' polys2'])
72+
73+
alg = Ogr2Ogr()
74+
alg.setParameterValue('INPUT_LAYER', source)
75+
alg.setParameterValue('FORMAT', 22)
76+
alg.setOutputValue('OUTPUT_LAYER', 'd:/temp/check.gpkg')
77+
self.assertEqual(
78+
alg.getConsoleCommands(),
79+
['ogr2ogr',
80+
'-f GPKG "d:/temp/check.gpkg" ' +
81+
source + ' polys2'])
82+
5783

5884
class TestGdalOgr2OgrToPostgis(unittest.TestCase):
5985

‎src/server/qgswfsserver.cpp‎

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "qgsogcutils.h"
4040
#include "qgsaccesscontrol.h"
4141
#include "qgsjsonutils.h"
42+
#include "qgswkbtypes.h"
4243

4344
#include <QImage>
4445
#include <QPainter>
@@ -582,6 +583,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
582583
}
583584
layerCrs = layer->crs();
584585

586+
bool isMultiGeom = QgsWKBTypes::isMultiType( QGis::fromOldWkbType( layer->wkbType() ) );
587+
585588
QgsFeatureRequest fReq;
586589
#ifdef HAVE_SERVER_PYTHON_PLUGINS
587590
fReq.setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) );
@@ -629,7 +632,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
629632
if ( featureCounter == 0 )
630633
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );
631634

632-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
635+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
633636

634637
fid = "";
635638
++featCounter;
@@ -722,7 +725,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
722725

723726
if ( featureCounter >= startIndex )
724727
{
725-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
728+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
726729
++featCounter;
727730
}
728731
++featureCounter;
@@ -740,7 +743,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
740743

741744
if ( featureCounter >= startIndex )
742745
{
743-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
746+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
744747
++featCounter;
745748
}
746749
++featureCounter;
@@ -1007,6 +1010,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10071010
searchRect.yMaximum() + 1. / pow( 10., layerPrec ) );
10081011
layerCrs = layer->crs();
10091012

1013+
bool isMultiGeom = QgsWKBTypes::isMultiType( QGis::fromOldWkbType( layer->wkbType() ) );
1014+
10101015
if ( featureIdOk )
10111016
{
10121017
Q_FOREACH ( const QString &fidStr, featureIdList )
@@ -1023,7 +1028,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10231028
if ( featureCounter == 0 )
10241029
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );
10251030

1026-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1031+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
10271032
++featCounter;
10281033
++featureCounter;
10291034
}
@@ -1072,7 +1077,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10721077

10731078
if ( featureCounter >= startIndex )
10741079
{
1075-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1080+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
10761081
++featCounter;
10771082
}
10781083
++featureCounter;
@@ -1109,7 +1114,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
11091114
if ( featureCounter == 0 )
11101115
startGetFeature( request, format, layerPrec, layerCrs, &searchRect );
11111116

1112-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1117+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
11131118

11141119
fid = "";
11151120
++featCounter;
@@ -1148,7 +1153,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
11481153

11491154
if ( featureCounter >= startIndex )
11501155
{
1151-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1156+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
11521157
++featCounter;
11531158
}
11541159
++featureCounter;
@@ -1197,7 +1202,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
11971202

11981203
if ( featureCounter >= startIndex )
11991204
{
1200-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1205+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
12011206
++featCounter;
12021207
}
12031208
++featureCounter;
@@ -1236,7 +1241,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
12361241

12371242
if ( featureCounter >= startIndex )
12381243
{
1239-
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes() );
1244+
setGetFeature( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, provider->pkAttributeIndexes(), isMultiGeom );
12401245
++featCounter;
12411246
}
12421247
++featureCounter;
@@ -1413,7 +1418,7 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
14131418
}
14141419

14151420
void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
1416-
const QgsAttributeList& pkAttributes ) /*const*/
1421+
const QgsAttributeList& pkAttributes, bool isMultiGeom ) /*const*/
14171422
{
14181423
if ( !feat->isValid() )
14191424
return;
@@ -1443,12 +1448,12 @@ void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& for
14431448
QDomElement featureElement;
14441449
if ( format == "GML3" )
14451450
{
1446-
featureElement = createFeatureGML3( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes );
1451+
featureElement = createFeatureGML3( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes, isMultiGeom );
14471452
gmlDoc.appendChild( featureElement );
14481453
}
14491454
else
14501455
{
1451-
featureElement = createFeatureGML2( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes );
1456+
featureElement = createFeatureGML2( feat, gmlDoc, prec, crs, attrIndexes, pkAttributes, isMultiGeom );
14521457
gmlDoc.appendChild( featureElement );
14531458
}
14541459

@@ -2054,7 +2059,7 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoord
20542059
}
20552060

20562061
QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
2057-
const QgsAttributeList& pkAttributes ) /*const*/
2062+
const QgsAttributeList& pkAttributes, bool isMultiGeom ) /*const*/
20582063
{
20592064
//gml:FeatureMember
20602065
QDomElement featureElement = doc.createElement( "gml:featureMember"/*wfs:FeatureMember*/ );
@@ -2066,6 +2071,12 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
20662071
featureElement.appendChild( typeNameElement );
20672072

20682073
const QgsGeometry* geom = feat->constGeometry();
2074+
if ( isMultiGeom && QgsWKBTypes::isSingleType( QGis::fromOldWkbType( geom->wkbType() ) ) )
2075+
{
2076+
QgsGeometry cloneGeom( *geom );
2077+
cloneGeom.convertToMultiType();
2078+
geom = &cloneGeom;
2079+
}
20692080
if ( geom && mWithGeom && mGeometryName != "NONE" )
20702081
{
20712082
QDomElement geomElem = doc.createElement( "qgs:geometry" );
@@ -2138,7 +2149,7 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
21382149
}
21392150

21402151
QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
2141-
const QgsAttributeList& pkAttributes ) /*const*/
2152+
const QgsAttributeList& pkAttributes, bool isMultiGeom ) /*const*/
21422153
{
21432154
//gml:FeatureMember
21442155
QDomElement featureElement = doc.createElement( "gml:featureMember"/*wfs:FeatureMember*/ );
@@ -2150,6 +2161,12 @@ QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc
21502161
featureElement.appendChild( typeNameElement );
21512162

21522163
const QgsGeometry* geom = feat->constGeometry();
2164+
if ( isMultiGeom && QgsWKBTypes::isSingleType( QGis::fromOldWkbType( geom->wkbType() ) ) )
2165+
{
2166+
QgsGeometry cloneGeom( *geom );
2167+
cloneGeom.convertToMultiType();
2168+
geom = &cloneGeom;
2169+
}
21532170
if ( geom && mWithGeom && mGeometryName != "NONE" )
21542171
{
21552172
QDomElement geomElem = doc.createElement( "qgs:geometry" );

‎src/server/qgswfsserver.h‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class QgsWFSServer: public QgsOWSServer
118118

119119
void startGetFeature( QgsRequestHandler& request, const QString& format, int prec, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect );
120120
void setGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
121-
const QgsAttributeList& pkAttributes = QgsAttributeList() );
121+
const QgsAttributeList& pkAttributes = QgsAttributeList(), bool isMultiGeom = false );
122122
void endGetFeature( QgsRequestHandler& request, const QString& format );
123123

124124
//method for transaction
@@ -130,11 +130,11 @@ class QgsWFSServer: public QgsOWSServer
130130

131131
//methods to write GML2
132132
QDomElement createFeatureGML2( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
133-
const QgsAttributeList& pkAttributes = QgsAttributeList() ) /*const*/;
133+
const QgsAttributeList& pkAttributes = QgsAttributeList(), bool isMultiGeom = false ) /*const*/;
134134

135135
//methods to write GML3
136136
QDomElement createFeatureGML3( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes,
137-
const QgsAttributeList& pkAttributes = QgsAttributeList() ) /*const*/;
137+
const QgsAttributeList& pkAttributes = QgsAttributeList(), bool isMultiGeom = false ) /*const*/;
138138

139139
//methods to encode value to string for text node
140140
QString encodeValueToText( const QVariant& value );

0 commit comments

Comments
 (0)
Please sign in to comment.