文档章节

QGIS矢量编辑插件

G
 GIS开源
发布于 2016/11/14 18:50
字数 983
阅读 4.9K
收藏 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

G
粉丝 5
博文 17
码字总数 7873
作品 0
东城
技术主管
私信 提问
加载中
请先登录后再评论。
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
5.7K
8
5分钟 maven3 快速入门指南

前提条件 你首先需要了解如何在电脑上安装软件。如果你不知道如何做到这一点,请询问你办公室,学校里的人,或花钱找人来解释这个给你。 不建议给Maven的服务邮箱来发邮件寻求支持。 安装Mav...

fanl1982
2014/01/23
1.2W
6
表单验证插件--Jquery表单验证插件

目前支持对以下格式的值进行验证: cnum-(纯数字), char-(纯字母), zwen-(中文), bysc-(字母开头), mail(邮箱), yzbm(邮政编码) 其中的‘’表示长度,比如“zwen1-5”表示中文1-5位的长度。同...

huanganiu
2013/01/23
4.4K
0
HTTPS切换工具--HttpsSwitcher

HttpsSwitcher 是一个帮你进行 HTTPS 切换的 Chrome 插件,本工具可以帮你尝试使用https打开指定的域名,点击本插件的浏览器图标后会自动切换本标 签页的http/https状态,并且会记住你的选择...

leehorsley
2013/01/26
924
0

没有更多内容

加载失败,请刷新页面

加载更多

鼠年吉祥,新年快乐

今天是大年初一,很高兴在过去一年中有您的陪伴,希望大家在新的一年中平安健康,一切顺利,加油。 邓飞 202001250539 于后园爷爷家 本文分享自微信公众号 - 育种数据分析之放飞自我(R-bre...

育种数据分析之放飞自
01/25
0
0
不烧脑、不耗时、全免费,带你0基础学Python

文末有福利 Python是人工智能的未来。 最近,电气和电子工程师协会( IEEE)发布了顶级编程语言交互排行榜:Python高居首位。 而且随着大数据和人工智能的发展,Python受到了越来越多程序员的...

kunjian
今天
0
0
R语言入门系列之一

写在前面 计算机语言的学习并不困难,关键是一定要由浅入深的实际操作练习。也许最开始的比较简单,学习者一带而过没有实际操作,之后的进一步学习很可能会陷入不知所云的困境,实际操作所带...

SYSU星空
2019/02/17
0
0
Istio-本地运行

概述 基于上一篇 Istio1.6-二进制编译和本地运行 但集中在 pilot-discovery 和 envoy(pilot-agent 大部分功能仅作为 envoy 的 watchdog,略过) NOTE: 以下的描述,相对路径都基于目录 /g...

深蓝苹果
36分钟前
9
0
基于Linux、C、JSON、Socket的编程实例(附代码)

点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间阅读编程笔记! 一、前言 之前在学习socket编程的时候有分享一个基于控制台的简易天气客户端的实现,当时提供的是window下的代码,最近...

学以解忧
2019/10/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部