前言

这篇文章里,我们要完成一些数据的合并,计算等操作。

准备工作

首先要了解Qgis的编程模型,具体参考文章QGIS里的编程模型及《Qgis里的查询过滤》。了解了Qgis的原型结构与编程方法,我们就可以动手操作了。

任务目标

1、将分散的Gps点合并到空间数据库

2、将新增的点位与其所在的线路关联,以方便应用中的检索

任务分析

数据库中存在两个表格,一个是点位的数据,另一个是道路的数据。其数据结构分别如下:

点位字段结构

道路字段结构

点位通过一个字段LDBH与道路进行关联。

采集过来的点位数据为原始的GPS数据,且字段格式与数据库中点位并不一致,且采集过的数据可能与数据库的存在重复。

基本思路

由于数据结构不一样,只能通过新增的方式将采集的数据合并到数据库中,并比较点位的位置,如果过于接近(10m)以内,则认为是同一个点。根据Qgis的编程模型,查询点位可以用QgsVectorLayer.getFeatures()方法去检索对比,增加要素使用QgsVectorLayer.addFeature()。用这两方法基本上就可以完成上述的任务。

编程步骤

1、定位图层

采集的数据转换为csv文件,添加到Qgis项目中,可以通过UI添加,也可以使用脚本加载。

这里通过图层名称进行定义(前提不要有同名的图层):

for node in nodes:

if node.layer().name()==ln:

csvlayer=node.layer()
    #...
if node.layer().name()==unicode('本地站点','utf-8'):
lstoplayer=node.layer()
#....

这里迭代所有的图层,找到符合条件的图层,以便后续操作。

2、坐标转换

由于数据库中存放的城建坐标,而采集的数据是GPS坐标,因为需要对采集的数据进行坐标转换:

crsSrc = QgsCoordinateReferenceSystem(4326)
crs = QgsCoordinateReferenceSystem()
crs.createFromProj4("+proj=tmerc +lat_0=31.23 +lon_0=121.46 +k=1 +x_0=-680 +y_0=-610 +ellps=krass +units=m +no_defs")
xform = QgsCoordinateTransform(crsSrc, crs)

创建一个WGS的坐标系引用表示,再合建一个城建坐标系引用,再创建一个坐标转换对象进行点位转换:

for nstop in csvlayer.getFeatures():
gps= nstop.geometry().asPoint()
stoppoint =xform.transform(gps)
stoppoint 为GPS点位对应的城建坐标点。

3、关联道路

dis1=20
rect=QgsRectangle(stoppoint.x()-dis1,stoppoint.y()-dis1,stoppoint.x()+dis1,stoppoint.y()+dis1)
lines= linelayer.getFeatures(QgsFeatureRequest(rect))
ldbh=''
for line in lines:
ldbh=line['LDBH']

查找20米范围里的道路,如果找到读取其编号。

4、创建要素

 if caps & QgsVectorDataProvider.AddFeatures:
feat = QgsFeature(lstoplayer.pendingFields())
feat.setAttribute('GLH', glh)
feat.setAttribute('SZDLBH', ldbh)
feat.setAttribute('ZDLB', 0)
feat.setAttribute('SFYDZZP',0)
feat.setAttribute('SFGWS', 0)
feat.setAttribute('SFYHCT',0)
feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(stoppoint.x(), stoppoint.y())))
(res, outFeats) = lstoplayer.dataProvider().addFeatures([feat])

创建要素,并增加到图层中。

结束语

至此,一个简单的批量数据处理的过程就算完成了。利用Qgis的脚本功能,可以省去大量的体力劳动。借助Python,可以让电脑完成更多的事情,需要记者自行去挖掘。

QGis 利用Python Console编写脚本进行批量处理的更多相关文章

  1. 利用Python代码编写计算器小程序

    import tkinter import tkinter.messagebox import math class JSQ: def __init__(self): #创建主界面 self.root ...

  2. 利用python执行shell脚本 并动态传参 及subprocess基本使用

    最近工作需求中 有遇到这个情况  在web端获取配置文件内容 及 往shell 脚本中动态传入参数 执行shell脚本这个有多种方法   最后还是选择了subprocess这个python标准库 su ...

  3. 利用python和shell脚本生成train.txt的标签文件

    1. 用shell脚本生成带绝对路径的train.txt 例如我要生成如下形式的带标签的文件,如图:(如有两个标签:0 和 1) shell脚本如下: 这样标签0写入了train.txt # /usr ...

  4. 使用python语言编写脚本控制freeswitch总结

    1.  在Linux环境下已经安装了freeswitch,(没安装freeswitch,请安装说明文档) 2.  进入源代码目录 cd  libs/esl 目录下 首先安装 yum install p ...

  5. Python语言编写脚本时,对日期控件的处理方式

    对日期控件,日期控件的输入控一般是不能手动输入的:把readonly属性去掉就好 其实很简单,我们不去搞时间日期空间,我们把它当成一个普通的input框处理就好了! 但是,很多此类型input框都是禁 ...

  6. 使用 Python 编写脚本并发布

    使用 Python 编写脚本并发布 P1: 脚本 通常在 Linux 服务器上会遇到在命令行中输入命令的操作,而有些操作包含的命令数目较多或者其中的命令包含的参数较多,如果一个一个的敲命令的话就太麻烦 ...

  7. 利用python,简单的词语纠错

    利用python,编写一个简单的词语纠正修改器. 原文:http://norvig.com/spell-correct.html #!/usr/bin/env python # coding=utf- ...

  8. 使用 Python 为 KVM 编写脚本,第 1 部分: libvirt

    虚拟化是目前市场上大多数服务器操作系统的标准设备.在 Linux® 的世界里,服务器虚拟化有两个主要选择:基于 Kernel 的虚拟机 (KVM) 和 Xen.KVM 是 Red Hat 和其他公司采 ...

  9. Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...

随机推荐

  1. Windows安装配置xampp

    建议大家直接看原文 1.安装XAMPP 进入https://www.apachefriends.org/zh_cn/index.html页面下载XAMPP 2 3.打开xampp控制版 4.修改apa ...

  2. Js窗口嵌套

    <script type="text/javascript"> if (window.parent.window != window) { window.top.loc ...

  3. PHP三维优先级运算

    昨天去某大型公司面试,做了一套面试题,整套面试题的基础要求比较高,对于js的使用有一定的要求.在本次面试中碰到PHP三维运算优先级的问题,先看题: <?php $b=20; $c=40; $a= ...

  4. 移动端mate标签设置

    <meta name="viewport" content="width=device-width,height=device-height,initial-sca ...

  5. Ubuntu 18 使用docker安装rancher/server:stable并运行kubernetes

    1.安装docker sudo apt-get install docker.io docker的版本:Docker version 17.12.1-ce 2.安装virtualbox-qt,因为vi ...

  6. 目前比较全的CSS重设(reset)方法总结(转)

    原文地址 在当今网页设计/开发实践中,使用CSS来为语义化的(X)HTML标记添加样式风格是重要的关键.在设计师们的梦想中都存在着这样的一个完美世界:所有的浏览器都能够理解和适用多有CSS规则,并且呈 ...

  7. SMBus Host Controller not enabled!

    今天去官网下载最新的ubuntu  ubuntukylin-16.10-desktop-amd64.iso,下载后vm 运行,安装后结果报了这个问题 之后google搜索得到答案: 1.复制   cp ...

  8. .Net ->> iTextSharp工具读取PDF文本内容

    分享一个开源的C#DLL,可以读取PDF文本内容. 地址:http://sourceforge.net/projects/itextsharp/ 这里还有相关的链接:http://www.codepr ...

  9. 【Leetcode】【Hard】Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  10. 【Leetcode】【Medium】3Sum Closest

    Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...