1 /*************************************************************************** 2 qgsgpxprovider.h - Data provider for GPS eXchange files 3 ------------------- 4 begin : 2004-04-14 5 copyright : (C) 2004 by Lars Luthman 6 email : larsl@users.sourceforge.net 7 8 Partly based on qgsdelimitedtextprovider.h, (C) 2004 Gary E. Sherman 9 ***************************************************************************/ 10 11 /*************************************************************************** 12 * * 13 * This program is free software; you can redistribute it and/or modify * 14 * it under the terms of the GNU General Public License as published by * 15 * the Free Software Foundation; either version 2 of the License, or * 16 * (at your option) any later version. * 17 * * 18 ***************************************************************************/ 19 20 #ifndef QGSGPXPROVIDER_H 21 #define QGSGPXPROVIDER_H 22 23 #include "qgsvectordataprovider.h" 24 #include "gpsdata.h" 25 #include "qgsfields.h" 26 #include "qgsprovidermetadata.h" 27 28 class QgsFeature; 29 class QgsField; 30 class QFile; 31 class QDomDocument; 32 class QgsGpsData; 33 34 class QgsGPXFeatureIterator; 35 36 /** 37 * \class QgsGPXProvider 38 * \brief Data provider for GPX (GPS eXchange) files 39 * This provider adds the ability to load GPX files as vector layers. 40 */ 41 class QgsGPXProvider final: public QgsVectorDataProvider 42 { 43 Q_OBJECT 44 45 public: 46 explicit QgsGPXProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ); 47 ~QgsGPXProvider() override; 48 49 /* Functions inherited from QgsVectorDataProvider */ 50 51 QgsAbstractFeatureSource *featureSource() const override; 52 QString storageType() const override; 53 QgsFeatureIterator getFeatures( const QgsFeatureRequest &request ) const override; 54 QgsWkbTypes::Type wkbType() const override; 55 long long featureCount() const override; 56 QgsFields fields() const override; 57 bool addFeatures( QgsFeatureList &flist, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override; 58 bool deleteFeatures( const QgsFeatureIds &id ) override; 59 bool changeAttributeValues( const QgsChangedAttributesMap &attr_map ) override; 60 QgsVectorDataProvider::Capabilities capabilities() const override; 61 QVariant defaultValue( int fieldId ) const override; 62 63 64 /* Functions inherited from QgsDataProvider */ 65 66 QgsRectangle extent() const override; 67 bool isValid() const override; 68 QString name() const override; 69 QString description() const override; 70 QgsCoordinateReferenceSystem crs() const override; 71 72 73 /* new functions */ 74 75 void changeAttributeValues( QgsGpsObject &obj, 76 const QgsAttributeMap &attrs ); 77 78 bool addFeature( QgsFeature &f, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override; 79 80 static QString encodeUri( const QVariantMap &parts ); 81 static QVariantMap decodeUri( const QString &uri ); 82 83 enum DataType 84 { 85 WaypointType = 1, 86 RouteType = 2, 87 TrackType = 4, 88 89 TrkRteType = RouteType | TrackType, 90 AllType = WaypointType | RouteType | TrackType 91 92 }; 93 94 enum Attribute { NameAttr = 0, EleAttr, SymAttr, NumAttr, 95 CmtAttr, DscAttr, SrcAttr, URLAttr, URLNameAttr 96 }; 97 98 private: 99 100 QgsGpsData *mData = nullptr; 101 102 //! Fields 103 QgsFields mAttributeFields; 104 //! map from field index to attribute 105 QVector<int> mIndexToAttr; 106 107 QString mFileName; 108 109 DataType mFeatureType = WaypointType; 110 111 static const QStringList sAttributeNames; 112 static const QList< QVariant::Type > sAttributeTypes; 113 static const QList< DataType > sAttributedUsedForLayerType; 114 115 bool mValid = false; 116 117 friend class QgsGPXFeatureSource; 118 }; 119 120 class QgsGpxProviderMetadata final: public QgsProviderMetadata 121 { 122 public: 123 QgsGpxProviderMetadata(); 124 QgsDataProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) override; 125 QgsProviderMetadata::ProviderCapabilities providerCapabilities() const override; 126 QString encodeUri( const QVariantMap &parts ) const override; 127 QVariantMap decodeUri( const QString &uri ) const override; 128 }; 129 130 #endif 131