• 要素类WKT文本获取


    要素类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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    输出内容如下。

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

    写在最后

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

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

  • 相关阅读:
    OpenCV透视变换——将斜方向的图片转成正方向鸟瞰图
    【大数据采集技术与应用】【第一章】【大数据采集技术与应用概述】
    【算法题】小红书2023秋招提前批算法真题解析
    基础 | NIO - [Selector]
    运行 Python 脚本/代码的几种方式
    Win11 安装 Vim
    APS智能排产在电缆行业的应用
    【学生管理系统】整合JWT(完)
    java23种设计模式与追MM
    小程序多少钱?一个小程序多少钱?
  • 原文地址:https://blog.csdn.net/qq_41441896/article/details/138146677