mirror of
https://github.com/qgis/QGIS.git
synced 2025-12-30 00:29:39 -05:00
424 lines
14 KiB
C++
424 lines
14 KiB
C++
/***************************************************************************
|
|
qgsogrutils.h
|
|
-------------
|
|
begin : February 2016
|
|
copyright : (C) 2016 Nyall Dawson
|
|
email : nyall dot dawson at gmail dot com
|
|
***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#ifndef QGSOGRUTILS_H
|
|
#define QGSOGRUTILS_H
|
|
|
|
#define SIP_NO_FILE
|
|
|
|
#include "qgis_core.h"
|
|
#include "qgsfeature.h"
|
|
|
|
#include <ogr_api.h>
|
|
#include <gdal.h>
|
|
#include <gdalwarper.h>
|
|
#include "cpl_conv.h"
|
|
#include "cpl_string.h"
|
|
|
|
class QgsCoordinateReferenceSystem;
|
|
class QgsFieldDomain;
|
|
|
|
class QTextCodec;
|
|
|
|
namespace gdal
|
|
{
|
|
|
|
/**
|
|
* Destroys OGR data sources.
|
|
*/
|
|
struct OGRDataSourceDeleter
|
|
{
|
|
|
|
/**
|
|
* Destroys an OGR data \a source, using the correct gdal calls.
|
|
*/
|
|
void CORE_EXPORT operator()( OGRDataSourceH source );
|
|
|
|
};
|
|
|
|
/**
|
|
* Destroys OGR geometries.
|
|
*/
|
|
struct OGRGeometryDeleter
|
|
{
|
|
|
|
/**
|
|
* Destroys an OGR \a geometry, using the correct gdal calls.
|
|
*/
|
|
void CORE_EXPORT operator()( OGRGeometryH geometry );
|
|
|
|
};
|
|
|
|
/**
|
|
* Destroys OGR field definition.
|
|
*/
|
|
struct OGRFldDeleter
|
|
{
|
|
|
|
/**
|
|
* Destroys an OGR field \a definition, using the correct gdal calls.
|
|
*/
|
|
void CORE_EXPORT operator()( OGRFieldDefnH definition );
|
|
|
|
};
|
|
|
|
/**
|
|
* Destroys OGR feature.
|
|
*/
|
|
struct OGRFeatureDeleter
|
|
{
|
|
|
|
/**
|
|
* Destroys an OGR \a feature, using the correct gdal calls.
|
|
*/
|
|
void CORE_EXPORT operator()( OGRFeatureH feature );
|
|
|
|
};
|
|
|
|
/**
|
|
* Closes and cleanups GDAL dataset.
|
|
*/
|
|
struct GDALDatasetCloser
|
|
{
|
|
|
|
/**
|
|
* Destroys an gdal \a dataset, using the correct gdal calls.
|
|
*/
|
|
void CORE_EXPORT operator()( GDALDatasetH datasource );
|
|
|
|
};
|
|
|
|
/**
|
|
* Closes and cleanups GDAL warp options.
|
|
*/
|
|
struct GDALWarpOptionsDeleter
|
|
{
|
|
|
|
/**
|
|
* Destroys GDAL warp \a options, using the correct gdal calls.
|
|
*/
|
|
void CORE_EXPORT operator()( GDALWarpOptions *options );
|
|
|
|
};
|
|
|
|
/**
|
|
* Scoped OGR data source.
|
|
*/
|
|
using ogr_datasource_unique_ptr = std::unique_ptr< std::remove_pointer<OGRDataSourceH>::type, OGRDataSourceDeleter >;
|
|
|
|
/**
|
|
* Scoped OGR geometry.
|
|
*/
|
|
using ogr_geometry_unique_ptr = std::unique_ptr< std::remove_pointer<OGRGeometryH>::type, OGRGeometryDeleter >;
|
|
|
|
/**
|
|
* Scoped OGR field definition.
|
|
*/
|
|
using ogr_field_def_unique_ptr = std::unique_ptr< std::remove_pointer<OGRFieldDefnH>::type, OGRFldDeleter >;
|
|
|
|
/**
|
|
* Scoped OGR feature.
|
|
*/
|
|
using ogr_feature_unique_ptr = std::unique_ptr< std::remove_pointer<OGRFeatureH>::type, OGRFeatureDeleter >;
|
|
|
|
/**
|
|
* Scoped GDAL dataset.
|
|
*/
|
|
using dataset_unique_ptr = std::unique_ptr< std::remove_pointer<GDALDatasetH>::type, GDALDatasetCloser >;
|
|
|
|
/**
|
|
* Performs a fast close of an unwanted GDAL dataset handle by deleting the underlying
|
|
* data store. Use when the resultant dataset is no longer required, e.g. as a result
|
|
* of user cancellation of an operation.
|
|
*
|
|
* Requires a gdal \a dataset pointer, the corresponding gdal \a driver and underlying
|
|
* dataset file \a path.
|
|
*/
|
|
void CORE_EXPORT fast_delete_and_close( dataset_unique_ptr &dataset, GDALDriverH driver, const QString &path );
|
|
|
|
/**
|
|
* Scoped GDAL warp options.
|
|
*/
|
|
using warp_options_unique_ptr = std::unique_ptr< GDALWarpOptions, GDALWarpOptionsDeleter >;
|
|
}
|
|
|
|
/**
|
|
* \ingroup core
|
|
* \class QgsOgrUtils
|
|
* \brief Utilities for working with OGR features and layers
|
|
*
|
|
* Contains helper utilities for assisting work with both OGR features and layers.
|
|
* \note not available in Python bindings
|
|
* \since QGIS 2.16
|
|
*/
|
|
class CORE_EXPORT QgsOgrUtils
|
|
{
|
|
public:
|
|
|
|
/**
|
|
* Converts an OGRField \a value of the specified \a type into a QVariant.
|
|
* \since QGIS 3.20
|
|
*/
|
|
static QVariant OGRFieldtoVariant( const OGRField *value, OGRFieldType type );
|
|
|
|
/**
|
|
* Converts a QVariant to an OGRField value.
|
|
*
|
|
* \since QGIS 3.26
|
|
*/
|
|
static std::unique_ptr<OGRField> variantToOGRField( const QVariant &value );
|
|
|
|
/**
|
|
* Reads an OGR feature and converts it to a QgsFeature.
|
|
* \param ogrFet OGR feature handle
|
|
* \param fields fields collection corresponding to feature
|
|
* \param encoding text encoding
|
|
* \returns valid feature if read was successful
|
|
*/
|
|
static QgsFeature readOgrFeature( OGRFeatureH ogrFet, const QgsFields &fields, QTextCodec *encoding );
|
|
|
|
/**
|
|
* Reads an OGR feature and returns a corresponding fields collection.
|
|
* \param ogrFet OGR feature handle
|
|
* \param encoding text encoding
|
|
* \returns fields collection if read was successful
|
|
*/
|
|
static QgsFields readOgrFields( OGRFeatureH ogrFet, QTextCodec *encoding );
|
|
|
|
/**
|
|
* Retrieves an attribute value from an OGR feature.
|
|
* \param ogrFet OGR feature handle
|
|
* \param fields fields collection corresponding to feature
|
|
* \param attIndex index of attribute to retrieve
|
|
* \param encoding text encoding
|
|
* \param ok optional storage for success of retrieval
|
|
* \returns attribute converted to a QVariant object
|
|
* \see readOgrFeatureAttributes()
|
|
*/
|
|
static QVariant getOgrFeatureAttribute( OGRFeatureH ogrFet, const QgsFields &fields, int attIndex, QTextCodec *encoding, bool *ok = nullptr );
|
|
|
|
/**
|
|
* Retrieves an attribute value from an OGR feature, using a provided \a field definition.
|
|
* \param ogrFet OGR feature handle
|
|
* \param field definition of corresponding field
|
|
* \param attIndex index of attribute to retrieve from \a ogrFet
|
|
* \param encoding text encoding
|
|
* \param ok optional storage for success of retrieval
|
|
* \returns attribute converted to a QVariant object
|
|
* \see readOgrFeatureAttributes()
|
|
*
|
|
* \since QGIS 3.10.1
|
|
*/
|
|
static QVariant getOgrFeatureAttribute( OGRFeatureH ogrFet, const QgsField &field, int attIndex, QTextCodec *encoding, bool *ok = nullptr );
|
|
|
|
/**
|
|
* Reads all attributes from an OGR feature into a QgsFeature.
|
|
* \param ogrFet OGR feature handle
|
|
* \param fields fields collection corresponding to feature
|
|
* \param feature QgsFeature to store attributes in
|
|
* \param encoding text encoding
|
|
* \returns TRUE if attribute read was successful
|
|
* \see getOgrFeatureAttribute()
|
|
*/
|
|
static bool readOgrFeatureAttributes( OGRFeatureH ogrFet, const QgsFields &fields, QgsFeature &feature, QTextCodec *encoding );
|
|
|
|
/**
|
|
* Reads the geometry from an OGR feature into a QgsFeature.
|
|
* \param ogrFet OGR feature handle
|
|
* \param feature QgsFeature to store geometry in
|
|
* \returns TRUE if geometry read was successful
|
|
* \see readOgrFeatureAttributes()
|
|
* \see ogrGeometryToQgsGeometry()
|
|
*/
|
|
static bool readOgrFeatureGeometry( OGRFeatureH ogrFet, QgsFeature &feature );
|
|
|
|
/**
|
|
* Converts an OGR geometry representation to a QgsGeometry object
|
|
* \param geom OGR geometry handle
|
|
* \returns QgsGeometry object. If conversion was not successful the geometry
|
|
* will be empty.
|
|
* \see readOgrFeatureGeometry()
|
|
*/
|
|
static QgsGeometry ogrGeometryToQgsGeometry( OGRGeometryH geom );
|
|
|
|
/**
|
|
* Attempts to parse a string representing a collection of features using OGR. For example, this method can be
|
|
* used to convert a GeoJSON encoded collection to a list of QgsFeatures.
|
|
* \param string string to parse
|
|
* \param fields fields collection to use for parsed features (\see stringToFields())
|
|
* \param encoding text encoding
|
|
* \returns list of parsed features, or an empty list if no features could be parsed
|
|
* \see stringToFields()
|
|
*/
|
|
static QgsFeatureList stringToFeatureList( const QString &string, const QgsFields &fields, QTextCodec *encoding );
|
|
|
|
/**
|
|
* Attempts to retrieve the fields from a string representing a collection of features using OGR.
|
|
* \param string string to parse
|
|
* \param encoding text encoding
|
|
* \returns retrieved fields collection, or an empty list if no fields could be determined from the string
|
|
* \see stringToFeatureList()
|
|
*/
|
|
static QgsFields stringToFields( const QString &string, QTextCodec *encoding );
|
|
|
|
/**
|
|
* Converts a c string list to a QStringList. Presumes a null terminated string list.
|
|
*
|
|
* \since QGIS 3.2
|
|
*/
|
|
static QStringList cStringListToQStringList( char **stringList );
|
|
|
|
/**
|
|
* Converts a OGRwkbGeometryType to QgsWkbTypes::Type
|
|
*
|
|
* \since QGIS 3.4.9
|
|
*/
|
|
static QgsWkbTypes::Type ogrGeometryTypeToQgsWkbType( OGRwkbGeometryType ogrGeomType );
|
|
|
|
/**
|
|
* Returns a WKT string corresponding to the specified OGR \a srs object.
|
|
*
|
|
* The WKT string format will be selected using the most appropriate format (usually WKT2 if GDAL 3 is available).
|
|
*
|
|
* \since QGIS 3.10.1
|
|
*/
|
|
static QString OGRSpatialReferenceToWkt( OGRSpatialReferenceH srs );
|
|
|
|
/**
|
|
* Returns a QgsCoordinateReferenceSystem corresponding to the specified OGR \a srs object, or an invalid
|
|
* QgsCoordinateReferenceSystem if \a srs could not be converted.
|
|
*
|
|
* \since QGIS 3.10.1
|
|
*/
|
|
static QgsCoordinateReferenceSystem OGRSpatialReferenceToCrs( OGRSpatialReferenceH srs );
|
|
|
|
/**
|
|
* Returns a OGRSpatialReferenceH corresponding to the specified \a crs object.
|
|
*
|
|
* \note Caller must release the returned object with OSRRelease.
|
|
*
|
|
* \since QGIS 3.22
|
|
*/
|
|
static OGRSpatialReferenceH crsToOGRSpatialReference( const QgsCoordinateReferenceSystem &crs );
|
|
|
|
/**
|
|
* Reads the encoding of the shapefile at the specified \a path (where \a path is the
|
|
* location of the ".shp" file).
|
|
*
|
|
* This method considers both the CPG specified encoding and the DBF LDID encoding
|
|
* (priority goes to CPG based encoding)
|
|
*
|
|
* \see readShapefileEncodingFromCpg()
|
|
* \see readShapefileEncodingFromLdid()
|
|
* \since QGIS 3.12
|
|
*/
|
|
static QString readShapefileEncoding( const QString &path );
|
|
|
|
/**
|
|
* Reads the encoding of the shapefile at the specified \a path (where \a path is the
|
|
* location of the ".shp" file), from the CPG specified encoding.
|
|
*
|
|
* Return an empty string if CPG based encoding was not found.
|
|
*
|
|
* \see readShapefileEncoding()
|
|
* \since QGIS 3.12
|
|
*/
|
|
static QString readShapefileEncodingFromCpg( const QString &path );
|
|
|
|
/**
|
|
* Reads the encoding of the shapefile at the specified \a path (where \a path is the
|
|
* location of the ".shp" file), from the DBF LDID encoding.
|
|
*
|
|
* Return an empty string if LDID based encoding was not found.
|
|
*
|
|
* \see readShapefileEncoding()
|
|
* \since QGIS 3.12
|
|
*/
|
|
static QString readShapefileEncodingFromLdid( const QString &path );
|
|
|
|
/**
|
|
* Parses an OGR style \a string to a variant map containing the style string components.
|
|
*
|
|
* \since QGIS 3.20
|
|
*/
|
|
static QVariantMap parseStyleString( const QString &string );
|
|
|
|
/**
|
|
* Creates a new QgsSymbol matching an OGR style \a string.
|
|
*
|
|
* \since QGIS 3.20
|
|
*/
|
|
static std::unique_ptr< QgsSymbol > symbolFromStyleString( const QString &string, Qgis::SymbolType type ) SIP_FACTORY;
|
|
|
|
/**
|
|
* Converts an OGR field type and sub type to the best matching QVariant::Type equivalent.
|
|
*
|
|
* \param ogrType OGR field type
|
|
* \param ogrSubType OGR field sub type
|
|
* \param variantType will be set to matching QVariant type
|
|
* \param variantSubType will be set to matching QVariant sub type, for list, map and other complex OGR field types.
|
|
*
|
|
* \note Not available in Python bindings
|
|
* \since QGIS 3.26
|
|
*/
|
|
static void ogrFieldTypeToQVariantType( OGRFieldType ogrType, OGRFieldSubType ogrSubType, QVariant::Type &variantType, QVariant::Type &variantSubType ) SIP_SKIP;
|
|
|
|
/**
|
|
* Converts an QVariant type to the best matching OGR field type and sub type.
|
|
*
|
|
* \param variant QVariant field type
|
|
* \param ogrType will be set to matching OGR type
|
|
* \param ogrSubType will be set to matching OGR sub type
|
|
*
|
|
* \note Not available in Python bindings
|
|
* \since QGIS 3.26
|
|
*/
|
|
static void variantTypeToOgrFieldType( QVariant::Type variantType, OGRFieldType &ogrType, OGRFieldSubType &ogrSubType ) SIP_SKIP;
|
|
|
|
/**
|
|
* Converts a string to a variant, using the provider OGR field \a type and \a subType to determine the most appropriate
|
|
* variant type.
|
|
*
|
|
* \note Not available in Python bindings
|
|
* \since QGIS 3.26
|
|
*/
|
|
static QVariant stringToVariant( OGRFieldType type, OGRFieldSubType subType, const QString &string ) SIP_SKIP;
|
|
|
|
#ifndef SIP_RUN
|
|
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,3,0)
|
|
|
|
/**
|
|
* Converts an OGR field domain definition to a QgsFieldDomain equivalent.
|
|
*
|
|
* \note Requires GDAL >= 3.3
|
|
* \note Not available in Python bindings
|
|
* \since QGIS 3.26
|
|
*/
|
|
static std::unique_ptr< QgsFieldDomain > convertFieldDomain( OGRFieldDomainH domain );
|
|
|
|
/**
|
|
* Converts a QGIS field domain definition to an OGR field domain equivalent.
|
|
*
|
|
* \note Requires GDAL >= 3.3
|
|
* \note Not available in Python bindings
|
|
* \since QGIS 3.26
|
|
*/
|
|
static OGRFieldDomainH convertFieldDomain( const QgsFieldDomain *domain );
|
|
#endif
|
|
#endif
|
|
};
|
|
|
|
#endif // QGSOGRUTILS_H
|