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. ...
 
随机推荐
- JS实现中英文混合文字溢出友好截取功能
			
在显示字符串的时候,避免字符串过长往往会对字符串进行截取操作,通常会用到js的 substr 或者 substring方法, 以及 字符串的length属性 substr() 方法可在字符串中抽取从 ...
 - Azure 认知服务--计算机视觉 API - 分析图像
			
在本节中,笔者将详细介绍 Azure 认知服务中的一种:计算机视觉 (Computer Vision) API. 我的一个客户有需求,他们需要消费者与自己的产品合照,然后上传到服务器并转发到朋友圈. ...
 - Be opinionated out of the box but get out of the way quickly as requirements start to diverge from
			
Be opinionated out of the box but get out of the way quickly as requirements start to diverge from t ...
 - Java温故而知新(4)类String字符串
			
字符串是由字符组成,在Java中,字符串是对象,是描述字符的基本数据结构.String类可以用来保存一个字符串,本类是最终类,不允许继承: 1.String对象的创建 初始化 由于String对象特别 ...
 - html--深入理解4种dom对象
			
这四个对象是从HTML结构中逐层深入的,分别代表了HTML结构中所有的内容: 1.Document对象 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们 ...
 - Java Struts2 (二)
			
二.封装请求正文到对象中(非常重要) 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. 原因:是由一个staticParams的拦截器完成注入的. 2.动 ...
 - Python基础-socket编程
			
一.网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的 ...
 - Java中的深拷贝和浅拷贝(转载)
			
深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复 ...
 - 05_zookeeper的ACL
			
[ACL概述] ACL:access control Lists,权限控制. * 针对节点可以设置相关的读写等权限,目的是为了保障数据安全性. * 权限permissions可以指定不同的权限范围以及 ...
 - java反射机制的简单介绍
			
参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...