文档章节

QGIS矢量编辑插件

G
 GIS开源
发布于 2016/11/14 18:50
字数 983
阅读 314
收藏 0
点赞 0
评论 0

 

一、           简述

 地理信息系统(以下简称GIS)的造价一般是比较昂贵的。GIS平台和地图数据是GIS的重要组成部分,其价格(商业GIS平台的价格和商业地图资源的价格)一般都比较贵,因此很多中小用户建设一套服务于自己业务的GIS应用系统却难以承受其昂贵建设费用。而开源的地理信息平台和免费的在线地图资源给我们提供了一种比较价格比较低廉的解决方案,使您在投入少量资金就可以建设自己的地理信息应用,为您的日常工作提供GIS工具。本例示例QGIS如何以插件方式扩展、添加自定义矢量编辑工具,为矢量数据编辑提供思路,本例功能是自动生成楼房内部结构示意图,下图是样例的效果:

                            wKioL1goMkPTBtWBAA_OGaK-Ppo073.png-wh_50

wKiom1goMlujL6BwAA66KaT4Gio181.png-wh_50

 

wKioL1goMnThD6LIAA4alpise8M936.png-wh_50wKiom1goMoyxyGW0AAHNCE40ajM806.png-wh_50

二、           创建插件工程

进入QGIS的源代码目录,里面有一个plugin_builder.py,它就是QGIS提供的自动创建插件工程的PYTHON程序。

wKioL1goMqKxHyXYAAFvIFDqzAc739.png-wh_50

打开控制台执行pythonplugin_builder.py

wKiom1goMrOzOm2QAAA2fH3xBg8212.png-wh_50

根据向导生成插件的CMAKE工程,利用CMAKE生成VC工程

wKioL1goMsDytkyHAAEQMrFiYH8053.png-wh_50

CMAKE为我们非常方便的生成了一个插件的VC工程

wKioL1goMtKjHhbgAAG51cctOCo983.png-wh_50

 

三、           创建楼房信息对话框

当绘制房屋内部结构时会弹出一个对话框进行楼层及户数设置。打开QTCREATER,设计对话框并添加相应的触发关联函数(建议使用QTCREATER设计对话框界面并自动生成关联触发函数,生成后可将文件(.UI、.CPP、.H)拷贝添加到VC的工程中使用)。创建一个Qt Widgets Application 的应用程序

wKiom1goMuTDqOfaAAIXT4hMHPI747.png-wh_50

添加一个对话框,在界面上摆放一个依次摆放文本框、按钮、列表框。

wKioL1goMvLTX1UuAAJAQb_S71U611.png-wh_50

 

添加确定按钮点击触发事件函数,后边会在函数中添加处理代码。

 

voidDialoginnerset::on_pushButton_clicked()

{

}

添加列表选择触发事件,后边会在函数中添加处理代码

 

voidDialoginnerset::on_pushButton_2_clicked()

{

}

四、           添加插件代码

  1. 1. 初始化插件界面

voidDrawInner::initGui()

{

    mQActionPointer= new QAction( QIcon( ":/drawinner/drawinner.png"), QString::fromLocal8Bit( "生成房屋结构及电表"), this );

    mQActionPointer->setObjectName("mQActionPointer" );

    mQActionPointer->setWhatsThis(tr( "Replace this with a short description ofwhat the plugin does" ) );

    connect(mQActionPointer, SIGNAL( triggered() ), this, SLOT( run() ));

    mQGisIface->addToolBarIcon(mQActionPointer );

    mQGisIface->addPluginToMenu(QString::fromLocal8Bit( "生成房屋结构及电表"), mQActionPointer );

}

  1. 2. 插件运行

//当点击插件按钮或菜单里的插件功能时候,调用插件功能,这里是打开定位对话框(如果你的插件有多个功能,你可以多创建多个按钮和菜单功能)

voidDrawInner::run()

{

//创建绘制地图工具,注:只需创建一次。

    if(mpMapTool==NULL)

    {

       mpMapTool= new DrawInnerMapTool(mQGisIface->mapCanvas() );

       connect(mpMapTool, SIGNAL( mouseMoved( QgsPoint ) ), this, SLOT(mouseMoved( QgsPoint ) ) );

       connect(mpMapTool, SIGNAL( mouseClicked( QgsPoint ) ), this, SLOT(mouseClicked( QgsPoint ) ) );

       mQGisIface->mapCanvas()->setMapTool(mpMapTool );

    }

}

  1. 3. 插件卸载

//卸载插件时候触发,你需要在这里释放所创建的对象,移除添加的按钮和菜单

voidDrawInner::unload()

{

    // remove the GUI

    mQGisIface->removePluginMenu("&DrawInner", mQActionPointer);

    mQGisIface->removeToolBarIcon(mQActionPointer );

    delete mQActionPointer;

}

五、           添加编辑工具代码

完成地址对话框内功能代码的实现:

  1. 1. 绘制楼房结构工具类

classDrawInnerMapTool : public QgsMapTool

{

   Q_OBJECT

 

  public:

   DrawInnerMapTool( QgsMapCanvas* thepCanvas );

 

   ~DrawInnerMapTool();

 

 

   virtual voidcanvasMoveEvent( QMouseEvent * e );

 

  

   virtual voidcanvasPressEvent( QMouseEvent * e );

 

   

   virtual voidcanvasReleaseEvent( QMouseEvent * e );

 

   

   virtual voiddeactivate();

 

  public slots:

 

  signals:

   void mouseMoved( QgsPoint );

   void mouseClicked( QgsPoint );

  private:

    QgsVectorLayer*vectorLayerFromName( const QString& name );

    bool addFeature(QgsVectorLayer* player,QgsFeature*pFeature,QString fieldvalue);

   QgsRubberBand * mpRubberBand;

   QPointer<QgsMapCanvas> mpMapCanvas;

    Dialoginnerset*   mpDialoginnerset;

    double mdis;

};

 

  1. 2. 绘制楼房结构代码

voidDrawInnerMapTool::canvasPressEvent( QMouseEvent * thepEvent )

{

    //Q_UNUSED( thepEvent );

    mpDialoginnerset->misOK= false;

    //mpDialoginnerset->exec();

    if(mpDialoginnerset->exec()==QDialog::Accepted)

    {

       int iflat = mpDialoginnerset->mflat;

       int iunit = mpDialoginnerset->miunit;

       int mroomcount = mpDialoginnerset->mroomcount;

       double width = (mdis)*iunit;

       double height= iflat*(mdis);

       QStringsName =mpDialoginnerset->mName;

       QgsPointmyOriginalPoint =

           mCanvas->getCoordinateTransform()->toMapCoordinates(thepEvent->x(), thepEvent->y() );

       if(mpRubberBand==0)

       {

           mpRubberBand= new QgsRubberBand( mpMapCanvas, QGis::Point);

           mpRubberBand->setColor(Qt::red );

           mpRubberBand->setWidth(1 );

       }

如需全部代码及详细说明请与作者联系QQ:315022850,邮箱:315022850@qq.com

 


本文出自 “开源GIS平台” 博客,请务必保留此出处http://osgis.blog.51cto.com/10026717/1872375

本文转载自:http://osgis.blog.51cto.com/10026717/1872375

共有 人打赏支持
G
粉丝 4
博文 17
码字总数 7873
作品 0
东城
技术主管
QGIS矢量编辑插件

一、 简述 地理信息系统(以下简称GIS)的造价一般是比较昂贵的。GIS平台和地图数据是GIS的重要组成部分,其价格(商业GIS平台的价格和商业地图资源的价格)一般都比较贵,因此很多中小用户建...

GIS开源 ⋅ 2016/11/13 ⋅ 0

QGIS矢量编辑插件

一、 简述 地理信息系统(以下简称GIS)的造价一般是比较昂贵的。GIS平台和地图数据是GIS的重要组成部分,其价格(商业GIS平台的价格和商业地图资源的价格)一般都比较贵,因此很多中小用户建...

GIS开源 ⋅ 2017/05/20 ⋅ 0

基于高德在线地图及REST API 的 QGIS插件开发

一、 简述 地理信息系统(以下简称GIS)的造价一般是比较昂贵的。GIS平台和地图数据是GIS的重要组成部分,其价格(商业GIS平台的价格和商业地图资源的价格)一般都比较贵,因此很多中小用户想...

GIS开源 ⋅ 2016/11/09 ⋅ 0

自己做地图

支持WEB、Android、IOS的地图解决方案 工具链 GIS工具集 OpenGeo Suite 包含PostGIS, GeoServer, GeoWebCache, OpenLayers, 和 QGIS 地图准备 QGIS 导入、导出、编辑.shp,postgis,geotiff,ge...

postdep ⋅ 2016/04/22 ⋅ 0

QGIS(PYTHON3.5、QT5.7.1、QGIS3)系列二次开发环境

QGIS(PYTHON3.5、QT5.7.1、QGIS3系列二次开发环境,所有环境以虚拟机方式提供,以便研究或直接使用。 具体包括:独立应用二次开发环境(WINDOWS,LINUX);android二次开发;独立应用PYTHON二次...

GIS开源 ⋅ 2017/06/27 ⋅ 0

QGis C++ 开发之创建临时图层并添加要素

开发环境:Win10 + VS2010 + Qt 4.8.6 + QGis 2.14.4 其实本文实现的功能类似于QGis中“添加文本数据图层”的一个简化版,本文不会涉及到对话框的使用,不通过与用户互交的方式创建要素,而是...

袁_龙 ⋅ 2016/09/02 ⋅ 0

QGIS如何使用WMS图层

QGIS如何使用WMS图层 这边文章的讲的是QGIS如何使用WMS图层以及其WMS图层原理和缺点。 什么是WMS? (WMS) Web Mapping Service 是一种远程的地图服务,好像一个网站,你可以通过连接一个远程服...

GIS开源 ⋅ 2016/10/17 ⋅ 0

奥维ovobj 文件,转化为shp文件,再变sql文件导入到pgsql里

先变 KML 文件。 再用 QGIS的矢量 变成 shp文件。 ** 最后 。 shp2pgsql -W utf8 -s 4326 /home/manbug/ningbo/NB.shp ningbo_524>/home/manbug/ningbo/NBnew.sql https://www.cnblogs.com/......

寒月谷 ⋅ 06/08 ⋅ 0

Quantum GIS 1.3.0 发布

QGIS是一个用户界面友好的地理信息系统,可运行在Linux,Unix,Mac OSX,和Windows平台之上。QGIS支持vector,raster和database格。它能够很好得支持PostGIS 该版本改进了 OSM 插件和Provider、包...

红薯 ⋅ 2009/11/19 ⋅ 3

QGIS SERVER QGIS 用于 发布环境WEB 地图

我们可以直接将QGIS编辑和配置的地图成果, 发布为标准的OGC地图服务。而不需要再转换为GEOSERVER工程发布。这样可以避免样式的重新配置和数据的重新组织。并且通过QGIS的扩展开发可以灵活的...

GIS开源 ⋅ 04/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 25分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 41分钟前 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

设计模式 之 享元模式

设计模式 之 享元模式 定义 使用共享技术来有效地支持大量细粒度对象的复用 关键点:防止类多次创建,造成内存溢出; 使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,...

GMarshal ⋅ 今天 ⋅ 0

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 今天 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部