2. 基于arcpy将WKT转为gdb文件和shp文件

相信做过GIS相关的实习,或者参加了GIS相关工作的小伙伴都能感受得到,公司里GIS领域常用到的GIS数据,不仅仅是学校里那种小规模的shp数据了,而是大量的本地GDB数据,数据库WKT字符串或WKB二进制字符串,以及互联网之间传输的GeoJSON字符串。本文的目标是,基于ArcMap提供的Python包arcpy,将CSV文件中多个WKT字符串(几何地理空间对象数据),导出并合并为一个gdb文件,从而再进一步导出为shp文件。

1.WKT是什么

  • 什么是WKT?一言以蔽之。与ArcGIS中常用的数据文件“shapefile”(下文简称shp)文件一样,WKT、WKB、GeoJSON都是记录、描述、存储地理空间矢量几何数据(点、线、面地理空间坐标及其属性)的一种数据格式。

  • 边里对这几种数据格式进行一个简要的说明:

    • WKT,英文名是Well-known text,这是一种由开放地理空间联盟(OGC)制定的文本标记语言,其作用是用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。

    • WKB,即Well-known binary,是WKT的二进制表示方式,一般用于数据库中存储和互联网传输矢量几何对象数据。在PostgreSQL地理空间数据库中大量的使用WKB字符串来存储矢量数据的几何信息。在开发WEB网站时,后台可以使用PostgreSQL数据库的插件POSTGIS,将WKB字符串转换为GeoJSON字符串,这样前端地图框架,如MapBOX、OpenLayers可以直接绘制矢量数据。

    • GeoJSON,是一种以JSON格式存储矢量几何对象数据的文本。本质上是一个符号JSON标准的JSON字符串。存储为文件时,GeoJSON数据文件的文件后缀名通常是.geojson,或与普通的JSON文件一样是.json

  • WKT、WKB、GeoJSON数据张什么样子?如下图所示即是,这里的数据如在ArcGIS里则是一条线。该图是一个在线的WKT、WKB、GeoJSON相互转换的网站:http://kostas.krevatas.net/wkt-wkb-geojson-convert-online/
    在这里插入图片描述

2.WKT转gdb文件和shp文件

  • 利用ArcMap提供的arcpy包,可以将WKT、WKB、GeoJSON等数据读取为Geometry,然后另存到gdb数据库文件中。在ArcCatalog,打开gdb数据库文件,然后选中目标图层,并单击鼠标右键,利用“Export”——>“Convert to Shapfile”菜单功能,即可将gdb数据库文件中的图层要素,另存为shp文件。

  • 下图是本文操作的原始数据的部分截图,可以认为这些数据来自于数据库的一张数据表,其中“COORDINATES”字段存储的数据就是矢量地理空间几何对象,相当于ArcMap中看到的点线面,而其他字段则组成了ArcMap中图层对应的属性表。该文件中每一行都是以一个WKT字符串,也就是说,每一行都可能是一个或多个的点、或者线、或者面数据。这里附上小编编写的Python代码。各行代码的含义,详见代码中的注释。
    在这里插入图片描述

# -*- coding: utf-8 -*-

'''
@ DESC: Convert multiple WKT to a GDB file and a shapefile file.
@ AUTHOR: xingrui94
@ AUTHOR:2021-04-26
'''

import csv

import arcpy

def wkt2geometry(filename, save_db, save_feature_name, id_filed_idx = None, wkt_field_idx = None):
    '''
    '''
    # 避免多次运行时,报文件已存在的错误,这里设置为重复时则覆盖源文件
    arcpy.env.overwriteOutput=True
    # 将运行的工作空间设置为事先手动建立好的GDB数据库
    arcpy.env.workspace = save_db
    features_list = []
    
    # 首先使用Python自带的CSV模块读取CSV文件中的原始数据
    with open(filename, "r") as f:
        f_iter = csv.reader(f)
        #
        fields = next(f_iter)
        for record in f_iter:
            # 很关键,获取几何元素的id,也就是每一行,即每条记录的id
            
            record_id = record[id_filed_idx]
            # 这句是核心代码,从WKT字符串创建一个几何对象Geometry
            geometry = arcpy.FromWKT(record[wkt_field_idx])
            
            # 加一个前缀,避免跟上边的记录id重复
            feature = "_" + record_id
            # 根据原始数据,为即将生成的矢量图层属性表定义字段
            arcpy.CopyFeatures_management(geometry, feature)
            arcpy.AddField_management(feature, "ID_FIELD", "TEXT", 12, "", "", "ID_FIELD", "NULLABLE")
            arcpy.AddField_management(feature, "DEFAULTTIME", "DATE")
            arcpy.AddField_management(feature, "DATASOURCE", "TEXT")
            arcpy.AddField_management(feature, "DATA_ID", "TEXT")
            arcpy.AddField_management(feature, "VERS", "TEXT")

            # 使用字段计算方式,根据唯一的矢量元素id,计算各个字段的值。
            try:
                arcpy.CalculateField_management(feature, "ID_FIELD", '"' + record_id + '"', "PYTHON")
                arcpy.CalculateField_management(feature, "DEFAULTTIME", '"' + record[1] + '"', "PYTHON")
                arcpy.CalculateField_management(feature, "DATASOURCE", '"' + record[2] + '"', "PYTHON")
                arcpy.CalculateField_management(feature, "DATA_ID", '"' + record[2] + '"', "PYTHON")
                arcpy.CalculateField_management(feature, "VERS", '"' + record[4] + '"', "PYTHON")
            except Exception, e:
                print e
            
            # 将当前计算完的矢量元素(Feature)保存到列表里,以备后边合并
            features_list.append(feature)
            del geometry
        
        # 合并列表中的所有矢量元素
        arcpy.Merge_management(features_list, save_feature_name)
        # 从内存释放资源
        for i in features_list:
            arcpy.Delete_management(i, "")
        del features_list

def main():
    # 为了安全,这里用的文件名是一个虚拟的文件名
    filename = u"C:\\Users\\xrui94\\Desktop\\转shp\\******g_i_lrrl(1).csv"
    save_db = r'C:\Users\xrui94\Documents\ArcGIS\test.gdb'
    save_feature_name = "all_features"
    id_filed_idx = 0
    wkt_field_idx = -1
    wkt2geometry(filename, save_db, save_feature_name, id_filed_idx = id_filed_idx, wkt_field_idx = wkt_field_idx)


if __name__ == "__main__":
    main()

  • 如下图所示,这是上述Python脚本在ArcMap中运行的过程截图
    在这里插入图片描述
    在这里插入图片描述
  • 如上图所示,CSV文件中所有的WKT字符串合并为一个GDB文件后,可在ArcMap中的看到自动加载的图层,并可查看属性表。

3.关注我的微信公众号——GIS遥感研究与开发

  • 更多关于“Python编程与GIS遥感数据处理”的文章,您可以扫描以下二维码或者搜索“PyGIRS”来关注我的微信公众号:
    在这里插入图片描述
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值