麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

「GIS教程」将GIS数据中的要素类转换成WKT文本

在办公室正在愉快Coding,充当CV工程师呢( 经常Ctrl+C、Ctrl+V复制粘贴进行内容的搬运的工程师),内业的小姐姐找到我说她收到了甲方奇怪的需求,问什么是WKT,面要素如何转WKT格式,两个面要素的WKT如何转换为MultiPolygon。经过我一番思考(百度)后找到了解决方案,在这里和大家分享下。甲方需求如下:①将要素类中的单个要素转为WKT格式的文本存储到TXT中、②复杂项目(多要素)要将多个Polygon转为MultiPolygon存储到TXT中。

1713798782717

做需求

做事情一般要理论先行,我们先了解一下什么是WKT格式。

WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。WKT格式通常用于在计算机系统之间交换空间数据,包括一些基本的几何对象,例如点、线、多边形,以及一些复合对象,例如多边形集合和几何对象集合。 该格式由开放地理空间联盟(ogc)制定。

了解好理论之后我们开始做需求, 本着能不动手就不动手的原则 ,我想到用GIS软件解决。首先是大而全面的ArcGIS,不过感觉它在这方面支持的不很好,我用的还是十年前的10.2版本;然后我电脑上就还剩一个开源的QGIS,经过我了解一番后,发现可以通过安装插件来获取WKT文本,别说还挺智能,能解决一部分问题。打开 QGIS Desktop软件后, 在QGIS软件界面中,点击选择"菜单栏→Plugins→Manage and Install Plugins... "。

1713800567663

打开了Plugins All对话框。本对话框就是添加安装插件的界面,有两种方式,一种是在线安装,一种是ZIP安装包安装。

1713800681907

① 在线安装就是选择左侧的All,然后找到需要安装的插件,选中之后,在右侧会有插件的简介,点击Install Plugin按钮开始安装。 安装过程中会有进度条提示,安装完成以后进度条自动关闭。安装完成以后,点击左侧的Installed,可见已安装了刚才选择的插件。

② ZIP安装包安装,就是需要选择左侧的Install from ZIP,然后在右侧输入框找到并选择ZIP格式的插件安装包,之后点击Install Plugin按钮。安装包可以在QGIS官网下载,也可以在其他网站下载。

这里我们以在线安装为例,在搜索栏搜索“WKT”,选择下方列表中的第三个点击,右侧会显示该插件介绍页,点击下方的“Install Plugin”按钮即可安装该插件。

1713798782717

安装成功后,再点击"菜单栏→Plugins",会显示该插件的功能栏目,就可以使用该栏目。

1713800979565

加载一个示例矢量数据,鼠标选择要素类中的一个要素类,再点击"菜单栏→Plugins→Get WKT→Get WKT String",会弹出一个Get WKT窗口,如下图所示,我们可以通过按钮复制该WKT至记事本中。但是不支持多个要素一起导出WKT字符串,会提示报错,这样我们需求二用软件导出的计划算是泡汤了。

1713801163354

需求延伸

作为一个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)

输出内容如下。

1713802436803

如何验证该WKT字符串是否正确呢?我们可以安装一个QGIS插件叫做QuickWKT, 安装过程不再详述,自行百度。输入wkt字符串,点击Ok会自动新建一个图层并显示图形名为“QuickWKT”,我们随便点击该图斑一个地方,都是整体被选中,说明我们已经将多个要素转为了单个MultiPolygon,需求二也就成功解决了。

1713802611662

写在最后

更多数以万计的QGIS插件可以在QGIS官网查找, 插件使用一时爽,一直用一直爽,详情链接如下 。

https://plugins.qgis.org/plugins/

相关阅读

麻辣GIS-fungis

作者:

一个努力搬砖的GISer

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子
没有下文

留言板(小编看到第一时间回复)