1.从OSGeo4w获取开发包
2.自己编译
编译的博客一大推,不再啰嗦,要有耐心 要有耐心 要有耐心 重要的事情说3遍。
开发环境: QtCreator
1.首先将设置QtCreator编译器,如果是下载的,目前官方使用的是Qt4.8.5编译的,所以应设置qmake路径类似:E:\OSGeo4W64\bin\qmake
2.设置导出宏 由于下载的开发包内并未定义,所以在pro文件中加入下面的定义
DEFINES += GUI_EXPORT=__declspec(dllimport)
DEFINES += ANALYSIS_EXPORT=__declspec(dllimport)
DEFINES += CORE_EXPORT=__declspec(dllimport) 3.修改QApplication 为 QgsApplication a(argc, argv, true); 设置完成后就可以开发了,注意下载的开发包是release版本,所以要使用release编译,至于调试有很多种方式,qDebug()输出,输出日志,再有附加到进程。我一遍喜欢使用附加到进程。 a.设置插件路径: QString myPluginsDir = "E:\\OSGeo4W64\\apps\\qgis-ltr\\plugins";QString myLayerPath = "F:\\Work\\ScDzsp\\data\\hg\\gk-SK.shp";QString myLayerBaseName = "test";//图层名称QString myProviderName = "ogr";//data providerQgsProviderRegistry::instance(myPluginsDir); b.重写画布: 头文件: #ifndef SCMAPCANVAS_HSCVectorLayer layer(myLayerPath, myLayerBaseName, myProviderName, "F:\\1.svg");#define SCMAPCANVAS_H#include "SCVectorLayer.h"#include <qgsmapcanvas.h>#include <QList>#include <QWidget>class QgsMapCanvas;class SCVectorLayer;class SCMapCanvas :public QgsMapCanvas{Q_OBJECTpublic:
SCMapCanvas(QWidget *parent = NULL);void addVectorLayer(const SCVectorLayer &vectorLayer, const QString &layerName, bool bVisible = true);void setCanvasColor(const QColor &color);void updateLayer();void clearCache();void setLayerVisible(const QString &layerName);void addMark(const QString &name);protected:
//void mouseReleaseEvent(QMouseEvent *ev);private:
QMap<QString, QgsMapLayer *> m_nameLayers;QList <QgsMapCanvasLayer> m_layers;};#endif // SCMAPCANVAS_H 源文件:#include "SCMapCanvas.h"#include "SCVectorLayer.h"#include <qgsvectorlayer.h>#include <qgsmaplayerregistry.h>#include <qgsgeometry.h>#include <QVBoxLayout>SCMapCanvas::SCMapCanvas(QWidget *parent):QgsMapCanvas(parent){}void SCMapCanvas::addVectorLayer(const SCVectorLayer &vectorLayer, const QString &layerName, bool bVisible){QgsMapCanvasLayer mapLayer(vectorLayer.vectorLayer(), bVisible);m_layers.append(mapLayer);QgsMapLayerRegistry::instance()->addMapLayer(vectorLayer.vectorLayer(), true);setExtent(vectorLayer.vectorLayer()->extent());m_nameLayers[layerName] = vectorLayer.vectorLayer();if(bVisible)setLayerVisible(layerName);
}void SCMapCanvas::setCanvasColor(const QColor &color){QgsMapCanvas::setCanvasColor(color);}void SCMapCanvas::updateLayer(){QgsMapCanvas::setLayerSet(m_layers);QgsMapCanvas::refreshAllLayers();}void SCMapCanvas::clearCache(){QgsMapCanvas::clearCache();}void SCMapCanvas::setLayerVisible(const QString &layerName){QgsMapCanvas::setCurrentLayer(m_nameLayers[layerName]);} 为了方便操作图层也重写下: 头文件:#ifndef SCVECTORLAYER_H#define SCVECTORLAYER_H#include <QObject>#include <qgspallabeling.h>class QgsVectorLayer;class QgsSvgMarkerSymbolLayerV2;class SCVectorLayer : public QObject{Q_OBJECTpublic:
SCVectorLayer( const QString& path, const QString& baseName,const QString& providerLib, const QString&iconPath, int iconSize = 10, bool loadDefaultStyleFlag = true );void setPalLayerSettings(QgsPalLayerSettings &settings);QgsVectorLayer *vectorLayer() const;static QgsPalLayerSettings defaultPalLayerSettings();private:
QgsVectorLayer * m_pVectorLayer;QgsSvgMarkerSymbolLayerV2* m_pSvgMarker;};#endif // SCVECTORLAYER_H源文件:#include "SCVectorLayer.h"#include <qgsvectorlayer.h>#include <qgssymbollayerv2.h>#include <qgssimplifymethod.h>#include <qgssymbollayerv2.h>#include <qgssymbolv2.h>#include <qgsmarkersymbollayerv2.h>#include <qgsvectorlayerrenderer.h>#include <qgsrendercontext.h>#include <qgssinglesymbolrendererv2.h>#include <qgssymbollayerv2.h>SCVectorLayer::SCVectorLayer(const QString &path, const QString &baseName, const QString &providerLib, const QString&iconPath, int iconSize,bool loadDefaultStyleFlag){//创建图层m_pVectorLayer = new QgsVectorLayer(path, baseName, providerLib, loadDefaultStyleFlag);//设置图层图标m_pSvgMarker = new QgsSvgMarkerSymbolLayerV2(iconPath, iconSize, 0);// m_pSvgMarker->setPath(iconPath);// m_pSvgMarker->setSize(iconSize);//解释器QgsSymbolLayerV2List symList;symList.append( m_pSvgMarker );QgsMarkerSymbolV2* markSym = new QgsMarkerSymbolV2( symList );QgsSingleSymbolRendererV2* symRenderer = new QgsSingleSymbolRendererV2( markSym );m_pVectorLayer->setRendererV2( symRenderer );}void SCVectorLayer::setPalLayerSettings(QgsPalLayerSettings &settings){settings.fieldName = m_pVectorLayer->pendingFields()[3].name();settings.writeToLayer( m_pVectorLayer ); // 将配置写入图层}QgsVectorLayer *SCVectorLayer::vectorLayer() const{return m_pVectorLayer;}QgsPalLayerSettings SCVectorLayer::defaultPalLayerSettings(){QgsPalLayerSettings layerSettings;layerSettings.enabled = true;// layerSettings.fieldName = mypLayer->pendingFields()[3].name(); // 设置Label图层layerSettings.centroidWhole = true; // 设置位置参考的中心点// Label 字体设置layerSettings.textColor = QColor( 0, 0, 0 ); // 设置字体颜色layerSettings.textFont = QFont( "Times", 12 ); // 设置字体和大小// Label 轮廓buffer设置layerSettings.bufferDraw = true;layerSettings.bufferColor = QColor( "gray"); // 轮廓buffer的颜色layerSettings.bufferSize = 1; // 轮廓buffer大小layerSettings.bufferTransp = 0.8; // 轮廓buffer的透明度// Label 阴影绘制layerSettings.shadowDraw = true;layerSettings.shadowOffsetAngle = 135; // 阴影的角度layerSettings.shadowOffsetDist = 1; // 阴影与Label的距离return layerSettings;}3. 具体使用layer.setPalLayerSettings(SCVectorLayer::defaultPalLayerSettings());myLayerPath = "F:\\Work\\ScDzsp\\data\\hg\\fkddfsjd-SK.shp";SCVectorLayer layer2(myLayerPath, myLayerBaseName, myProviderName, "F:\\2.svg");layer2.setPalLayerSettings(SCVectorLayer::defaultPalLayerSettings());myLayerPath = "F:\\Work\\ScDzsp\\data\\hg\\kjjd-SK.shp";SCVectorLayer layer3(myLayerPath, myLayerBaseName, myProviderName, "F:\\3.svg");layer3.setPalLayerSettings(SCVectorLayer::defaultPalLayerSettings());SCMapCanvas *mapCanvas= new SCMapCanvas(this);mapCanvas->clearCache();
mapCanvas->addVectorLayer(layer, "layer");mapCanvas->addVectorLayer(layer2, "layer2");mapCanvas->addVectorLayer(layer3, "layer3");mapCanvas->setCanvasColor(QColor(127, 127, 127));mapCanvas->updateLayer();
this->setCentralWidget(mapCanvas);
栅格图层跟矢量图层类似不在啰嗦