Update tests for geometry classes

This commit is contained in:
Alessandro Pasotti 2019-05-02 13:52:46 +02:00
parent ba816459e1
commit bbd836f4d3
42 changed files with 105 additions and 341 deletions

View File

@ -246,9 +246,9 @@ Returns a GML3 representation of the geometry.
.. seealso:: :py:func:`asJson`
%End
virtual QString asJson( int precision = 17 ) const = 0;
QString asJson( int precision = 17 );
%Docstring
Returns a GeoJSON representation of the geometry.
Returns a GeoJSON representation of the geometry as a QString.
:param precision: number of decimal places for coordinates
@ -259,6 +259,8 @@ Returns a GeoJSON representation of the geometry.
.. seealso:: :py:func:`asGml2`
.. seealso:: :py:func:`asGml3`
.. seealso:: :py:func:`asJsonObject`
%End

View File

@ -79,8 +79,6 @@ to ``p2`` will be used (i.e. winding the other way around the circle).
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual bool isEmpty() const;
virtual int numPoints() const;

View File

@ -50,8 +50,6 @@ Compound curve geometry type
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual double length() const;

View File

@ -54,8 +54,6 @@ Curve polygon geometry type
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual double area() const;

View File

@ -152,8 +152,6 @@ An IndexError will be raised if no geometry with the specified index exists.
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual QgsRectangle boundingBox() const;

View File

@ -412,8 +412,6 @@ segment in the line.
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual double length() const;

View File

@ -35,8 +35,6 @@ Multi curve geometry collection.
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual bool addGeometry( QgsAbstractGeometry *g /Transfer/ );
virtual bool insertGeometry( QgsAbstractGeometry *g /Transfer/, int index );

View File

@ -34,8 +34,6 @@ Multi line string geometry collection.
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual bool addGeometry( QgsAbstractGeometry *g /Transfer/ );
virtual bool insertGeometry( QgsAbstractGeometry *g /Transfer/, int index );

View File

@ -36,8 +36,6 @@ Multi point geometry collection.
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual int nCoordinates() const;
virtual bool addGeometry( QgsAbstractGeometry *g /Transfer/ );

View File

@ -33,8 +33,6 @@ Multi polygon geometry collection.
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual bool addGeometry( QgsAbstractGeometry *g /Transfer/ );
virtual bool insertGeometry( QgsAbstractGeometry *g /Transfer/, int index );

View File

@ -35,8 +35,6 @@ Multi surface geometry collection.
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual bool addGeometry( QgsAbstractGeometry *g /Transfer/ );
virtual bool insertGeometry( QgsAbstractGeometry *g /Transfer/, int index );

View File

@ -355,8 +355,6 @@ M value is preserved.
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const;
virtual QString asJson( int precision = 17 ) const;
virtual void draw( QPainter &p ) const;
virtual void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform, bool transformZ = false ) throw( QgsCsException );

View File

@ -153,6 +153,11 @@ QString QgsAbstractGeometry::wktTypeStr() const
return wkt;
}
QString QgsAbstractGeometry::asJson( int precision )
{
return QString::fromStdString( asJsonObject( precision ).dump() );
}
QgsPoint QgsAbstractGeometry::centroid() const
{
// http://en.wikipedia.org/wiki/Centroid#Centroid_of_polygon

View File

@ -277,23 +277,25 @@ class CORE_EXPORT QgsAbstractGeometry
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
/**
* Returns a GeoJSON representation of the geometry.
* Returns a GeoJSON representation of the geometry as a QString.
* \param precision number of decimal places for coordinates
* \see asWkb()
* \see asWkt()
* \see asGml2()
* \see asGml3()
* \see asJsonObject()
*/
virtual QString asJson( int precision = 17 ) const = 0;
QString asJson( int precision = 17 );
/**
* Returns a json obejct representation of the geometry.
* Returns a json object representation of the geometry.
* \see asWkb()
* \see asWkt()
* \see asGml2()
* \see asGml3()
* \see asJson()
* \since QGIS 3.8
* \note not available in Python bindings
* \since QGIS 3.10
*/
virtual json asJsonObject( int precision = 17 ) const SIP_SKIP { Q_UNUSED( precision ); return nullptr; }

View File

@ -368,13 +368,6 @@ QDomElement QgsCircularString::asGml3( QDomDocument &doc, int precision, const Q
return elemCurve;
}
QString QgsCircularString::asJson( int precision ) const
{
// GeoJSON does not support curves
std::unique_ptr< QgsLineString > line( curveToLine() );
QString json = line->asJson( precision );
return json;
}
json QgsCircularString::asJsonObject( int precision ) const
{

View File

@ -79,7 +79,6 @@ class CORE_EXPORT QgsCircularString: public QgsCurve
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
bool isEmpty() const override;
int numPoints() const override;

View File

@ -292,14 +292,6 @@ QDomElement QgsCompoundCurve::asGml3( QDomDocument &doc, int precision, const QS
return compoundCurveElem;
}
QString QgsCompoundCurve::asJson( int precision ) const
{
// GeoJSON does not support curves
std::unique_ptr< QgsLineString > line( curveToLine() );
QString json = line->asJson( precision );
return json;
}
json QgsCompoundCurve::asJsonObject( int precision ) const
{
// GeoJSON does not support curves

View File

@ -50,7 +50,6 @@ class CORE_EXPORT QgsCompoundCurve: public QgsCurve
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
//curve interface

View File

@ -401,38 +401,9 @@ QDomElement QgsCurvePolygon::asGml3( QDomDocument &doc, int precision, const QSt
return elemCurvePolygon;
}
QString QgsCurvePolygon::asJson( int precision ) const
{
// GeoJSON does not support curves
QString json = QStringLiteral( "{\"type\": \"Polygon\", \"coordinates\": [" );
if ( exteriorRing() )
{
std::unique_ptr< QgsLineString > exteriorLineString( exteriorRing()->curveToLine() );
QgsPointSequence exteriorPts;
exteriorLineString->points( exteriorPts );
json += QgsGeometryUtils::pointsToJSON( exteriorPts, precision ) + QLatin1String( ", " );
std::unique_ptr< QgsLineString > interiorLineString;
for ( int i = 0, n = numInteriorRings(); i < n; ++i )
{
interiorLineString.reset( interiorRing( i )->curveToLine() );
QgsPointSequence interiorPts;
interiorLineString->points( interiorPts );
json += QgsGeometryUtils::pointsToJSON( interiorPts, precision ) + QLatin1String( ", " );
}
if ( json.endsWith( QLatin1String( ", " ) ) )
{
json.chop( 2 ); // Remove last ", "
}
}
json += QLatin1String( "] }" );
return json;
}
json QgsCurvePolygon::asJsonObject( int precision ) const
{
json coordinates;
json coordinates { json::array( )};
if ( exteriorRing() )
{
std::unique_ptr< QgsLineString > exteriorLineString( exteriorRing()->curveToLine() );

View File

@ -55,7 +55,6 @@ class CORE_EXPORT QgsCurvePolygon: public QgsSurface
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
//surface interface

View File

@ -1263,11 +1263,7 @@ QString QgsGeometry::asWkt( int precision ) const
QString QgsGeometry::asJson( int precision ) const
{
if ( !d->geometry )
{
return QStringLiteral( "null" );
}
return d->geometry->asJson( precision );
return QString::fromStdString( asJsonObject( precision ).dump() );
}
json QgsGeometry::asJsonObject( int precision ) const

View File

@ -417,24 +417,9 @@ QDomElement QgsGeometryCollection::asGml3( QDomDocument &doc, int precision, con
return elemMultiGeometry;
}
QString QgsGeometryCollection::asJson( int precision ) const
{
QString json = QStringLiteral( "{\"type\": \"GeometryCollection\", \"geometries\": [" );
for ( const QgsAbstractGeometry *geom : mGeometries )
{
json += geom->asJson( precision ) + QLatin1String( ", " );
}
if ( json.endsWith( QLatin1String( ", " ) ) )
{
json.chop( 2 ); // Remove last ", "
}
json += QLatin1String( "] }" );
return json;
}
json QgsGeometryCollection::asJsonObject( int precision ) const
{
json coordinates;
json coordinates { json::array( ) };
for ( const QgsAbstractGeometry *geom : qgis::as_const( mGeometries ) )
{
coordinates.push_back( geom->asJsonObject( precision ) );
@ -442,7 +427,7 @@ json QgsGeometryCollection::asJsonObject( int precision ) const
return
{
{ "type", "GeometryCollection" },
{ "coordinates", coordinates }
{ "geometries", coordinates }
};
}

View File

@ -173,7 +173,6 @@ class CORE_EXPORT QgsGeometryCollection: public QgsAbstractGeometry
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
QgsRectangle boundingBox() const override;

View File

@ -1200,7 +1200,7 @@ QString QgsGeometryUtils::pointsToJSON( const QgsPointSequence &points, int prec
json QgsGeometryUtils::pointsToJson( const QgsPointSequence &points, int precision )
{
json coordinates;
json coordinates { json::array() };
for ( const QgsPoint &p : points )
{
if ( p.is3D() )

View File

@ -412,14 +412,6 @@ QDomElement QgsLineString::asGml3( QDomDocument &doc, int precision, const QStri
return elemLineString;
}
QString QgsLineString::asJson( int precision ) const
{
QgsPointSequence pts;
points( pts );
return "{\"type\": \"LineString\", \"coordinates\": " + QgsGeometryUtils::pointsToJSON( pts, precision ) + '}';
}
json QgsLineString::asJsonObject( int precision ) const
{
QgsPointSequence pts;

View File

@ -560,7 +560,6 @@ class CORE_EXPORT QgsLineString: public QgsCurve
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
//curve interface

View File

@ -110,31 +110,9 @@ QDomElement QgsMultiCurve::asGml3( QDomDocument &doc, int precision, const QStri
return elemMultiCurve;
}
QString QgsMultiCurve::asJson( int precision ) const
{
// GeoJSON does not support curves
QString json = QStringLiteral( "{\"type\": \"MultiLineString\", \"coordinates\": [" );
for ( const QgsAbstractGeometry *geom : mGeometries )
{
if ( qgsgeometry_cast<const QgsCurve *>( geom ) )
{
std::unique_ptr< QgsLineString > lineString( static_cast<const QgsCurve *>( geom )->curveToLine() );
QgsPointSequence pts;
lineString->points( pts );
json += QgsGeometryUtils::pointsToJSON( pts, precision ) + QLatin1String( ", " );
}
}
if ( json.endsWith( QLatin1String( ", " ) ) )
{
json.chop( 2 ); // Remove last ", "
}
json += QLatin1String( "] }" );
return json;
}
json QgsMultiCurve::asJsonObject( int precision ) const
{
json coordinates;
json coordinates { json::array( ) };
for ( const QgsAbstractGeometry *geom : qgis::as_const( mGeometries ) )
{
if ( qgsgeometry_cast<const QgsCurve *>( geom ) )

View File

@ -37,7 +37,6 @@ class CORE_EXPORT QgsMultiCurve: public QgsGeometryCollection
bool fromWkt( const QString &wkt ) override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
bool addGeometry( QgsAbstractGeometry *g SIP_TRANSFER ) override;
bool insertGeometry( QgsAbstractGeometry *g SIP_TRANSFER, int index ) override;

View File

@ -98,30 +98,9 @@ QDomElement QgsMultiLineString::asGml3( QDomDocument &doc, int precision, const
return elemMultiCurve;
}
QString QgsMultiLineString::asJson( int precision ) const
{
QString json = QStringLiteral( "{\"type\": \"MultiLineString\", \"coordinates\": [" );
for ( const QgsAbstractGeometry *geom : mGeometries )
{
if ( qgsgeometry_cast<const QgsCurve *>( geom ) )
{
const QgsLineString *lineString = static_cast<const QgsLineString *>( geom );
QgsPointSequence pts;
lineString->points( pts );
json += QgsGeometryUtils::pointsToJSON( pts, precision ) + QLatin1String( ", " );
}
}
if ( json.endsWith( QLatin1String( ", " ) ) )
{
json.chop( 2 ); // Remove last ", "
}
json += QLatin1String( "] }" );
return json;
}
json QgsMultiLineString::asJsonObject( int precision ) const
{
json coordinates;
json coordinates { json::array( ) };
for ( const QgsAbstractGeometry *geom : mGeometries )
{
if ( qgsgeometry_cast<const QgsCurve *>( geom ) )

View File

@ -37,7 +37,6 @@ class CORE_EXPORT QgsMultiLineString: public QgsMultiCurve
bool fromWkt( const QString &wkt ) override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
bool addGeometry( QgsAbstractGeometry *g SIP_TRANSFER ) override;
bool insertGeometry( QgsAbstractGeometry *g SIP_TRANSFER, int index ) override;

View File

@ -112,24 +112,6 @@ QDomElement QgsMultiPoint::asGml3( QDomDocument &doc, int precision, const QStri
return elemMultiPoint;
}
QString QgsMultiPoint::asJson( int precision ) const
{
QString json = QStringLiteral( "{\"type\": \"MultiPoint\", \"coordinates\": " );
QgsPointSequence pts;
for ( const QgsAbstractGeometry *geom : mGeometries )
{
if ( qgsgeometry_cast<const QgsPoint *>( geom ) )
{
const QgsPoint *point = static_cast<const QgsPoint *>( geom );
pts << *point;
}
}
json += QgsGeometryUtils::pointsToJSON( pts, precision );
json += QLatin1String( " }" );
return json;
}
json QgsMultiPoint::asJsonObject( int precision ) const
{
json j

View File

@ -38,7 +38,6 @@ class CORE_EXPORT QgsMultiPoint: public QgsGeometryCollection
void clear() override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
int nCoordinates() const override;
bool addGeometry( QgsAbstractGeometry *g SIP_TRANSFER ) override;

View File

@ -98,54 +98,12 @@ QDomElement QgsMultiPolygon::asGml3( QDomDocument &doc, int precision, const QSt
return elemMultiSurface;
}
QString QgsMultiPolygon::asJson( int precision ) const
{
// GeoJSON does not support curves
QString json = QStringLiteral( "{\"type\": \"MultiPolygon\", \"coordinates\": [" );
for ( const QgsAbstractGeometry *geom : mGeometries )
{
if ( qgsgeometry_cast<const QgsPolygon *>( geom ) )
{
json += '[';
const QgsPolygon *polygon = static_cast<const QgsPolygon *>( geom );
std::unique_ptr< QgsLineString > exteriorLineString( polygon->exteriorRing()->curveToLine() );
QgsPointSequence exteriorPts;
exteriorLineString->points( exteriorPts );
json += QgsGeometryUtils::pointsToJSON( exteriorPts, precision ) + QLatin1String( ", " );
std::unique_ptr< QgsLineString > interiorLineString;
for ( int i = 0, n = polygon->numInteriorRings(); i < n; ++i )
{
interiorLineString.reset( polygon->interiorRing( i )->curveToLine() );
QgsPointSequence interiorPts;
interiorLineString->points( interiorPts );
json += QgsGeometryUtils::pointsToJSON( interiorPts, precision ) + QLatin1String( ", " );
}
if ( json.endsWith( QLatin1String( ", " ) ) )
{
json.chop( 2 ); // Remove last ", "
}
json += QLatin1String( "], " );
}
}
if ( json.endsWith( QLatin1String( ", " ) ) )
{
json.chop( 2 ); // Remove last ", "
}
json += QLatin1String( "] }" );
return json;
}
json QgsMultiPolygon::asJsonObject( int precision ) const
{
json polygons;
json polygons { json::array( ) };
for ( const QgsAbstractGeometry *geom : qgis::as_const( mGeometries ) )
{
json coordinates;
json coordinates { json::array( ) };
if ( qgsgeometry_cast<const QgsPolygon *>( geom ) )
{
const QgsPolygon *polygon = static_cast<const QgsPolygon *>( geom );

View File

@ -36,7 +36,6 @@ class CORE_EXPORT QgsMultiPolygon: public QgsMultiSurface
bool fromWkt( const QString &wkt ) override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
bool addGeometry( QgsAbstractGeometry *g SIP_TRANSFER ) override;
bool insertGeometry( QgsAbstractGeometry *g SIP_TRANSFER, int index ) override;

View File

@ -109,50 +109,10 @@ QDomElement QgsMultiSurface::asGml3( QDomDocument &doc, int precision, const QSt
return elemMultiSurface;
}
QString QgsMultiSurface::asJson( int precision ) const
{
// GeoJSON does not support curves
QString json = QStringLiteral( "{\"type\": \"MultiPolygon\", \"coordinates\": [" );
for ( const QgsAbstractGeometry *geom : mGeometries )
{
if ( qgsgeometry_cast<const QgsSurface *>( geom ) )
{
json += '[';
std::unique_ptr< QgsPolygon >polygon( static_cast<const QgsSurface *>( geom )->surfaceToPolygon() );
std::unique_ptr< QgsLineString > exteriorLineString( polygon->exteriorRing()->curveToLine() );
QgsPointSequence exteriorPts;
exteriorLineString->points( exteriorPts );
json += QgsGeometryUtils::pointsToJSON( exteriorPts, precision ) + QLatin1String( ", " );
std::unique_ptr< QgsLineString > interiorLineString;
for ( int i = 0, n = polygon->numInteriorRings(); i < n; ++i )
{
interiorLineString.reset( polygon->interiorRing( i )->curveToLine() );
QgsPointSequence interiorPts;
interiorLineString->points( interiorPts );
json += QgsGeometryUtils::pointsToJSON( interiorPts, precision ) + QLatin1String( ", " );
}
if ( json.endsWith( QLatin1String( ", " ) ) )
{
json.chop( 2 ); // Remove last ", "
}
json += QLatin1String( "], " );
}
}
if ( json.endsWith( QLatin1String( ", " ) ) )
{
json.chop( 2 ); // Remove last ", "
}
json += QLatin1String( "] }" );
return json;
}
json QgsMultiSurface::asJsonObject( int precision ) const
{
json coordinates;
json coordinates { json::array( ) };
for ( const QgsAbstractGeometry *geom : qgis::as_const( mGeometries ) )
{
if ( qgsgeometry_cast<const QgsSurface *>( geom ) )

View File

@ -37,7 +37,6 @@ class CORE_EXPORT QgsMultiSurface: public QgsGeometryCollection
bool fromWkt( const QString &wkt ) override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
bool addGeometry( QgsAbstractGeometry *g SIP_TRANSFER ) override;
bool insertGeometry( QgsAbstractGeometry *g SIP_TRANSFER, int index ) override;

View File

@ -283,12 +283,6 @@ QDomElement QgsPoint::asGml3( QDomDocument &doc, int precision, const QString &n
* See details in QEP #17
****************************************************************************/
QString QgsPoint::asJson( int precision ) const
{
return "{\"type\": \"Point\", \"coordinates\": ["
+ qgsDoubleToString( mX, precision ) + QLatin1String( ", " ) + qgsDoubleToString( mY, precision )
+ QLatin1String( "]}" );
}
json QgsPoint::asJsonObject( int precision ) const
{

View File

@ -436,7 +436,6 @@ class CORE_EXPORT QgsPoint: public QgsAbstractGeometry
QString asWkt( int precision = 17 ) const override;
QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
QString asJson( int precision = 17 ) const override;
json asJsonObject( int precision = 17 ) const override SIP_SKIP;
void draw( QPainter &p ) const override;
void transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform, bool transformZ = false ) override SIP_THROW( QgsCsException );

View File

@ -67,6 +67,7 @@ INCLUDE_DIRECTORIES(
${CMAKE_SOURCE_DIR}/src/core/effects
${CMAKE_SOURCE_DIR}/src/core/metadata
${CMAKE_SOURCE_DIR}/src/core/expression
${CMAKE_SOURCE_DIR}/external
${CMAKE_BINARY_DIR}/src/core
)

File diff suppressed because one or more lines are too long

View File

@ -119,13 +119,6 @@ class TestQgsJsonUtils : public QObject
}
}
void testExportFeatureJson_data()
{
QTest::addColumn<JsonAlgs>( "JsonAlgs" );
QTest::newRow( "Use json" ) << JsonAlgs::Json;
QTest::newRow( "Use old string concat" ) << JsonAlgs::String;
}
void testExportFeatureJson()
{
@ -152,35 +145,47 @@ class TestQgsJsonUtils : public QObject
void testExportGeomToJson()
{
const QStringList testWkts
const QMap<QString, QString> testWkts
{
{
QStringLiteral( "LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)" ),
QStringLiteral( "MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932))" ),
QStringLiteral( "POINT(-71.064544 42.28787)" ),
QStringLiteral( "MULTIPOINT(-71.064544 42.28787, -71.1776585052917 42.3902909739571)" ),
QStringLiteral( "POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,"
"-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))" ),
QStringLiteral( "MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2)),((3 3,6 2,6 4,3 3)))" ),
QStringLiteral( "CIRCULARSTRING(220268 150415,220227 150505,220227 150406)" ),
{
QStringLiteral( "LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)" ),
QStringLiteral( R"json({"coordinates":[[-71.16,42.259],[-71.161,42.259],[-71.161,42.259]],"type":"LineString"})json" )
},
{
QStringLiteral( "MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932), (-70 43.56, -67 44.68))" ),
QStringLiteral( R"json({"coordinates":[[[-71.16,42.259],[-71.161,42.259],[-71.161,42.259]],[[-70.0,43.56],[-67.0,44.68]]],"type":"MultiLineString"})json" )
},
{ QStringLiteral( "POINT(-71.064544 42.28787)" ), QStringLiteral( R"json({"coordinates":[-71.065,42.288],"type":"Point"})json" ) },
{ QStringLiteral( "MULTIPOINT(-71.064544 42.28787, -71.1776585052917 42.3902909739571)" ), QStringLiteral( R"json({"coordinates":[[-71.065,42.288],[-71.178,42.39]],"type":"MultiPoint"})json" ) },
{
QStringLiteral( "POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,"
"-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))" ),
QStringLiteral( R"json({"coordinates":[[[-71.178,42.39],[-71.178,42.39],[-71.178,42.39],[-71.178,42.39],[-71.178,42.39]]],"type":"Polygon"})json" )
},
{
QStringLiteral( "MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2)),((3 3,6 2,6 4,3 3)))" ),
QStringLiteral( R"json({"coordinates":[[[[1.0,1.0],[5.0,1.0],[5.0,5.0],[1.0,5.0],[1.0,1.0]],[[2.0,2.0],[3.0,2.0],[3.0,3.0],[2.0,3.0],[2.0,2.0]]],[[[3.0,3.0],[6.0,2.0],[6.0,4.0],[3.0,3.0]]]],"type":"MultiPolygon"})json" )
},
// Note: CIRCULARSTRING json is very long, we will check first three vertices only
{ QStringLiteral( "CIRCULARSTRING(220268 150415,220227 150505,220227 150406)" ), QStringLiteral( R"json({"coordinates":[[220268.0,150415.0],[220268.7,150415.535],[220269.391,150416.081])json" ) },
}
};
for ( const auto &w : testWkts )
for ( const auto &w : testWkts.toStdMap() )
{
const auto g { QgsGeometry::fromWkt( w ) };
const auto g { QgsGeometry::fromWkt( w.first ) };
QVERIFY( !g.isNull( ) );
QCOMPARE( QJsonDocument::fromJson( QByteArray::fromStdString( g.asJsonObject( 3 ).dump() ) )
.toJson( QJsonDocument::JsonFormat::Compact ),
QJsonDocument::fromJson( g.asJson( 3 ).toUtf8() )
.toJson( QJsonDocument::JsonFormat::Compact ) );
const auto outp { QJsonDocument::fromJson( g.asJson( 3 ).toUtf8() )
.toJson( QJsonDocument::JsonFormat::Compact ) };
qDebug() << QStringLiteral( "{ \"%1\", R\"json(%2)json\" }, " )
.arg( w )
.arg( QString( outp ) );
if ( w.first.startsWith( QStringLiteral( "CIRCULARSTRING" ) ) )
{
QVERIFY( g.asJson( 3 ).startsWith( w.second ) );
QCOMPARE( g.asJsonObject( 3 )["type"], "LineString" );
}
else
{
QCOMPARE( g.asJson( 3 ), w.second );
}
}
}
};

View File

@ -27,10 +27,12 @@ INCLUDE_DIRECTORIES(
${CMAKE_SOURCE_DIR}/src/native
${CMAKE_SOURCE_DIR}/src/quickgui
${CMAKE_SOURCE_DIR}/src/test
${CMAKE_SOURCE_DIR}/external
${CMAKE_BINARY_DIR}/src/core
${CMAKE_BINARY_DIR}/src/native
${CMAKE_BINARY_DIR}/src/quickgui
)
INCLUDE_DIRECTORIES(SYSTEM