Skip to content

Commit d867ebf

Browse files
author
mhugent
committed
WFS provider: Don't forget to set port to QHttp, better handling for coordinate and tuple separators
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@6948 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 309cd27 commit d867ebf

File tree

2 files changed

+54
-13
lines changed

2 files changed

+54
-13
lines changed

src/providers/wfs/qgswfsdata.cpp

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ int QgsWFSData::getWFSData()
5252

5353
//separate host from query string
5454
QUrl requestUrl(mUri);
55-
mHttp.setHost(requestUrl.host());
55+
mHttp.setHost(requestUrl.host(), requestUrl.port());
5656
mHttp.get(mUri);
5757

5858
//just for a test
@@ -105,6 +105,8 @@ void QgsWFSData::startElement(const XML_Char* el, const XML_Char** attr)
105105
{
106106
mParseModeStack.push(QgsWFSData::coordinate);
107107
mStringCash.clear();
108+
mCoordinateSeparator = readCsFromAttribute(attr);
109+
mTupleSeparator = readTsFromAttribute(attr);
108110
}
109111
else if(localName == mGeometryAttribute)
110112
{
@@ -222,7 +224,7 @@ void QgsWFSData::endElement(const XML_Char* el)
222224
else if(elementName == GML_NAMESPACE + NS_SEPARATOR + "Point")
223225
{
224226
std::list<QgsPoint> pointList;
225-
if(pointsFromCoordinateString(pointList, mStringCash) != 0)
227+
if(pointsFromCoordinateString(pointList, mStringCash, mCoordinateSeparator, mTupleSeparator) != 0)
226228
{
227229
//error
228230
}
@@ -259,7 +261,7 @@ void QgsWFSData::endElement(const XML_Char* el)
259261
//add WKB point to the feature
260262

261263
std::list<QgsPoint> pointList;
262-
if(pointsFromCoordinateString(pointList, mStringCash) != 0)
264+
if(pointsFromCoordinateString(pointList, mStringCash, mCoordinateSeparator, mTupleSeparator) != 0)
263265
{
264266
//error
265267
}
@@ -292,7 +294,7 @@ void QgsWFSData::endElement(const XML_Char* el)
292294
else if(elementName == GML_NAMESPACE + NS_SEPARATOR + "LinearRing")
293295
{
294296
std::list<QgsPoint> pointList;
295-
if(pointsFromCoordinateString(pointList, mStringCash) != 0)
297+
if(pointsFromCoordinateString(pointList, mStringCash, mCoordinateSeparator, mTupleSeparator) != 0)
296298
{
297299
//error
298300
}
@@ -377,6 +379,34 @@ int QgsWFSData::readEpsgFromAttribute(int& epsgNr, const XML_Char** attr) const
377379
return 2;
378380
}
379381

382+
QString QgsWFSData::readCsFromAttribute(const XML_Char** attr) const
383+
{
384+
int i = 0;
385+
while(attr[i] != NULL)
386+
{
387+
if(strcmp(attr[i], "cs") == 0)
388+
{
389+
return QString(attr[i+1]);
390+
}
391+
++i;
392+
}
393+
return ",";
394+
}
395+
396+
QString QgsWFSData::readTsFromAttribute(const XML_Char** attr) const
397+
{
398+
int i = 0;
399+
while(attr[i] != NULL)
400+
{
401+
if(strcmp(attr[i], "ts") == 0)
402+
{
403+
return QString(attr[i+1]);
404+
}
405+
++i;
406+
}
407+
return " ";
408+
}
409+
380410
int QgsWFSData::createBBoxFromCoordinateString(QgsRect* bb, const QString& coordString) const
381411
{
382412
if(!bb)
@@ -387,7 +417,7 @@ int QgsWFSData::createBBoxFromCoordinateString(QgsRect* bb, const QString& coord
387417
std::list<QgsPoint> points;
388418
//qWarning("string is: ");
389419
//qWarning(coordString.toLocal8Bit().data());
390-
if(pointsFromCoordinateString(points, coordString) != 0)
420+
if(pointsFromCoordinateString(points, coordString, mCoordinateSeparator, mTupleSeparator) != 0)
391421
{
392422
return 2;
393423
}
@@ -403,18 +433,18 @@ int QgsWFSData::createBBoxFromCoordinateString(QgsRect* bb, const QString& coord
403433
return 0;
404434
}
405435

406-
int QgsWFSData::pointsFromCoordinateString(std::list<QgsPoint>& points, const QString& coordString) const
436+
int QgsWFSData::pointsFromCoordinateString(std::list<QgsPoint>& points, const QString& coordString, const QString& cs, const QString& ts) const
407437
{
408438
//tuples are separated by space, x/y by ','
409-
QStringList tuples = coordString.split(" ", QString::SkipEmptyParts);
439+
QStringList tuples = coordString.split(ts, QString::SkipEmptyParts);
410440
QStringList tuples_coordinates;
411441
double x, y;
412442
bool conversionSuccess;
413443

414444
QStringList::const_iterator tupleIterator;
415445
for(tupleIterator = tuples.constBegin(); tupleIterator != tuples.constEnd(); ++tupleIterator)
416446
{
417-
tuples_coordinates = tupleIterator->split(",", QString::SkipEmptyParts);
447+
tuples_coordinates = tupleIterator->split(cs, QString::SkipEmptyParts);
418448
if(tuples_coordinates.size() < 2)
419449
{
420450
continue;
@@ -429,9 +459,6 @@ int QgsWFSData::pointsFromCoordinateString(std::list<QgsPoint>& points, const QS
429459
{
430460
continue;
431461
}
432-
//qWarning("adding point");
433-
//qWarning(QString::number(x).toLocal8Bit().data());
434-
//qWarning(QString::number(y).toLocal8Bit().data());
435462
points.push_back(QgsPoint(x, y));
436463
}
437464
return 0;

src/providers/wfs/qgswfsdata.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,22 @@ class QgsWFSData: public QObject
7676
@param attr attribute strings
7777
@return 0 in case of success*/
7878
int readEpsgFromAttribute(int& epsgNr, const XML_Char** attr) const;
79+
/**Reads the 'cs' (coordinate separator) attribute.
80+
@return the cs attribute value or the default value ","*/
81+
QString readCsFromAttribute(const XML_Char** attr) const;
82+
/**Reads the 'ts' (tuple separator) attribute.
83+
@return the ts attribute value or the devault value " "*/
84+
QString readTsFromAttribute(const XML_Char** attr) const;
7985
/**Creates a rectangle from a coordinate string.
8086
@return 0 in case of success*/
8187
int createBBoxFromCoordinateString(QgsRect* bb, const QString& coordString) const;
8288
/**Creates a set of points from a coordinate string.
83-
@return 0 in case of success*/
84-
int pointsFromCoordinateString(std::list<QgsPoint>& points, const QString& coordString) const;
89+
@param points list that will contain the created points
90+
@param coordString the text containing the coordinates
91+
@param cs coortinate separator
92+
@param ts tuple separator
93+
@return 0 in case of success*/
94+
int pointsFromCoordinateString(std::list<QgsPoint>& points, const QString& coordString, const QString& cs, const QString& ts) const;
8595
int getPointWKB(unsigned char** wkb, int* size, const QgsPoint&) const;
8696
int getLineWKB(unsigned char** wkb, int* size, const std::list<QgsPoint>& lineCoordinates) const;
8797
int getRingWKB(unsigned char** wkb, int* size, const std::list<QgsPoint>& ringCoordinates) const;
@@ -128,6 +138,10 @@ class QgsWFSData: public QObject
128138
int mAttributeIndex;
129139
QString mTypeName;
130140
QgsApplication::endian_t mEndian;
141+
/**Coordinate separator for coordinate strings. Usually "," */
142+
QString mCoordinateSeparator;
143+
/**Tuple separator for coordinate strings. Usually " " */
144+
QString mTupleSeparator;
131145
};
132146

133147
#endif

0 commit comments

Comments
 (0)