「GIS教程」将GIS数据中的要素类转换成WKT文本
在办公室正在愉快Coding,充当CV工程师呢( 经常Ctrl+C、Ctrl+V复制粘贴进行内容的搬运的工程师),内业的小姐姐找到我说她收到了甲方奇怪的需求,问什么是WKT,面要素如何转WKT格式,两个面要素的WKT如何转换为MultiPolygon。经过我一番思考(百度)后找到了解决方案,在这里和大家分享下。甲方需求如下:①将要素类中的单个要素转为WKT格式的文本存储到TXT中、②复杂项目(多要素)要将多个Polygon转为MultiPolygon存储到TXT中。
做需求
做事情一般要理论先行,我们先了解一下什么是WKT格式。
WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。WKT格式通常用于在计算机系统之间交换空间数据,包括一些基本的几何对象,例如点、线、多边形,以及一些复合对象,例如多边形集合和几何对象集合。 该格式由开放地理空间联盟(ogc)制定。
了解好理论之后我们开始做需求, 本着能不动手就不动手的原则 ,我想到用GIS软件解决。首先是大而全面的ArcGIS
,不过感觉它在这方面支持的不很好,我用的还是十年前的10.2版本;然后我电脑上就还剩一个开源的QGIS
,经过我了解一番后,发现可以通过安装插件来获取WKT文本,别说还挺智能,能解决一部分问题。打开 QGIS Desktop软件后, 在QGIS软件界面中,点击选择"菜单栏→Plugins→Manage and Install Plugins... "。
打开了Plugins All对话框。本对话框就是添加安装插件的界面,有两种方式,一种是在线安装,一种是ZIP安装包安装。
① 在线安装就是选择左侧的All,然后找到需要安装的插件,选中之后,在右侧会有插件的简介,点击Install Plugin按钮开始安装。 安装过程中会有进度条提示,安装完成以后进度条自动关闭。安装完成以后,点击左侧的Installed,可见已安装了刚才选择的插件。
② ZIP安装包安装,就是需要选择左侧的Install from ZIP,然后在右侧输入框找到并选择ZIP格式的插件安装包,之后点击Install Plugin按钮。安装包可以在QGIS官网下载,也可以在其他网站下载。
这里我们以在线安装为例,在搜索栏搜索“WKT”,选择下方列表中的第三个点击,右侧会显示该插件介绍页,点击下方的“Install Plugin”按钮即可安装该插件。
安装成功后,再点击"菜单栏→Plugins",会显示该插件的功能栏目,就可以使用该栏目。
加载一个示例矢量数据,鼠标选择要素类中的一个要素类,再点击"菜单栏→Plugins→Get WKT→Get WKT String",会弹出一个Get WKT窗口,如下图所示,我们可以通过按钮复制该WKT至记事本中。但是不支持多个要素一起导出WKT字符串,会提示报错,这样我们需求二用软件导出的计划算是泡汤了。
需求延伸
作为一个Programmer Geeker (业余程序员),怎么能轻言放弃,我直接写花十多分钟写个Python脚本解决问题,下面给代码贴出来。这里主要用到了shapely和gdal库。
# -*- coding: utf-8 -*-
import datetime
from osgeo import ogr
from shapely.geometry import MultiPolygon
from shapely.wkt import loads
if __name__ == '__main__':
# 输入要素类的路径
in_shapefile = r"./data-use/shp/广东省.shp"
out_file = r'./results/广东省' + str(datetime.datetime.now().strftime('%Y%m%d')) + '.txt' # 输出文本
driver = ogr.GetDriverByName("ESRI Shapefile")
dataSource = driver.Open(in_shapefile, 0)
layer = dataSource.GetLayer()
layerDefinition = layer.GetLayerDefn()
# 获取字段名称列表
fields = []
for i in range(layerDefinition.GetFieldCount()):
fields.append(layerDefinition.GetFieldDefn(i).GetName())
print(fields)
# 获取字段值和相应的几何
record = []
for feature in layer:
# 获取要素的几何信息
geom = feature.GetGeometryRef()
# 要素的几何信息转WKT字符串
geomwkt = geom.ExportToWkt()
# 将WKT字符串转geometry
polygon = loads(geomwkt)
# 将geometry添加进列表
record.append(polygon)
# 将多个polygon组合成一个MultiPolygon
multi_poly = MultiPolygon(record)
# 输出MultiPolygon的WKT表示
wkt_content = multi_poly.wkt
print(multi_poly.wkt)
# 写入文本中
with open(out_file, 'w') as f:
f.write(wkt_content)
输出内容如下。
如何验证该WKT字符串是否正确呢?我们可以安装一个QGIS插件叫做QuickWKT
, 安装过程不再详述,自行百度。输入wkt字符串,点击Ok会自动新建一个图层并显示图形名为“QuickWKT”,我们随便点击该图斑一个地方,都是整体被选中,说明我们已经将多个要素转为了单个MultiPolygon,需求二也就成功解决了。
写在最后
更多数以万计的QGIS插件可以在QGIS官网查找, 插件使用一时爽,一直用一直爽,详情链接如下 。
https://plugins.qgis.org/plugins/
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。