From d4445364e1cca3733633f172f7a7df9d4759c265 Mon Sep 17 00:00:00 2001 From: nirvn Date: Fri, 8 Dec 2017 15:10:39 +0700 Subject: [PATCH] [spatialite provider] Fix ZM support --- src/app/qgsnewspatialitelayerdialog.cpp | 27 +- src/app/qgsnewspatialitelayerdialog.h | 2 + .../spatialite/qgsspatialiteprovider.cpp | 1017 ++++++++++------- .../spatialite/qgsspatialiteprovider.h | 15 +- src/ui/qgsnewspatialitelayerdialogbase.ui | 26 +- 5 files changed, 633 insertions(+), 454 deletions(-) diff --git a/src/app/qgsnewspatialitelayerdialog.cpp b/src/app/qgsnewspatialitelayerdialog.cpp index 4b66af214af4..9813e2c1e39b 100644 --- a/src/app/qgsnewspatialitelayerdialog.cpp +++ b/src/app/qgsnewspatialitelayerdialog.cpp @@ -56,10 +56,10 @@ QgsNewSpatialiteLayerDialog::QgsNewSpatialiteLayerDialog( QWidget *parent, Qt::W restoreGeometry( settings.value( QStringLiteral( "Windows/NewSpatiaLiteLayer/geometry" ) ).toByteArray() ); mGeometryTypeBox->addItem( tr( "Point" ), QStringLiteral( "POINT" ) ); - mGeometryTypeBox->addItem( tr( "Line" ), QStringLiteral( "LINE" ) ); + mGeometryTypeBox->addItem( tr( "Line" ), QStringLiteral( "LINESTRING" ) ); mGeometryTypeBox->addItem( tr( "Polygon" ), QStringLiteral( "POLYGON" ) ); mGeometryTypeBox->addItem( tr( "MultiPoint" ), QStringLiteral( "MULTIPOINT" ) ); - mGeometryTypeBox->addItem( tr( "MultiLine" ), QStringLiteral( "MULTILINE" ) ); + mGeometryTypeBox->addItem( tr( "MultiLine" ), QStringLiteral( "MULTILINESTRING" ) ); mGeometryTypeBox->addItem( tr( "MultiPolygon" ), QStringLiteral( "MULTIPOLYGON" ) ); mAddAttributeButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionNewAttribute.svg" ) ) ); @@ -147,6 +147,24 @@ QString QgsNewSpatialiteLayerDialog::selectedType() const return mGeometryTypeBox->currentData( Qt::UserRole ).toString(); } +QString QgsNewSpatialiteLayerDialog::selectedZM() const +{ + if ( mGeometryWithZCheckBox->isChecked() && !mGeometryWithMCheckBox->isChecked() ) + { + return QStringLiteral( "XYZ" ); + } + else if ( !mGeometryWithZCheckBox->isChecked() && mGeometryWithMCheckBox->isChecked() ) + { + return QStringLiteral( "XYM" ); + } + else if ( mGeometryWithZCheckBox->isChecked() && mGeometryWithMCheckBox->isChecked() ) + { + return QStringLiteral( "XYZM" ); + } + + return QStringLiteral( "XY" ); +} + void QgsNewSpatialiteLayerDialog::checkOk() { bool created = !leLayerName->text().isEmpty() && @@ -366,11 +384,12 @@ bool QgsNewSpatialiteLayerDialog::apply() QgsDebugMsg( sql ); // OK - QString sqlAddGeom = QStringLiteral( "select AddGeometryColumn(%1,%2,%3,%4,2)" ) + QString sqlAddGeom = QStringLiteral( "select AddGeometryColumn(%1,%2,%3,%4,%5)" ) .arg( quotedValue( leLayerName->text() ), quotedValue( leGeometryColumn->text() ) ) .arg( mCrsId.split( ':' ).value( 1, QStringLiteral( "0" ) ).toInt() ) - .arg( quotedValue( selectedType() ) ); + .arg( quotedValue( selectedType() ) ) + .arg( quotedValue( selectedZM() ) ); QgsDebugMsg( sqlAddGeom ); // OK QString sqlCreateIndex = QStringLiteral( "select CreateSpatialIndex(%1,%2)" ) diff --git a/src/app/qgsnewspatialitelayerdialog.h b/src/app/qgsnewspatialitelayerdialog.h index 369182573dcf..8c4a50c1897d 100644 --- a/src/app/qgsnewspatialitelayerdialog.h +++ b/src/app/qgsnewspatialitelayerdialog.h @@ -55,6 +55,8 @@ class APP_EXPORT QgsNewSpatialiteLayerDialog: public QDialog, private Ui::QgsNew private: //! Returns the selected geometry type QString selectedType() const; + //! Returns the selected Z dimension and/or M measurement + QString selectedZM() const; //! Create a new database bool createDb(); diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp index 78332b45e32a..b4d77ae1933f 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.cpp +++ b/src/providers/spatialite/qgsspatialiteprovider.cpp @@ -1294,7 +1294,7 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB2D( const unsigned char *p_in, } int QgsSpatiaLiteProvider::computeSizeFromGeosWKB3D( const unsigned char *blob, - int size, int type, int nDims, + int size, QgsWkbTypes::Type type, int nDims, int little_endian, int endian_arch ) { Q_UNUSED( size ); @@ -1305,10 +1305,10 @@ int QgsSpatiaLiteProvider::computeSizeFromGeosWKB3D( const unsigned char *blob, const unsigned char *p_in = blob + 5; int gsize = 5; - switch ( type ) + switch ( QgsWkbTypes::geometryType( type ) ) { // compunting the required size - case GEOS_3D_POINT: + case QgsWkbTypes::PointGeometry: switch ( nDims ) { case GAIA_XY_Z_M: @@ -1323,7 +1323,7 @@ int QgsSpatiaLiteProvider::computeSizeFromGeosWKB3D( const unsigned char *blob, break; } break; - case GEOS_3D_LINESTRING: + case QgsWkbTypes::LineGeometry: points = gaiaImport32( p_in, little_endian, endian_arch ); gsize += 4; switch ( nDims ) @@ -1340,7 +1340,7 @@ int QgsSpatiaLiteProvider::computeSizeFromGeosWKB3D( const unsigned char *blob, break; } break; - case GEOS_3D_POLYGON: + case QgsWkbTypes::PolygonGeometry: rings = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; gsize += 4; @@ -1381,7 +1381,7 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB3D( const unsigned char *p_in, { // calculating the size required to store this WKB int entities; - int type; + QgsWkbTypes::Type type; int rings; int points; int ie; @@ -1393,13 +1393,13 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB3D( const unsigned char *p_in, size += 4; for ( ie = 0; ie < entities; ie++ ) { - type = gaiaImport32( p_in + 1, little_endian, endian_arch ); + type = static_cast< QgsWkbTypes::Type >( gaiaImport32( p_in + 1, little_endian, endian_arch ) ); p_in += 5; size += 5; - switch ( type ) + switch ( QgsWkbTypes::geometryType( type ) ) { // compunting the required size - case GEOS_3D_POINT: + case QgsWkbTypes::PointGeometry: switch ( nDims ) { case GAIA_XY_Z_M: @@ -1415,7 +1415,7 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB3D( const unsigned char *p_in, } p_in += 3 * sizeof( double ); break; - case GEOS_3D_LINESTRING: + case QgsWkbTypes::LineGeometry: points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; size += 4; @@ -1434,7 +1434,7 @@ int QgsSpatiaLiteProvider::computeSizeFromMultiWKB3D( const unsigned char *p_in, } p_in += points * ( 3 * sizeof( double ) ); break; - case GEOS_3D_POLYGON: + case QgsWkbTypes::PolygonGeometry: rings = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; size += 4; @@ -1472,7 +1472,7 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB( const unsigned char *blob, int nDims ) { // attempting to convert from 2D/3D GEOS own WKB - int type; + QgsWkbTypes::Type type; int gDims; int gsize; int little_endian; @@ -1486,16 +1486,10 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB( const unsigned char *blob, little_endian = GAIA_LITTLE_ENDIAN; else little_endian = GAIA_BIG_ENDIAN; - type = gaiaImport32( blob + 1, little_endian, endian_arch ); - if ( type == GEOS_3D_POINT || type == GEOS_3D_LINESTRING - || type == GEOS_3D_POLYGON - || type == GEOS_3D_MULTIPOINT || type == GEOS_3D_MULTILINESTRING - || type == GEOS_3D_MULTIPOLYGON || type == GEOS_3D_GEOMETRYCOLLECTION ) + type = static_cast< QgsWkbTypes::Type >( gaiaImport32( blob + 1, little_endian, endian_arch ) ); + if ( QgsWkbTypes::hasZ( type ) || QgsWkbTypes::hasM( type ) ) gDims = 3; - else if ( type == GAIA_POINT || type == GAIA_LINESTRING - || type == GAIA_POLYGON || type == GAIA_MULTIPOINT - || type == GAIA_MULTILINESTRING || type == GAIA_MULTIPOLYGON - || type == GAIA_GEOMETRYCOLLECTION ) + else if ( type != QgsWkbTypes::Unknown ) gDims = 2; else return; @@ -1697,12 +1691,16 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB2D( const unsigned char *blob, p_out += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } break; @@ -1723,12 +1721,16 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB2D( const unsigned char *blob, p_out += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } } @@ -1756,12 +1758,16 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB2D( const unsigned char *blob, p_out += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } } @@ -1802,12 +1808,16 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB2D( const unsigned char *blob, p_out += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } } @@ -1853,12 +1863,16 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB2D( const unsigned char *blob, p_out += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } } @@ -1911,12 +1925,16 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB2D( const unsigned char *blob, p_out += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } } @@ -2002,12 +2020,16 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB2D( const unsigned char *blob, p_out += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } break; @@ -2028,12 +2050,16 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB2D( const unsigned char *blob, p_out += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } } @@ -2061,12 +2087,16 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB2D( const unsigned char *blob, p_out += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } } @@ -2089,7 +2119,7 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB3D( const unsigned char *blob, Q_UNUSED( blob_size ); Q_UNUSED( geom_size ); // attempting to convert from 3D GEOS own WKB - int type; + QgsWkbTypes::Type type; int entities; int rings; int points; @@ -2102,11 +2132,11 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB3D( const unsigned char *blob, // building from GEOS 3D WKB *p_out++ = 0x01; // little endian byte order - type = gaiaImport32( blob + 1, little_endian, endian_arch ); - switch ( type ) + type = static_cast< QgsWkbTypes::Type >( gaiaImport32( blob + 1, little_endian, endian_arch ) ); + if ( QgsWkbTypes::geometryType( type ) == QgsWkbTypes::PointGeometry ) { - // setting Geometry TYPE - case GEOS_3D_POINT: + if ( QgsWkbTypes::isSingleType( type ) ) + { switch ( nDims ) { case GAIA_XY_Z_M: @@ -2122,59 +2152,48 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB3D( const unsigned char *blob, gaiaExport32( p_out, GAIA_POINT, 1, endian_arch ); break; } - break; - case GEOS_3D_LINESTRING: - switch ( nDims ) - { - case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_LINESTRINGZM, 1, endian_arch ); - break; - case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_LINESTRINGZ, 1, endian_arch ); - break; - case GAIA_XY_M: - gaiaExport32( p_out, GAIA_LINESTRINGM, 1, endian_arch ); - break; - default: - gaiaExport32( p_out, GAIA_LINESTRING, 1, endian_arch ); - break; - } - break; - case GEOS_3D_POLYGON: + } + else + { switch ( nDims ) { case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_POLYGONZM, 1, endian_arch ); + gaiaExport32( p_out, GAIA_MULTIPOINTZM, 1, endian_arch ); break; case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_POLYGONZ, 1, endian_arch ); + gaiaExport32( p_out, GAIA_MULTIPOINTZ, 1, endian_arch ); break; case GAIA_XY_M: - gaiaExport32( p_out, GAIA_POLYGONM, 1, endian_arch ); + gaiaExport32( p_out, GAIA_MULTIPOINTM, 1, endian_arch ); break; default: - gaiaExport32( p_out, GAIA_POLYGON, 1, endian_arch ); + gaiaExport32( p_out, GAIA_MULTIPOINT, 1, endian_arch ); break; } - break; - case GEOS_3D_MULTIPOINT: + } + } + else if ( QgsWkbTypes::geometryType( type ) == QgsWkbTypes::LineGeometry ) + { + if ( QgsWkbTypes::isSingleType( type ) ) + { switch ( nDims ) { case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_MULTIPOINTZM, 1, endian_arch ); + gaiaExport32( p_out, GAIA_LINESTRINGZM, 1, endian_arch ); break; case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_MULTIPOINTZ, 1, endian_arch ); + gaiaExport32( p_out, GAIA_LINESTRINGZ, 1, endian_arch ); break; case GAIA_XY_M: - gaiaExport32( p_out, GAIA_MULTIPOINTM, 1, endian_arch ); + gaiaExport32( p_out, GAIA_LINESTRINGM, 1, endian_arch ); break; default: - gaiaExport32( p_out, GAIA_MULTIPOINT, 1, endian_arch ); + gaiaExport32( p_out, GAIA_LINESTRING, 1, endian_arch ); break; } - break; - case GEOS_3D_MULTILINESTRING: + } + else + { switch ( nDims ) { case GAIA_XY_Z_M: @@ -2190,76 +2209,73 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB3D( const unsigned char *blob, gaiaExport32( p_out, GAIA_MULTILINESTRING, 1, endian_arch ); break; } - break; - case GEOS_3D_MULTIPOLYGON: + } + } + else if ( QgsWkbTypes::geometryType( type ) == QgsWkbTypes::PolygonGeometry ) + { + if ( QgsWkbTypes::isSingleType( type ) ) + { switch ( nDims ) { case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_MULTIPOLYGONZM, 1, endian_arch ); + gaiaExport32( p_out, GAIA_POLYGONZM, 1, endian_arch ); break; case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_MULTIPOLYGONZ, 1, endian_arch ); + gaiaExport32( p_out, GAIA_POLYGONZ, 1, endian_arch ); break; case GAIA_XY_M: - gaiaExport32( p_out, GAIA_MULTIPOLYGONM, 1, endian_arch ); + gaiaExport32( p_out, GAIA_POLYGONM, 1, endian_arch ); break; default: - gaiaExport32( p_out, GAIA_MULTIPOLYGON, 1, endian_arch ); + gaiaExport32( p_out, GAIA_POLYGON, 1, endian_arch ); break; } - break; - case GEOS_3D_GEOMETRYCOLLECTION: + } + else + { switch ( nDims ) { case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_GEOMETRYCOLLECTIONZM, 1, endian_arch ); + gaiaExport32( p_out, GAIA_MULTIPOLYGONZM, 1, endian_arch ); break; case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_GEOMETRYCOLLECTIONZ, 1, endian_arch ); + gaiaExport32( p_out, GAIA_MULTIPOLYGONZ, 1, endian_arch ); break; case GAIA_XY_M: - gaiaExport32( p_out, GAIA_GEOMETRYCOLLECTIONM, 1, endian_arch ); + gaiaExport32( p_out, GAIA_MULTIPOLYGONM, 1, endian_arch ); break; default: - gaiaExport32( p_out, GAIA_GEOMETRYCOLLECTION, 1, endian_arch ); + gaiaExport32( p_out, GAIA_MULTIPOLYGON, 1, endian_arch ); break; } - break; + } + } + else if ( QgsWkbTypes::flatType( type ) == QgsWkbTypes::GeometryCollection ) + { + switch ( nDims ) + { + case GAIA_XY_Z_M: + gaiaExport32( p_out, GAIA_GEOMETRYCOLLECTIONZM, 1, endian_arch ); + break; + case GAIA_XY_Z: + gaiaExport32( p_out, GAIA_GEOMETRYCOLLECTIONZ, 1, endian_arch ); + break; + case GAIA_XY_M: + gaiaExport32( p_out, GAIA_GEOMETRYCOLLECTIONM, 1, endian_arch ); + break; + default: + gaiaExport32( p_out, GAIA_GEOMETRYCOLLECTION, 1, endian_arch ); + break; + } } p_in = blob + 5; p_out += 4; - switch ( type ) + if ( QgsWkbTypes::isSingleType( type ) ) { - // setting Geometry values - case GEOS_3D_POINT: - coord = gaiaImport64( p_in, little_endian, endian_arch ); - gaiaExport64( p_out, coord, 1, endian_arch ); // X - p_in += sizeof( double ); - p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - gaiaExport64( p_out, coord, 1, endian_arch ); // Y - p_in += sizeof( double ); - p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - p_in += sizeof( double ); - if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) - { - gaiaExport64( p_out, coord, 1, endian_arch ); // Z - p_out += sizeof( double ); - } - if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) - { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M - p_out += sizeof( double ); - } - break; - case GEOS_3D_LINESTRING: - points = gaiaImport32( p_in, little_endian, endian_arch ); - p_in += 4; - gaiaExport32( p_out, points, 1, endian_arch ); - p_out += 4; - for ( iv = 0; iv < points; iv++ ) - { + switch ( QgsWkbTypes::geometryType( type ) ) + { + // setting Geometry values + case QgsWkbTypes::PointGeometry: coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // X p_in += sizeof( double ); @@ -2268,27 +2284,22 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB3D( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - p_in += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { + coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } - } - break; - case GEOS_3D_POLYGON: - rings = gaiaImport32( p_in, little_endian, endian_arch ); - p_in += 4; - gaiaExport32( p_out, rings, 1, endian_arch ); - p_out += 4; - for ( ib = 0; ib < rings; ib++ ) - { + break; + case QgsWkbTypes::LineGeometry: points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; gaiaExport32( p_out, points, 1, endian_arch ); @@ -2303,99 +2314,256 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB3D( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - p_in += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { + coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } } - } - break; - case GEOS_3D_MULTIPOINT: - entities = gaiaImport32( p_in, little_endian, endian_arch ); - p_in += 4; - gaiaExport32( p_out, entities, 1, endian_arch ); - p_out += 4; - for ( ie = 0; ie < entities; ie++ ) - { - p_in += 5; - *p_out++ = 0x01; - switch ( nDims ) + break; + case QgsWkbTypes::PolygonGeometry: + rings = gaiaImport32( p_in, little_endian, endian_arch ); + p_in += 4; + gaiaExport32( p_out, rings, 1, endian_arch ); + p_out += 4; + for ( ib = 0; ib < rings; ib++ ) { - case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_POINTZM, 1, endian_arch ); - break; - case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_POINTZ, 1, endian_arch ); - break; - case GAIA_XY_M: - gaiaExport32( p_out, GAIA_POINTM, 1, endian_arch ); - break; - default: - gaiaExport32( p_out, GAIA_POINT, 1, endian_arch ); - break; + points = gaiaImport32( p_in, little_endian, endian_arch ); + p_in += 4; + gaiaExport32( p_out, points, 1, endian_arch ); + p_out += 4; + for ( iv = 0; iv < points; iv++ ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // X + p_in += sizeof( double ); + p_out += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Y + p_in += sizeof( double ); + p_out += sizeof( double ); + if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); + p_out += sizeof( double ); + } + if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); + } + } } + break; + + case QgsWkbTypes::GeometryCollection: + entities = gaiaImport32( p_in, little_endian, endian_arch ); + p_in += 4; + gaiaExport32( p_out, entities, 1, endian_arch ); p_out += 4; - coord = gaiaImport64( p_in, little_endian, endian_arch ); - gaiaExport64( p_out, coord, 1, endian_arch ); // X - p_in += sizeof( double ); - p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - gaiaExport64( p_out, coord, 1, endian_arch ); // Y - p_in += sizeof( double ); - p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - p_in += sizeof( double ); - if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) - { - gaiaExport64( p_out, coord, 1, endian_arch ); // Z - p_out += sizeof( double ); - } - if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) + for ( ie = 0; ie < entities; ie++ ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M - p_out += sizeof( double ); - } - } - break; - case GEOS_3D_MULTILINESTRING: - entities = gaiaImport32( p_in, little_endian, endian_arch ); - p_in += 4; - gaiaExport32( p_out, entities, 1, endian_arch ); - p_out += 4; - for ( ie = 0; ie < entities; ie++ ) - { - p_in += 5; - *p_out++ = 0x01; - switch ( nDims ) - { - case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_LINESTRINGZM, 1, endian_arch ); - break; - case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_LINESTRINGZ, 1, endian_arch ); - break; - case GAIA_XY_M: - gaiaExport32( p_out, GAIA_LINESTRINGM, 1, endian_arch ); - break; - default: - gaiaExport32( p_out, GAIA_LINESTRING, 1, endian_arch ); - break; + QgsWkbTypes::Type type2 = static_cast< QgsWkbTypes::Type >( gaiaImport32( p_in + 1, little_endian, endian_arch ) ); + p_in += 5; + *p_out++ = 0x01; + switch ( QgsWkbTypes::geometryType( type2 ) ) + { + case QgsWkbTypes::PointGeometry: + switch ( nDims ) + { + case GAIA_XY_Z_M: + gaiaExport32( p_out, GAIA_POINTZM, 1, endian_arch ); + break; + case GAIA_XY_Z: + gaiaExport32( p_out, GAIA_POINTZ, 1, endian_arch ); + break; + case GAIA_XY_M: + gaiaExport32( p_out, GAIA_POINTM, 1, endian_arch ); + break; + default: + gaiaExport32( p_out, GAIA_POINT, 1, endian_arch ); + break; + } + break; + case QgsWkbTypes::LineGeometry: + switch ( nDims ) + { + case GAIA_XY_Z_M: + gaiaExport32( p_out, GAIA_LINESTRINGZM, 1, endian_arch ); + break; + case GAIA_XY_Z: + gaiaExport32( p_out, GAIA_LINESTRINGZ, 1, endian_arch ); + break; + case GAIA_XY_M: + gaiaExport32( p_out, GAIA_LINESTRINGM, 1, endian_arch ); + break; + default: + gaiaExport32( p_out, GAIA_LINESTRING, 1, endian_arch ); + break; + } + break; + case QgsWkbTypes::PolygonGeometry: + switch ( nDims ) + { + case GAIA_XY_Z_M: + gaiaExport32( p_out, GAIA_POLYGONZM, 1, endian_arch ); + break; + case GAIA_XY_Z: + gaiaExport32( p_out, GAIA_POLYGONZ, 1, endian_arch ); + break; + case GAIA_XY_M: + gaiaExport32( p_out, GAIA_POLYGONM, 1, endian_arch ); + break; + default: + gaiaExport32( p_out, GAIA_POLYGON, 1, endian_arch ); + break; + } + break; + } + p_out += 4; + switch ( QgsWkbTypes::geometryType( type2 ) ) + { + // setting sub-Geometry values + case QgsWkbTypes::PointGeometry: + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // X + p_in += sizeof( double ); + p_out += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Y + p_in += sizeof( double ); + p_out += sizeof( double ); + if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); + p_out += sizeof( double ); + } + if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); + } + break; + case QgsWkbTypes::LineGeometry: + points = gaiaImport32( p_in, little_endian, endian_arch ); + p_in += 4; + gaiaExport32( p_out, points, 1, endian_arch ); + p_out += 4; + for ( iv = 0; iv < points; iv++ ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // X + p_in += sizeof( double ); + p_out += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Y + p_in += sizeof( double ); + p_out += sizeof( double ); + if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); + p_out += sizeof( double ); + } + if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); + } + } + break; + case QgsWkbTypes::PolygonGeometry: + rings = gaiaImport32( p_in, little_endian, endian_arch ); + p_in += 4; + gaiaExport32( p_out, rings, 1, endian_arch ); + p_out += 4; + for ( ib = 0; ib < rings; ib++ ) + { + points = gaiaImport32( p_in, little_endian, endian_arch ); + p_in += 4; + gaiaExport32( p_out, points, 1, endian_arch ); + p_out += 4; + for ( iv = 0; iv < points; iv++ ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // X + p_in += sizeof( double ); + p_out += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Y + p_in += sizeof( double ); + p_out += sizeof( double ); + if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); + p_out += sizeof( double ); + } + if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) + { + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); + } + } + } + break; + } } - p_out += 4; - points = gaiaImport32( p_in, little_endian, endian_arch ); + break; + } + } + else + { + switch ( QgsWkbTypes::geometryType( type ) ) + { + case QgsWkbTypes::PointGeometry: + entities = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; - gaiaExport32( p_out, points, 1, endian_arch ); + gaiaExport32( p_out, entities, 1, endian_arch ); p_out += 4; - for ( iv = 0; iv < points; iv++ ) + for ( ie = 0; ie < entities; ie++ ) { + p_in += 5; + *p_out++ = 0x01; + switch ( nDims ) + { + case GAIA_XY_Z_M: + gaiaExport32( p_out, GAIA_POINTZM, 1, endian_arch ); + break; + case GAIA_XY_Z: + gaiaExport32( p_out, GAIA_POINTZ, 1, endian_arch ); + break; + case GAIA_XY_M: + gaiaExport32( p_out, GAIA_POINTM, 1, endian_arch ); + break; + default: + gaiaExport32( p_out, GAIA_POINT, 1, endian_arch ); + break; + } + p_out += 4; coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // X p_in += sizeof( double ); @@ -2404,52 +2572,47 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB3D( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - p_in += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { + coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } } - } - break; - case GEOS_3D_MULTIPOLYGON: - entities = gaiaImport32( p_in, little_endian, endian_arch ); - p_in += 4; - gaiaExport32( p_out, entities, 1, endian_arch ); - p_out += 4; - for ( ie = 0; ie < entities; ie++ ) - { - p_in += 5; - *p_out++ = 0x01; - switch ( nDims ) - { - case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_POLYGONZM, 1, endian_arch ); - break; - case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_POLYGONZ, 1, endian_arch ); - break; - case GAIA_XY_M: - gaiaExport32( p_out, GAIA_POLYGONM, 1, endian_arch ); - break; - default: - gaiaExport32( p_out, GAIA_POLYGON, 1, endian_arch ); - break; - } - p_out += 4; - rings = gaiaImport32( p_in, little_endian, endian_arch ); + break; + case QgsWkbTypes::LineGeometry: + entities = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; - gaiaExport32( p_out, rings, 1, endian_arch ); + gaiaExport32( p_out, entities, 1, endian_arch ); p_out += 4; - for ( ib = 0; ib < rings; ib++ ) + for ( ie = 0; ie < entities; ie++ ) { + p_in += 5; + *p_out++ = 0x01; + switch ( nDims ) + { + case GAIA_XY_Z_M: + gaiaExport32( p_out, GAIA_LINESTRINGZM, 1, endian_arch ); + break; + case GAIA_XY_Z: + gaiaExport32( p_out, GAIA_LINESTRINGZ, 1, endian_arch ); + break; + case GAIA_XY_M: + gaiaExport32( p_out, GAIA_LINESTRINGM, 1, endian_arch ); + break; + default: + gaiaExport32( p_out, GAIA_LINESTRING, 1, endian_arch ); + break; + } + p_out += 4; points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; gaiaExport32( p_out, points, 1, endian_arch ); @@ -2464,113 +2627,54 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB3D( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - p_in += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { + coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); p_out += sizeof( double ); } } } - } - break; - case GEOS_3D_GEOMETRYCOLLECTION: - entities = gaiaImport32( p_in, little_endian, endian_arch ); - p_in += 4; - gaiaExport32( p_out, entities, 1, endian_arch ); - p_out += 4; - for ( ie = 0; ie < entities; ie++ ) - { - int type2 = gaiaImport32( p_in + 1, little_endian, endian_arch ); - p_in += 5; - *p_out++ = 0x01; - switch ( type2 ) - { - case GEOS_3D_POINT: - switch ( nDims ) - { - case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_POINTZM, 1, endian_arch ); - break; - case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_POINTZ, 1, endian_arch ); - break; - case GAIA_XY_M: - gaiaExport32( p_out, GAIA_POINTM, 1, endian_arch ); - break; - default: - gaiaExport32( p_out, GAIA_POINT, 1, endian_arch ); - break; - } - break; - case GEOS_3D_LINESTRING: - switch ( nDims ) - { - case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_LINESTRINGZM, 1, endian_arch ); - break; - case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_LINESTRINGZ, 1, endian_arch ); - break; - case GAIA_XY_M: - gaiaExport32( p_out, GAIA_LINESTRINGM, 1, endian_arch ); - break; - default: - gaiaExport32( p_out, GAIA_LINESTRING, 1, endian_arch ); - break; - } - break; - case GEOS_3D_POLYGON: - switch ( nDims ) - { - case GAIA_XY_Z_M: - gaiaExport32( p_out, GAIA_POLYGONZM, 1, endian_arch ); - break; - case GAIA_XY_Z: - gaiaExport32( p_out, GAIA_POLYGONZ, 1, endian_arch ); - break; - case GAIA_XY_M: - gaiaExport32( p_out, GAIA_POLYGONM, 1, endian_arch ); - break; - default: - gaiaExport32( p_out, GAIA_POLYGON, 1, endian_arch ); - break; - } - break; - } + break; + case QgsWkbTypes::PolygonGeometry: + entities = gaiaImport32( p_in, little_endian, endian_arch ); + p_in += 4; + gaiaExport32( p_out, entities, 1, endian_arch ); p_out += 4; - switch ( type2 ) + for ( ie = 0; ie < entities; ie++ ) { - // setting sub-Geometry values - case GEOS_3D_POINT: - coord = gaiaImport64( p_in, little_endian, endian_arch ); - gaiaExport64( p_out, coord, 1, endian_arch ); // X - p_in += sizeof( double ); - p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - gaiaExport64( p_out, coord, 1, endian_arch ); // Y - p_in += sizeof( double ); - p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - p_in += sizeof( double ); - if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) - { - gaiaExport64( p_out, coord, 1, endian_arch ); // Z - p_out += sizeof( double ); - } - if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) - { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M - p_out += sizeof( double ); - } - break; - case GEOS_3D_LINESTRING: + p_in += 5; + *p_out++ = 0x01; + switch ( nDims ) + { + case GAIA_XY_Z_M: + gaiaExport32( p_out, GAIA_POLYGONZM, 1, endian_arch ); + break; + case GAIA_XY_Z: + gaiaExport32( p_out, GAIA_POLYGONZ, 1, endian_arch ); + break; + case GAIA_XY_M: + gaiaExport32( p_out, GAIA_POLYGONM, 1, endian_arch ); + break; + default: + gaiaExport32( p_out, GAIA_POLYGON, 1, endian_arch ); + break; + } + p_out += 4; + rings = gaiaImport32( p_in, little_endian, endian_arch ); + p_in += 4; + gaiaExport32( p_out, rings, 1, endian_arch ); + p_out += 4; + for ( ib = 0; ib < rings; ib++ ) + { points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; gaiaExport32( p_out, points, 1, endian_arch ); @@ -2585,59 +2689,25 @@ void QgsSpatiaLiteProvider::convertFromGeosWKB3D( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - p_in += sizeof( double ); if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) { + coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // Z + p_in += sizeof( double ); p_out += sizeof( double ); } if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) - { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M - p_out += sizeof( double ); - } - } - break; - case GEOS_3D_POLYGON: - rings = gaiaImport32( p_in, little_endian, endian_arch ); - p_in += 4; - gaiaExport32( p_out, rings, 1, endian_arch ); - p_out += 4; - for ( ib = 0; ib < rings; ib++ ) - { - points = gaiaImport32( p_in, little_endian, endian_arch ); - p_in += 4; - gaiaExport32( p_out, points, 1, endian_arch ); - p_out += 4; - for ( iv = 0; iv < points; iv++ ) { coord = gaiaImport64( p_in, little_endian, endian_arch ); - gaiaExport64( p_out, coord, 1, endian_arch ); // X - p_in += sizeof( double ); - p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - gaiaExport64( p_out, coord, 1, endian_arch ); // Y + gaiaExport64( p_out, coord, 1, endian_arch ); // M p_in += sizeof( double ); p_out += sizeof( double ); - coord = gaiaImport64( p_in, little_endian, endian_arch ); - p_in += sizeof( double ); - if ( nDims == GAIA_XY_Z || nDims == GAIA_XY_Z_M ) - { - gaiaExport64( p_out, coord, 1, endian_arch ); // Z - p_out += sizeof( double ); - } - if ( nDims == GAIA_XY_M || nDims == GAIA_XY_Z_M ) - { - gaiaExport64( p_out, 0.0, 1, endian_arch ); // M - p_out += sizeof( double ); - } } } - break; + } } - } - break; + break; + } } } @@ -2705,23 +2775,29 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, return; } -// we need creating a 3D GEOS WKB + // we need creating a 3D GEOS WKB p_in = blob + 5; switch ( type ) { // compunting the required size case GAIA_POINTZ: case GAIA_POINTM: - case GAIA_POINTZM: gsize += 3 * sizeof( double ); break; + case GAIA_POINTZM: + gsize += 4 * sizeof( double ); + break; case GAIA_LINESTRINGZ: case GAIA_LINESTRINGM: - case GAIA_LINESTRINGZM: points = gaiaImport32( p_in, little_endian, endian_arch ); gsize += 4; gsize += points * ( 3 * sizeof( double ) ); break; + case GAIA_LINESTRINGZM: + points = gaiaImport32( p_in, little_endian, endian_arch ); + gsize += 4; + gsize += points * ( 4 * sizeof( double ) ); + break; case GAIA_POLYGONZ: case GAIA_POLYGONM: rings = gaiaImport32( p_in, little_endian, endian_arch ); @@ -2745,7 +2821,7 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; gsize += 4; - gsize += points * ( 3 * sizeof( double ) ); + gsize += points * ( 4 * sizeof( double ) ); p_in += points * ( 4 * sizeof( double ) ); } break; @@ -2757,46 +2833,74 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, unsigned char *wkbGeom = new unsigned char[gsize]; memset( wkbGeom, '\0', gsize ); -// building GEOS 3D WKB + // building GEOS 3D WKB *wkbGeom = 0x01; // little endian byte order type = gaiaImport32( blob + 1, little_endian, endian_arch ); switch ( type ) { // setting Geometry TYPE case GAIA_POINTZ: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::Point25D, 1, endian_arch ); + break; case GAIA_POINTM: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::PointM, 1, endian_arch ); + break; case GAIA_POINTZM: - gaiaExport32( wkbGeom + 1, GEOS_3D_POINT, 1, endian_arch ); + gaiaExport32( wkbGeom + 1, QgsWkbTypes::PointZM, 1, endian_arch ); break; case GAIA_LINESTRINGZ: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::LineString25D, 1, endian_arch ); + break; case GAIA_LINESTRINGM: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::LineStringM, 1, endian_arch ); + break; case GAIA_LINESTRINGZM: - gaiaExport32( wkbGeom + 1, GEOS_3D_LINESTRING, 1, endian_arch ); + gaiaExport32( wkbGeom + 1, QgsWkbTypes::LineStringZM, 1, endian_arch ); break; case GAIA_POLYGONZ: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::Polygon25D, 1, endian_arch ); + break; case GAIA_POLYGONM: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::PolygonM, 1, endian_arch ); + break; case GAIA_POLYGONZM: - gaiaExport32( wkbGeom + 1, GEOS_3D_POLYGON, 1, endian_arch ); + gaiaExport32( wkbGeom + 1, QgsWkbTypes::PolygonZM, 1, endian_arch ); break; case GAIA_MULTIPOINTZ: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::MultiPoint25D, 1, endian_arch ); + break; case GAIA_MULTIPOINTM: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::MultiPointM, 1, endian_arch ); + break; case GAIA_MULTIPOINTZM: - gaiaExport32( wkbGeom + 1, GEOS_3D_MULTIPOINT, 1, endian_arch ); + gaiaExport32( wkbGeom + 1, QgsWkbTypes::MultiPointZM, 1, endian_arch ); break; case GAIA_MULTILINESTRINGZ: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::MultiLineString25D, 1, endian_arch ); + break; case GAIA_MULTILINESTRINGM: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::MultiLineStringM, 1, endian_arch ); + break; case GAIA_MULTILINESTRINGZM: - gaiaExport32( wkbGeom + 1, GEOS_3D_MULTILINESTRING, 1, endian_arch ); + gaiaExport32( wkbGeom + 1, QgsWkbTypes::MultiLineStringZM, 1, endian_arch ); break; case GAIA_MULTIPOLYGONZ: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::MultiPolygon25D, 1, endian_arch ); + break; case GAIA_MULTIPOLYGONM: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::MultiPolygonM, 1, endian_arch ); + break; case GAIA_MULTIPOLYGONZM: - gaiaExport32( wkbGeom + 1, GEOS_3D_MULTIPOLYGON, 1, endian_arch ); + gaiaExport32( wkbGeom + 1, QgsWkbTypes::MultiPolygonZM, 1, endian_arch ); break; case GAIA_GEOMETRYCOLLECTIONZ: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::GeometryCollectionZ, 1, endian_arch ); + break; case GAIA_GEOMETRYCOLLECTIONM: + gaiaExport32( wkbGeom + 1, QgsWkbTypes::GeometryCollectionM, 1, endian_arch ); + break; case GAIA_GEOMETRYCOLLECTIONZM: - gaiaExport32( wkbGeom + 1, GEOS_3D_GEOMETRYCOLLECTION, 1, endian_arch ); + gaiaExport32( wkbGeom + 1, QgsWkbTypes::GeometryCollectionZM, 1, endian_arch ); break; } p_in = blob + 5; @@ -2804,6 +2908,7 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, switch ( type ) { // setting Geometry values + case GAIA_POINTZ: case GAIA_POINTM: coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // X @@ -2813,11 +2918,11 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z or M p_in += sizeof( double ); p_out += sizeof( double ); break; - case GAIA_POINTZ: case GAIA_POINTZM: coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // X @@ -2831,9 +2936,12 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Z p_in += sizeof( double ); p_out += sizeof( double ); - if ( type == GAIA_POINTZM ) - p_in += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); break; + case GAIA_LINESTRINGZ: case GAIA_LINESTRINGM: points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -2849,12 +2957,12 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z or M p_in += sizeof( double ); p_out += sizeof( double ); } break; - case GAIA_LINESTRINGZ: case GAIA_LINESTRINGZM: points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -2874,10 +2982,13 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Z p_in += sizeof( double ); p_out += sizeof( double ); - if ( type == GAIA_LINESTRINGZM ) - p_in += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); } break; + case GAIA_POLYGONZ: case GAIA_POLYGONM: rings = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -2899,13 +3010,13 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z or M p_in += sizeof( double ); p_out += sizeof( double ); } } break; - case GAIA_POLYGONZ: case GAIA_POLYGONZM: rings = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -2931,11 +3042,14 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Z p_in += sizeof( double ); p_out += sizeof( double ); - if ( type == GAIA_POLYGONZM ) - p_in += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); } } break; + case GAIA_MULTIPOINTZ: case GAIA_MULTIPOINTM: entities = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -2945,7 +3059,7 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, { p_in += 5; *p_out++ = 0x01; - gaiaExport32( p_out, GEOS_3D_POINT, 1, endian_arch ); + gaiaExport32( p_out, type == GAIA_MULTIPOINTZ ? QgsWkbTypes::Point25D : QgsWkbTypes::PointM, 1, endian_arch ); p_out += 4; coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // X @@ -2955,12 +3069,12 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z or M p_in += sizeof( double ); p_out += sizeof( double ); } break; - case GAIA_MULTIPOINTZ: case GAIA_MULTIPOINTZM: entities = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -2970,7 +3084,7 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, { p_in += 5; *p_out++ = 0x01; - gaiaExport32( p_out, GEOS_3D_POINT, 1, endian_arch ); + gaiaExport32( p_out, QgsWkbTypes::PointZM, 1, endian_arch ); p_out += 4; coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // X @@ -2984,10 +3098,13 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Z p_in += sizeof( double ); p_out += sizeof( double ); - if ( type == GAIA_MULTIPOINTZM ) - p_in += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); } break; + case GAIA_MULTILINESTRINGZ: case GAIA_MULTILINESTRINGM: entities = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -2997,7 +3114,7 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, { p_in += 5; *p_out++ = 0x01; - gaiaExport32( p_out, GEOS_3D_LINESTRING, 1, endian_arch ); + gaiaExport32( p_out, type == GAIA_MULTILINESTRINGZ ? QgsWkbTypes::LineString25D : QgsWkbTypes::LineStringM, 1, endian_arch ); p_out += 4; points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3013,13 +3130,13 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z or M p_in += sizeof( double ); p_out += sizeof( double ); } } break; - case GAIA_MULTILINESTRINGZ: case GAIA_MULTILINESTRINGZM: entities = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3029,7 +3146,7 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, { p_in += 5; *p_out++ = 0x01; - gaiaExport32( p_out, GEOS_3D_LINESTRING, 1, endian_arch ); + gaiaExport32( p_out, QgsWkbTypes::LineStringZM, 1, endian_arch ); p_out += 4; points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3049,11 +3166,14 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Z p_in += sizeof( double ); p_out += sizeof( double ); - if ( type == GAIA_MULTILINESTRINGZM ) - p_in += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); } } break; + case GAIA_MULTIPOLYGONZ: case GAIA_MULTIPOLYGONM: entities = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3063,7 +3183,7 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, { p_in += 5; *p_out++ = 0x01; - gaiaExport32( p_out, GEOS_3D_POLYGON, 1, endian_arch ); + gaiaExport32( p_out, type == GAIA_MULTIPOLYGONZ ? QgsWkbTypes::Polygon25D : QgsWkbTypes::PolygonZM, 1, endian_arch ); p_out += 4; rings = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3085,14 +3205,14 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z or M p_in += sizeof( double ); p_out += sizeof( double ); } } } break; - case GAIA_MULTIPOLYGONZ: case GAIA_MULTIPOLYGONZM: entities = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3102,7 +3222,7 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, { p_in += 5; *p_out++ = 0x01; - gaiaExport32( p_out, GEOS_3D_POLYGON, 1, endian_arch ); + gaiaExport32( p_out, QgsWkbTypes::PolygonZM, 1, endian_arch ); p_out += 4; rings = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3128,8 +3248,10 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Z p_in += sizeof( double ); p_out += sizeof( double ); - if ( type == GAIA_MULTIPOLYGONZM ) - p_in += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); } } } @@ -3149,25 +3271,38 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, switch ( type2 ) { case GAIA_POINTZ: + gaiaExport32( p_out, QgsWkbTypes::Point25D, 1, endian_arch ); + break; case GAIA_POINTM: + gaiaExport32( p_out, QgsWkbTypes::PointM, 1, endian_arch ); + break; case GAIA_POINTZM: - gaiaExport32( p_out, GEOS_3D_POINT, 1, endian_arch ); + gaiaExport32( p_out, QgsWkbTypes::PointZM, 1, endian_arch ); break; case GAIA_LINESTRINGZ: + gaiaExport32( p_out, QgsWkbTypes::LineString25D, 1, endian_arch ); + break; case GAIA_LINESTRINGM: + gaiaExport32( p_out, QgsWkbTypes::LineStringM, 1, endian_arch ); + break; case GAIA_LINESTRINGZM: - gaiaExport32( p_out, GEOS_3D_LINESTRING, 1, endian_arch ); + gaiaExport32( p_out, QgsWkbTypes::LineStringZM, 1, endian_arch ); break; case GAIA_POLYGONZ: + gaiaExport32( p_out, QgsWkbTypes::Polygon25D, 1, endian_arch ); + break; case GAIA_POLYGONM: + gaiaExport32( p_out, QgsWkbTypes::PolygonM, 1, endian_arch ); + break; case GAIA_POLYGONZM: - gaiaExport32( p_out, GEOS_3D_POLYGON, 1, endian_arch ); + gaiaExport32( p_out, QgsWkbTypes::PolygonZM, 1, endian_arch ); break; } p_out += 4; switch ( type2 ) { // setting sub-Geometry values + case GAIA_POINTZ: case GAIA_POINTM: coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // X @@ -3177,11 +3312,11 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z or M p_in += sizeof( double ); p_out += sizeof( double ); break; - case GAIA_POINTZ: case GAIA_POINTZM: coord = gaiaImport64( p_in, little_endian, endian_arch ); gaiaExport64( p_out, coord, 1, endian_arch ); // X @@ -3195,9 +3330,12 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Z p_in += sizeof( double ); p_out += sizeof( double ); - if ( type2 == GAIA_POINTZM ) - p_in += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); break; + case GAIA_LINESTRINGZ: case GAIA_LINESTRINGM: points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3213,12 +3351,12 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z or M p_in += sizeof( double ); p_out += sizeof( double ); } break; - case GAIA_LINESTRINGZ: case GAIA_LINESTRINGZM: points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3238,10 +3376,13 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Z p_in += sizeof( double ); p_out += sizeof( double ); - if ( type2 == GAIA_LINESTRINGZM ) - p_in += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); } break; + case GAIA_POLYGONZ: case GAIA_POLYGONM: rings = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3263,13 +3404,13 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Y p_in += sizeof( double ); p_out += sizeof( double ); - gaiaExport64( p_out, 0.0, 1, endian_arch ); // Z + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // Z or M p_in += sizeof( double ); p_out += sizeof( double ); } } break; - case GAIA_POLYGONZ: case GAIA_POLYGONZM: rings = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; @@ -3295,8 +3436,10 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, gaiaExport64( p_out, coord, 1, endian_arch ); // Z p_in += sizeof( double ); p_out += sizeof( double ); - if ( type2 == GAIA_POLYGONZM ) - p_in += sizeof( double ); + coord = gaiaImport64( p_in, little_endian, endian_arch ); + gaiaExport64( p_out, coord, 1, endian_arch ); // M + p_in += sizeof( double ); + p_out += sizeof( double ); } } break; @@ -3311,7 +3454,7 @@ void QgsSpatiaLiteProvider::convertToGeosWKB( const unsigned char *blob, int QgsSpatiaLiteProvider::computeMultiWKB3Dsize( const unsigned char *p_in, int little_endian, int endian_arch ) { -// computing the required size to store a GEOS 3D MultiXX + // computing the required size to store a GEOS 3D MultiXX int entities; int type; int rings; @@ -3337,7 +3480,7 @@ int QgsSpatiaLiteProvider::computeMultiWKB3Dsize( const unsigned char *p_in, int p_in += 3 * sizeof( double ); break; case GAIA_POINTZM: - size += 3 * sizeof( double ); + size += 4 * sizeof( double ); p_in += 4 * sizeof( double ); break; case GAIA_LINESTRINGZ: @@ -3352,7 +3495,7 @@ int QgsSpatiaLiteProvider::computeMultiWKB3Dsize( const unsigned char *p_in, int points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; size += 4; - size += points * ( 3 * sizeof( double ) ); + size += points * ( 4 * sizeof( double ) ); p_in += points * ( 4 * sizeof( double ) ); break; case GAIA_POLYGONZ: @@ -3378,7 +3521,7 @@ int QgsSpatiaLiteProvider::computeMultiWKB3Dsize( const unsigned char *p_in, int points = gaiaImport32( p_in, little_endian, endian_arch ); p_in += 4; size += 4; - size += points * ( 3 * sizeof( double ) ); + size += points * ( 4 * sizeof( double ) ); p_in += points * ( 4 * sizeof( double ) ); } break; @@ -4660,12 +4803,15 @@ bool QgsSpatiaLiteProvider::getGeometryDetailsAbstractInterface( gaiaVectorLayer break; case GAIA_XY_Z: nDims = GAIA_XY_Z; + mGeomType = QgsWkbTypes::addZ( mGeomType ); break; case GAIA_XY_M: nDims = GAIA_XY_M; + mGeomType = QgsWkbTypes::addM( mGeomType ); break; case GAIA_XY_Z_M: nDims = GAIA_XY_Z_M; + mGeomType = QgsWkbTypes::zmType( mGeomType, true, true ); break; } @@ -4803,14 +4949,17 @@ bool QgsSpatiaLiteProvider::getTableGeometryDetails() else if ( dims == QLatin1String( "XYZ" ) || dims == QLatin1String( "3" ) ) { nDims = GAIA_XY_Z; + mGeomType = QgsWkbTypes::addZ( mGeomType ); } else if ( dims == QLatin1String( "XYM" ) ) { nDims = GAIA_XY_M; + mGeomType = QgsWkbTypes::addM( mGeomType ); } else if ( dims == QLatin1String( "XYZM" ) ) { nDims = GAIA_XY_Z_M; + mGeomType = QgsWkbTypes::zmType( mGeomType, true, true ); } } diff --git a/src/providers/spatialite/qgsspatialiteprovider.h b/src/providers/spatialite/qgsspatialiteprovider.h index 738d4455e7ef..3ba029145871 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.h +++ b/src/providers/spatialite/qgsspatialiteprovider.h @@ -29,6 +29,8 @@ extern "C" #include "qgsrectangle.h" #include "qgsvectorlayerexporter.h" #include "qgsfields.h" +#include "qgswkbtypes.h" + #include #include #include @@ -356,7 +358,7 @@ class QgsSpatiaLiteProvider: public QgsVectorDataProvider unsigned char **wkb, int *geom_size, int dims ); int computeSizeFromGeosWKB3D( const unsigned char *blob, int size, - int type, int nDims, int little_endian, + QgsWkbTypes::Type type, int nDims, int little_endian, int endian_arch ); int computeSizeFromGeosWKB2D( const unsigned char *blob, int size, int type, int nDims, int little_endian, @@ -366,17 +368,6 @@ class QgsSpatiaLiteProvider: public QgsVectorDataProvider void insertDefaultValue( int fieldIndex, QString defaultVal ); - enum GEOS_3D - { - GEOS_3D_POINT = -2147483647, - GEOS_3D_LINESTRING = -2147483646, - GEOS_3D_POLYGON = -2147483645, - GEOS_3D_MULTIPOINT = -2147483644, - GEOS_3D_MULTILINESTRING = -2147483643, - GEOS_3D_MULTIPOLYGON = -2147483642, - GEOS_3D_GEOMETRYCOLLECTION = -2147483641, - }; - /** * Handles an error encountered while executing an sql statement. */ diff --git a/src/ui/qgsnewspatialitelayerdialogbase.ui b/src/ui/qgsnewspatialitelayerdialogbase.ui index a69d7812064a..0a86911e6441 100644 --- a/src/ui/qgsnewspatialitelayerdialogbase.ui +++ b/src/ui/qgsnewspatialitelayerdialogbase.ui @@ -6,7 +6,7 @@ 0 0 - 450 + 490 627 @@ -142,6 +142,24 @@ + + + + + Include Z dimension + + + + + + + Include M values + + + + + + @@ -175,7 +193,7 @@ - + New field @@ -265,7 +283,7 @@ - + Fields list @@ -339,7 +357,7 @@ - + Advanced options