QGis 利用Python Console编写脚本进行批量处理
前言
这篇文章里,我们要完成一些数据的合并,计算等操作。
准备工作
首先要了解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编写脚本进行批量处理的更多相关文章
- 利用Python代码编写计算器小程序
import tkinter import tkinter.messagebox import math class JSQ: def __init__(self): #创建主界面 self.root ...
- 利用python执行shell脚本 并动态传参 及subprocess基本使用
最近工作需求中 有遇到这个情况 在web端获取配置文件内容 及 往shell 脚本中动态传入参数 执行shell脚本这个有多种方法 最后还是选择了subprocess这个python标准库 su ...
- 利用python和shell脚本生成train.txt的标签文件
1. 用shell脚本生成带绝对路径的train.txt 例如我要生成如下形式的带标签的文件,如图:(如有两个标签:0 和 1) shell脚本如下: 这样标签0写入了train.txt # /usr ...
- 使用python语言编写脚本控制freeswitch总结
1. 在Linux环境下已经安装了freeswitch,(没安装freeswitch,请安装说明文档) 2. 进入源代码目录 cd libs/esl 目录下 首先安装 yum install p ...
- Python语言编写脚本时,对日期控件的处理方式
对日期控件,日期控件的输入控一般是不能手动输入的:把readonly属性去掉就好 其实很简单,我们不去搞时间日期空间,我们把它当成一个普通的input框处理就好了! 但是,很多此类型input框都是禁 ...
- 使用 Python 编写脚本并发布
使用 Python 编写脚本并发布 P1: 脚本 通常在 Linux 服务器上会遇到在命令行中输入命令的操作,而有些操作包含的命令数目较多或者其中的命令包含的参数较多,如果一个一个的敲命令的话就太麻烦 ...
- 利用python,简单的词语纠错
利用python,编写一个简单的词语纠正修改器. 原文:http://norvig.com/spell-correct.html #!/usr/bin/env python # coding=utf- ...
- 使用 Python 为 KVM 编写脚本,第 1 部分: libvirt
虚拟化是目前市场上大多数服务器操作系统的标准设备.在 Linux® 的世界里,服务器虚拟化有两个主要选择:基于 Kernel 的虚拟机 (KVM) 和 Xen.KVM 是 Red Hat 和其他公司采 ...
- Python 利用Python编写简单网络爬虫实例3
利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...
随机推荐
- Windows安装配置xampp
建议大家直接看原文 1.安装XAMPP 进入https://www.apachefriends.org/zh_cn/index.html页面下载XAMPP 2 3.打开xampp控制版 4.修改apa ...
- Js窗口嵌套
<script type="text/javascript"> if (window.parent.window != window) { window.top.loc ...
- PHP三维优先级运算
昨天去某大型公司面试,做了一套面试题,整套面试题的基础要求比较高,对于js的使用有一定的要求.在本次面试中碰到PHP三维运算优先级的问题,先看题: <?php $b=20; $c=40; $a= ...
- 移动端mate标签设置
<meta name="viewport" content="width=device-width,height=device-height,initial-sca ...
- 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 ...
- 目前比较全的CSS重设(reset)方法总结(转)
原文地址 在当今网页设计/开发实践中,使用CSS来为语义化的(X)HTML标记添加样式风格是重要的关键.在设计师们的梦想中都存在着这样的一个完美世界:所有的浏览器都能够理解和适用多有CSS规则,并且呈 ...
- SMBus Host Controller not enabled!
今天去官网下载最新的ubuntu ubuntukylin-16.10-desktop-amd64.iso,下载后vm 运行,安装后结果报了这个问题 之后google搜索得到答案: 1.复制 cp ...
- .Net ->> iTextSharp工具读取PDF文本内容
分享一个开源的C#DLL,可以读取PDF文本内容. 地址:http://sourceforge.net/projects/itextsharp/ 这里还有相关的链接:http://www.codepr ...
- 【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 ...
- 【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 ...