QGIS学习之-环境搭建

来源:互联网 发布:剑三捏脸数据17173 编辑:程序博客网 时间:2024/05/29 19:18

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 provider 
    QgsProviderRegistry::instance(myPluginsDir);b.重写画布:头文件:#ifndef SCMAPCANVAS_H
#define SCMAPCANVAS_H
#include "SCVectorLayer.h"
#include <qgsmapcanvas.h>
#include <QList>
#include <QWidget>
class QgsMapCanvas;
class SCVectorLayer;
class SCMapCanvas :public QgsMapCanvas
{
    Q_OBJECT
public:
    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_OBJECT
public:
    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. 具体使用
SCVectorLayer layer(myLayerPath, myLayerBaseName, myProviderName, "F:\\1.svg");
    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);


栅格图层跟矢量图层类似不在啰嗦