目录
一、应用场景
二、关于QGIS的python脚本
三、操作过程
1.打开控制台界面
2.数据准备
3.编写/加载脚本
4.执行脚本
5.查看数据
一、应用场景
在早期的测绘图纸上,常有界址点存在于纸质表格中,若要将这些测绘成果矢量化,就需要用到点转面或者是线的操作。据作者了解,QGIS还没有这样的一个工具或功能,需要通过多种操作完成。但是QGIS提供了二次开发功能。作者阅读了部分QGIS的Python开发文档,写了一个点转面的脚本,现在共享出来和各位交流。声明一下,作者只是一个Python菜鸟,写此文主要是为了作GIS应用。
二、关于QGIS的python脚本
QGIS从0.9开始支持Python,应该说QGIS对Python的支持的比较好了。通过QGIS的python控制台操作,不需要导入和QGIS有关的库,所以便于QGIS应用(本文不涉及应用程序开发)。作者用的3.10版本的Python大版本是3.7。
三、操作过程
1.打开控制台界面
通过插件-Python控制台打开界面(快捷键:ctrl+alt+p)
然后单击下图圈定的按钮显示编辑器
编辑器界面
2.数据准备
这里新建一个含有ID字段的面状ShapeFile矢量文件,加载到工程即可,具体过程略。这里为了显示,作者只建立了一个临时图层。
描述信息
3.编写/加载脚本
将脚本代码复制粘贴到编辑器中,或者是打开脚本都可以。
以下是作者使用的脚本:
class TestPloygon():
#将txt内容转换为面状矢量的wkt文本
def Txt2WktPolygon(filename):
data = 'Polygon (('
list = []
# 打开文件
fo = open(filename, 'r')
file_data = fo.readlines()
for row in file_data:
tmp_list=row.split(',')
tmp_list[-1] = tmp_list[-1].replace('\n','')
#print (tmp_list[0]+' '+tmp_list[1]);
if len(list) == 0:
list.append(tmp_list[0]+' '+tmp_list[1])
elif len(list) > 0:
list.append(","+tmp_list[0]+' '+tmp_list[1])
data = data + ''.join(list) + '))'
#print (data)
return data
# 关闭文件
fo.close()
#添加一个矢量要素
def AddFeature2Shp(filename):
layer = iface.activeLayer()
caps = layer.dataProvider().capabilities()
wktstr = TestPloygon.Txt2WktPolygon(filename)
print (wktstr)
if caps & QgsVectorDataProvider.AddFeatures:
feat = QgsFeature(layer.fields())
#设置ID值为1
feat.setAttribute('ID', '1')
#设置空间要素,使用的wkt字符串
feat.setGeometry(QgsGeometry.fromWkt(wktstr));
(res, outFeats) = layer.dataProvider().addFeatures([feat])
#指定需要读取的txt文件名
filename = 'C:\\Users\\Lenovo\\Desktop\\points.txt'
Wktstr = TestPloygon.AddFeature2Shp(filename)
#print (Wktstr)
print ('要素添加成功!')
Python代码的缩进有逻辑含义,复制粘贴时一定不要改动每行文本的缩进。
这里对脚本代码简要说明一下
首先指定 一个TXT文件
然后执行添加要素的代码
在执行添加要素的代码过程中,首先选择鼠标选中的图层作为要添加的图层,然后逐行读取指定TXT文件的内容为wkt字符串,英文逗号前是横坐标,逗号后是纵坐标
将读取的wkt字符串转换为矢量文件的空间数据,保存。
脚本中读取了一个文本文件,内容如下:
这代表的是一个多边形的各个节点的坐标值,本文新建的工程坐标单位是度,所以这些都是经纬度坐标(不过是地球上不存在的坐标),第一个是X坐标,第二个是Y坐标。注意: 首尾的坐标点要一致。
脚本和txt文本可以在这里下载QGIS310的Python脚本-坐标点转面.zip
4.执行脚本
单击编辑器上的绿色三角按钮就可以执行了,以下是执行结果。
5.查看数据
将矢量图层缩放至图层范围即可查看图斑。
至此,我们就完成了将一个txt文本作为矢量面要素添加到矢量文件的操作 。