Quantum GIS API Documentation  1.8
src/core/qgsvectorlayer.h
Go to the documentation of this file.
00001 /***************************************************************************
00002                           qgsvectorlayer.h  -  description
00003                              -------------------
00004     begin                : Oct 29, 2003
00005     copyright            : (C) 2003 by Gary E.Sherman
00006     email                : sherman at mrcc.com
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 #ifndef QGSVECTORLAYER_H
00019 #define QGSVECTORLAYER_H
00020 
00021 #include <QMap>
00022 #include <QSet>
00023 #include <QList>
00024 #include <QStringList>
00025 
00026 #include "qgis.h"
00027 #include "qgsmaplayer.h"
00028 #include "qgsfeature.h"
00029 #include "qgssnapper.h"
00030 #include "qgsfield.h"
00031 
00032 class QPainter;
00033 class QImage;
00034 
00035 class QgsAttributeAction;
00036 class QgsCoordinateTransform;
00037 class QgsGeometry;
00038 class QgsGeometryVertexIndex;
00039 class QgsMapToPixel;
00040 class QgsLabel;
00041 class QgsRectangle;
00042 class QgsRenderer;
00043 class QgsUndoCommand;
00044 class QgsVectorDataProvider;
00045 class QgsVectorOverlay;
00046 class QgsSingleSymbolRendererV2;
00047 class QgsRectangle;
00048 class QgsVectorLayerJoinBuffer;
00049 class QgsFeatureRendererV2;
00050 class QgsDiagramRendererV2;
00051 struct QgsDiagramLayerSettings;
00052 
00053 typedef QList<int> QgsAttributeList;
00054 typedef QSet<int> QgsAttributeIds;
00055 
00057 struct CORE_EXPORT QgsVectorJoinInfo
00058 {
00060   int targetField;
00062   QString joinLayerId;
00064   int joinField;
00066   bool memoryCache;
00068   QHash< QString, QgsAttributeMap> cachedAttributes;
00069 };
00070 
00075 struct CORE_EXPORT QgsFetchJoinInfo
00076 {
00077   const QgsVectorJoinInfo* joinInfo;
00078   QgsAttributeList attributes; //attributes to fetch
00079   int indexOffset; //index offset between this layer and join layer
00080 };
00081 
00085 class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
00086 {
00087     Q_OBJECT
00088 
00089   public:
00090     enum EditType
00091     {
00092       LineEdit,
00093       UniqueValues,
00094       UniqueValuesEditable,
00095       ValueMap,
00096       Classification,
00097       EditRange,
00098       SliderRange,
00099       CheckBox,      /* added in 1.4 */
00100       FileName,
00101       Enumeration,
00102       Immutable,     /* The attribute value should not be changed in the attribute form*/
00103       Hidden,        /* The attribute value should not be shown in the attribute form @added in 1.4 */
00104       TextEdit,      /* multiline edit @added in 1.4*/
00105       Calendar,      /* calendar widget @added in 1.5 */
00106       DialRange,     /* dial range @added in 1.5 */
00107       ValueRelation, /* value map from an table @added in 1.8 */
00108       UuidGenerator, /* uuid generator - readonly and automatically intialized @added in 1.9 */
00109     };
00110 
00111     struct RangeData
00112     {
00113       RangeData() {}
00114       RangeData( QVariant theMin, QVariant theMax, QVariant theStep )
00115           : mMin( theMin ), mMax( theMax ), mStep( theStep ) {}
00116 
00117       QVariant mMin;
00118       QVariant mMax;
00119       QVariant mStep;
00120     };
00121 
00122     struct ValueRelationData
00123     {
00124       ValueRelationData() {}
00125       ValueRelationData( QString layer, QString key, QString value, bool allowNull, bool orderByValue )
00126           : mLayer( layer ), mKey( key ), mValue( value ), mAllowNull( allowNull ), mOrderByValue( orderByValue ) {}
00127 
00128       QString mLayer;
00129       QString mKey;
00130       QString mValue;
00131       bool mAllowNull;
00132       bool mOrderByValue;
00133     };
00134 
00136     QgsVectorLayer( QString path = QString::null, QString baseName = QString::null,
00137                     QString providerLib = QString::null, bool loadDefaultStyleFlag = true );
00138 
00140     virtual ~QgsVectorLayer();
00141 
00143     QString storageType() const;
00144 
00146     QString capabilitiesString() const;
00147 
00149     QString dataComment() const;
00150 
00152     void setDisplayField( QString fldName = "" );
00153 
00155     const QString displayField() const;
00156 
00158     QgsVectorDataProvider* dataProvider();
00159 
00161     const QgsVectorDataProvider* dataProvider() const;
00162 
00164     void setProviderEncoding( const QString& encoding );
00165 
00167     void setCoordinateSystem();
00168 
00172     void addJoin( QgsVectorJoinInfo joinInfo );
00173 
00176     void removeJoin( const QString& joinLayerId );
00177 
00179     const QList< QgsVectorJoinInfo >& vectorJoins() const;
00180 
00182     QgsLabel *label();
00183 
00184     const QgsLabel *label() const;
00185 
00186     QgsAttributeAction* actions() { return mActions; }
00187 
00189     int selectedFeatureCount();
00190 
00192     void select( QgsRectangle & rect, bool lock );
00193 
00195     void invertSelection();
00196 
00198     void invertSelectionInRectangle( QgsRectangle & rect );
00199 
00201     QgsFeatureList selectedFeatures();
00202 
00204     const QgsFeatureIds& selectedFeaturesIds() const;
00205 
00207     void setSelectedFeatures( const QgsFeatureIds& ids );
00208 
00210     QgsRectangle boundingBoxOfSelected();
00211 
00213     bool copySymbologySettings( const QgsMapLayer& other );
00214 
00216     bool hasCompatibleSymbology( const QgsMapLayer& other ) const;
00217 
00219     const QgsRenderer* renderer() const;
00220 
00222     void setRenderer( QgsRenderer * r );
00223 
00225     void setDiagramRenderer( QgsDiagramRendererV2* r );
00226     const QgsDiagramRendererV2* diagramRenderer() const { return mDiagramRenderer; }
00227 
00228     void setDiagramLayerSettings( const QgsDiagramLayerSettings& s );
00229     const QgsDiagramLayerSettings *diagramLayerSettings() const { return mDiagramLayerSettings; }
00230 
00233     QgsFeatureRendererV2* rendererV2();
00237     void setRendererV2( QgsFeatureRendererV2* r );
00241     bool isUsingRendererV2();
00245     void setUsingRendererV2( bool usingRendererV2 );
00246 
00250     void drawRendererV2( QgsRenderContext& rendererContext, bool labeling );
00251 
00255     void drawRendererV2Levels( QgsRenderContext& rendererContext, bool labeling );
00256 
00258     QGis::GeometryType geometryType() const;
00259 
00262     bool hasGeometryType() const;
00263 
00265     QGis::WkbType wkbType() const;
00266 
00268     QString providerType() const;
00269 
00273     virtual bool readXml( const QDomNode& layer_node );
00274 
00278     virtual bool writeXml( QDomNode & layer_node, QDomDocument & doc );
00279 
00285     bool readSymbology( const QDomNode& node, QString& errorMessage );
00286 
00293     bool writeSymbology( QDomNode& node, QDomDocument& doc, QString& errorMessage ) const;
00294 
00295     bool writeSld( QDomNode& node, QDomDocument& doc, QString& errorMessage ) const;
00296     bool readSld( const QDomNode& node, QString& errorMessage );
00297 
00305     virtual long featureCount() const;
00306 
00310     virtual long updateFeatureCount() const;
00311 
00319     virtual bool setSubsetString( QString subset );
00320 
00325     virtual QString subsetString();
00326 
00334     void select( QgsAttributeList fetchAttributes,
00335                  QgsRectangle rect = QgsRectangle(),
00336                  bool fetchGeometry = true,
00337                  bool useIntersect = false );
00338 
00344     bool nextFeature( QgsFeature& feature );
00345 
00348     bool featureAtId( QgsFeatureId featureId, QgsFeature &f, bool fetchGeometries = true, bool fetchAttributes = true );
00349 
00355     bool addFeature( QgsFeature& f, bool alsoUpdateExtent = true );
00356 
00362     bool updateFeature( QgsFeature &f );
00363 
00368     bool insertVertex( double x, double y, QgsFeatureId atFeatureId, int beforeVertex );
00369 
00374     bool moveVertex( double x, double y, QgsFeatureId atFeatureId, int atVertex );
00375 
00378     bool deleteVertex( QgsFeatureId atFeatureId, int atVertex );
00379 
00383     bool deleteSelectedFeatures();
00384 
00393     int addRing( const QList<QgsPoint>& ring );
00394 
00404     int addPart( const QList<QgsPoint>& ring );
00405     Q_DECL_DEPRECATED int addIsland( const QList<QgsPoint>& ring ) { return addPart( ring ); }
00406 
00412     int translateFeature( QgsFeatureId featureId, double dx, double dy );
00413 
00418     int splitFeatures( const QList<QgsPoint>& splitLine, bool topologicalEditing = false );
00419 
00424     int removePolygonIntersections( QgsGeometry* geom );
00425 
00432     int addTopologicalPoints( QgsGeometry* geom );
00433 
00440     int addTopologicalPoints( const QgsPoint& p );
00441 
00446     int insertSegmentVerticesForSnap( const QList<QgsSnappingResult>& snapResults );
00447 
00449     void enableLabels( bool on );
00450 
00452     bool hasLabelsEnabled( void ) const;
00453 
00455     virtual bool isEditable() const;
00456 
00459     virtual bool isReadOnly() const;
00460 
00462     virtual bool isModified() const;
00463 
00469     bool snapPoint( QgsPoint& point, double tolerance );
00470 
00478     int snapWithContext( const QgsPoint& startPoint,
00479                          double snappingTolerance,
00480                          QMultiMap < double, QgsSnappingResult > &snappingResults,
00481                          QgsSnapper::SnappingType snap_to );
00482 
00485     virtual void reload();
00486 
00490     bool draw( QgsRenderContext& rendererContext );
00491 
00493     void drawLabels( QgsRenderContext& rendererContext );
00494 
00496     const QgsFieldMap &pendingFields() const;
00497 
00499     QgsAttributeList pendingAllAttributesList();
00500 
00502     int pendingFeatureCount();
00503 
00508     bool setReadOnly( bool readonly = true );
00509 
00511     void setModified( bool modified = true, bool onlyGeometryWasModified = false );
00512 
00514     bool startEditing();
00515 
00518     bool changeGeometry( QgsFeatureId fid, QgsGeometry* geom );
00519 
00521     bool changeAttributeValue( QgsFeatureId fid, int field, QVariant value, bool emitSignal = true );
00522 
00526     bool addAttribute( const QgsField &field );
00527 
00531     Q_DECL_DEPRECATED bool addAttribute( QString name, QString type );
00532 
00535     void addAttributeAlias( int attIndex, QString aliasString );
00536 
00539     QString attributeAlias( int attributeIndex ) const;
00540 
00543     QString attributeDisplayName( int attributeIndex ) const;
00544 
00546     bool deleteAttribute( int attr );
00547 
00549     bool addFeatures( QgsFeatureList features, bool makeSelected = true );
00550 
00552     bool deleteFeature( QgsFeatureId fid );
00553 
00569     bool commitChanges();
00570     const QStringList &commitErrors();
00571 
00573     bool rollBack();
00574 
00576     EditType editType( int idx );
00577 
00579     void setEditType( int idx, EditType edit );
00580 
00582     void setCheckedState( int idx, QString checked, QString notChecked );
00583 
00585     QPair<QString, QString> checkedState( int idx );
00586 
00588     QString editForm();
00589 
00591     void setEditForm( QString ui );
00592 
00594     QString annotationForm() const { return mAnnotationForm; }
00595 
00597     void setAnnotationForm( const QString& ui );
00598 
00600     QString editFormInit();
00601 
00603     void setEditFormInit( QString function );
00604 
00606     QMap<QString, QVariant> &valueMap( int idx );
00607 
00609     RangeData &range( int idx );
00610 
00614     ValueRelationData &valueRelation( int idx );
00615 
00619     void addOverlay( QgsVectorOverlay* overlay );
00620 
00624     void removeOverlay( const QString& typeName );
00625 
00629     void vectorOverlays( QList<QgsVectorOverlay*>& overlayList );
00630 
00634     QgsVectorOverlay* findOverlayByType( const QString& typeName );
00635 
00636 
00641     void beginEditCommand( QString text );
00642 
00644     void endEditCommand();
00645 
00647     void destroyEditCommand();
00648 
00650     void undoEditCommand( QgsUndoCommand* cmd );
00651 
00653     void redoEditCommand( QgsUndoCommand* cmd );
00654 
00658     int fieldNameIndex( const QString& fieldName ) const;
00659 
00662     enum VertexMarkerType
00663     {
00664       SemiTransparentCircle,
00665       Cross,
00666       NoMarker  /* added in version 1.1 */
00667     };
00668 
00671     static void drawVertexMarker( double x, double y, QPainter& p, QgsVectorLayer::VertexMarkerType type, int vertexSize );
00672 
00675     void updateFieldMap();
00676 
00679     void createJoinCaches();
00680 
00686     void uniqueValues( int index, QList<QVariant> &uniqueValues, int limit = -1 );
00687 
00690     QVariant minimumValue( int index );
00691 
00694     QVariant maximumValue( int index );
00695 
00696   public slots:
00698     void select( QgsFeatureId featureId, bool emitSignal = true );
00699 
00701     void deselect( QgsFeatureId featureId, bool emitSignal = true );
00702 
00704     void removeSelection( bool emitSignal = true );
00705 
00706     void triggerRepaint();
00707 
00711     virtual void updateExtents();
00712 
00715     void checkJoinLayerRemove( QString theLayerId );
00716 
00717     QString metadata();
00718 
00719   signals:
00720 
00722     void selectionChanged();
00723 
00725     void layerModified( bool onlyGeometry );
00726 
00727     void editingStarted();
00728     void editingStopped();
00729     void attributeAdded( int idx );
00730     void attributeDeleted( int idx );
00731     void featureAdded( QgsFeatureId fid );  // added in 1.7
00732     void featureDeleted( QgsFeatureId fid );
00733     void layerDeleted();
00734 
00735     void attributeValueChanged( QgsFeatureId fid, int idx, const QVariant & );
00736     void geometryChanged( QgsFeatureId fid, QgsGeometry &geom ); // added in 1.9
00737 
00740     void committedAttributesDeleted( const QString& layerId, const QgsAttributeIds& deletedAttributeIds );
00741     void committedAttributesAdded( const QString& layerId, const QList<QgsField>& addedAttributes );
00742     void committedFeaturesAdded( const QString& layerId, const QgsFeatureList& addedFeatures );
00743     void committedFeaturesRemoved( const QString& layerId, const QgsFeatureIds& deletedFeatureIds );
00744     void committedAttributeValuesChanges( const QString& layerId, const QgsChangedAttributesMap& changedAttributesValues );
00745     void committedGeometriesChanges( const QString& layerId, const QgsGeometryMap& changedGeometries );
00746 
00747   private:                       // Private methods
00748 
00750     QgsVectorLayer( QgsVectorLayer const & rhs );
00751 
00753     QgsVectorLayer & operator=( QgsVectorLayer const & rhs );
00754 
00759     bool setDataProvider( QString const & provider );
00760 
00763     void drawFeature( QgsRenderContext &renderContext,
00764                       QgsFeature& fet,
00765                       QImage* marker );
00766 
00768     void transformPoint( double& x, double& y,
00769                          const QgsMapToPixel* mtp, const QgsCoordinateTransform* ct );
00770 
00771     void transformPoints( std::vector<double>& x, std::vector<double>& y, std::vector<double>& z, QgsRenderContext &renderContext );
00772 
00776     unsigned char *drawLineString( unsigned char *WKBlinestring, QgsRenderContext &renderContext );
00777 
00781     unsigned char *drawPolygon( unsigned char *WKBpolygon, QgsRenderContext &renderContext );
00782 
00784     QgsFeatureId findFreeId();
00785 
00787     void deleteCachedGeometries();
00788 
00797     void snapToGeometry( const QgsPoint& startPoint,
00798                          QgsFeatureId featureId,
00799                          QgsGeometry* geom,
00800                          double sqrSnappingTolerance,
00801                          QMultiMap<double, QgsSnappingResult>& snappingResults,
00802                          QgsSnapper::SnappingType snap_to ) const;
00803 
00806     int boundingBoxFromPointList( const QList<QgsPoint>& list, double& xmin, double& ymin, double& xmax, double& ymax ) const;
00807 
00809     static QgsVectorLayer::VertexMarkerType currentVertexMarkerType();
00810 
00812     static int currentVertexMarkerSize();
00813 
00815     void updateFeatureAttributes( QgsFeature &f, bool all = false );
00816 
00824     void addJoinedFeatureAttributes( QgsFeature& f, const QgsVectorJoinInfo& joinInfo, const QString& joinFieldName, const QVariant& joinValue,
00825                                      const QgsAttributeList& attributes, int attributeIndexOffset );
00826 
00828     void updateFeatureGeometry( QgsFeature &f );
00829 
00831     void editGeometryChange( QgsFeatureId featureId, QgsGeometry& geometry );
00832 
00834     void editFeatureAdd( QgsFeature& feature );
00835 
00837     void editFeatureDelete( QgsFeatureId featureId );
00838 
00840     void editAttributeChange( QgsFeatureId featureId, int field, QVariant value );
00841 
00843     void stopRendererV2( QgsRenderContext& rendererContext, QgsSingleSymbolRendererV2* selRenderer );
00844 
00846     void updateAttributeMapIndex( QgsAttributeMap& map, int oldIndex, int newIndex ) const;
00847 
00852     void prepareLabelingAndDiagrams( QgsRenderContext& rendererContext, QgsAttributeList& attributes, bool& labeling );
00853 
00854   private:                       // Private attributes
00855 
00859     int mUpdateThreshold;
00860 
00862     QgsVectorDataProvider *mDataProvider;
00863 
00865     QString mDisplayField;
00866 
00868     QString mProviderKey;
00869 
00871     QgsAttributeAction* mActions;
00872 
00874     bool mEditable;
00875 
00877     bool mReadOnly;
00878 
00880     bool mModified;
00881 
00883     QgsGeometryMap mCachedGeometries;
00884 
00886     QgsRectangle mCachedGeometriesRect;
00887 
00892     QgsFeatureIds mSelectedFeatureIds;
00893 
00898     QgsFeatureIds mDeletedFeatureIds;
00899 
00903     QgsFeatureList mAddedFeatures;
00904 
00906     QgsChangedAttributesMap mChangedAttributeValues;
00907 
00909     QgsAttributeIds mDeletedAttributeIds;
00910 
00912     QgsAttributeIds mAddedAttributeIds;
00913 
00915     QgsGeometryMap mChangedGeometries;
00916 
00918     QgsFieldMap mUpdatedFields;
00919 
00921     QMap< QString, QString > mAttributeAliasMap;
00922 
00924     int mMaxUpdatedIndex;
00925 
00927     int mWkbType;
00928 
00929     QgsUndoCommand * mActiveCommand;
00930 
00932     QgsRenderer *mRenderer;
00933 
00935     QgsFeatureRendererV2 *mRendererV2;
00936 
00938     bool mUsingRendererV2;
00939 
00941     QgsLabel *mLabel;
00942 
00944     bool mLabelOn;
00945 
00947     QgsVectorLayer::VertexMarkerType mCurrentVertexMarkerType;
00948 
00950     int mCurrentVertexMarkerSize;
00951 
00953     bool mVertexMarkerOnlyForSelection;
00954 
00956     QList<QgsVectorOverlay*> mOverlays;
00957 
00958     QStringList mCommitErrors;
00959 
00960     QMap< QString, EditType > mEditTypes;
00961     QMap< QString, QMap<QString, QVariant> > mValueMaps;
00962     QMap< QString, RangeData > mRanges;
00963     QMap< QString, QPair<QString, QString> > mCheckedStates;
00964     QMap< QString, ValueRelationData > mValueRelations;
00965 
00966     QString mEditForm, mEditFormInit;
00967     //annotation form for this layer
00968     QString mAnnotationForm;
00969 
00970     bool mFetching;
00971     QgsRectangle mFetchRect;
00972     QgsAttributeList mFetchAttributes;
00973     QgsAttributeList mFetchProvAttributes;
00974     bool mFetchGeometry;
00975 
00976     QSet<QgsFeatureId> mFetchConsidered;
00977     QgsGeometryMap::iterator mFetchChangedGeomIt;
00978     QgsFeatureList::iterator mFetchAddedFeaturesIt;
00979 
00980     //stores information about joined layers
00981     QgsVectorLayerJoinBuffer* mJoinBuffer;
00982 
00983     //diagram rendering object. 0 if diagram drawing is disabled
00984     QgsDiagramRendererV2* mDiagramRenderer;
00985 
00986     //stores infos about diagram placement (placement type, priority, position distance)
00987     QgsDiagramLayerSettings *mDiagramLayerSettings;
00988 };
00989 
00990 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines