/*************************************************************************** qgsshapefileprovider.h - Data provider for ESRI shapefile format ------------------- begin : Oct 29, 2003 copyright : (C) 2003 by Gary E.Sherman email : sherman at mrcc.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. * * * ***************************************************************************/ /* $Id$ */ #include "../../src/qgsdataprovider.h" class QgsFeature; class QgsField; class OGRDataSource; class OGRLayer; /** \class QgsShapeFileProvider \brief Data provider for ESRI shapefiles */ class QgsShapeFileProvider:public QgsDataProvider { public: QgsShapeFileProvider(QString uri = 0); virtual ~ QgsShapeFileProvider(); /** * Get the first feature resutling from a select operation * @return QgsFeature */ QgsFeature *getFirstFeature(bool fetchAttributes = false); /** * Get the next feature resutling from a select operation * @return QgsFeature */ QgsFeature *getNextFeature(bool fetchAttributes = false); /** * Get the next feature resutling from a select operation * @return True if the feature was read. This does not indicate * that the feature is valid. Use QgsFeature::isValid() to check * the validity of a feature before using it. */ bool getNextFeature(QgsFeature &feature, bool fetchAttributes = false); /** Get the feature type. This corresponds to WKBPoint, WKBLineString, WKBPolygon, WKBMultiPoint, WKBMultiLineString or WKBMultiPolygon * as defined in qgis.h */ int geometryType(); /** * Get the number of features in the layer */ long featureCount(); /** * Get the number of fields in the layer */ int fieldCount(); /** * Select features based on a bounding rectangle. Features can be retrieved * with calls to getFirstFeature and getNextFeature. * @param mbr QgsRect containing the extent to use in selecting features */ void select(QgsRect * mbr, bool useIntersect = false); /** * Set the data source specification. This may be a path or database * connection string * @uri data source specification */ void setDataSourceUri(QString uri); /** * Get the data source specification. This may be a path or database * connection string * @return data source specification */ QString getDataSourceUri(); /** * Identify features within the search radius specified by rect * @param rect Bounding rectangle of search radius * @return std::vector containing QgsFeature objects that intersect rect */ virtual std::vector < QgsFeature > &identify(QgsRect * rect); /** Return endian-ness for this layer */ int endian(); /** Return the extent for this data layer */ virtual QgsRect *extent(); /** * Get the attributes associated with a feature */ void getFeatureAttributes(OGRFeature * ogrFet, QgsFeature * f); /** * Get the field information for the layer */ std::vector < QgsField > &fields(); /* Reset the layer - for an OGRLayer, this means clearing the * spatial filter and calling ResetReading */ void reset(); /**Returns the minimum value of an attribut @param position the number of the attribute*/ QString minValue(int position); /**Returns the maximum value of an attribut @param position the number of the attribute*/ QString maxValue(int position); /**Returns true if this is a valid shapefile */ bool isValid(); private: unsigned char *getGeometryPointer(OGRFeature * fet); std::vector < QgsField > attributeFields; QString dataSourceUri; OGRDataSource *ogrDataSource; OGREnvelope *extent_; OGRLayer *ogrLayer; bool valid; int geomType; long numberFeatures; enum ENDIAN { NDR = 1, XDR = 0 }; /**Flag indicating, if the minmaxcache should be renewed (true) or not (false)*/ bool minmaxcachedirty; /**Matrix storing the minimum and maximum values*/ double **minmaxcache; /**Fills the cash and sets minmaxcachedirty to false*/ void fillMinMaxCash(); };