news 2026/4/16 10:19:32

GIS 数据转换:使用 GDAL 将 TXT 转换为 Shp 数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GIS 数据转换:使用 GDAL 将 TXT 转换为 Shp 数据

前言

TXT 作为一种文本格式,可以很方便的存储一些简单几何数据。在 GIS 开发中,经常需要进行数据的转换处理,其中常见的便是将 TXT 转换为 Shp 数据进行展示。

本篇教程在之前一系列文章的基础上讲解

如如果你还没有看过,建议从以上内容开始。

1. 开发环境

本文使用如下开发环境,以供参考。

时间:2025年

系统:Windows 11

Python:3.11.7

GDAL:3.11.1

2. 数据准备

TXT(纯文本文件)是一种最基本的文件格式,仅存储无格式的文本数据,适用于各种场景(如数据交换、日志记录、配置文件等)。

如下是全国省会城市人口 TXT 文本结构:

ID,Name,Longitude,Latitude,Population
1,Beijing,116.40,39.90,2171万
2,Shanghai,121.47,31.23,2487万
3,Guangzhou,113.26,23.12,1868万
4,Shenzhen,114.05,22.55,1756万
5,Tianjin,117.20,39.08,1373万
6,Chongqing,106.50,29.53,3205万
7,Chengdu,104.06,30.67,2094万
8,Wuhan,114.30,30.60,1121万
9,Hangzhou,120.15,30.28,1194万
10,Nanjing,118.78,32.04,931万
11,Xi'an,108.93,34.27,1295万
12,Changsha,112.97,28.20,839万
13,Zhengzhou,113.62,34.75,1260万
14,Harbin,126.63,45.75,1076万
15,Shenyang,123.43,41.80,831万
16,Qingdao,120.38,36.07,1007万
17,Dalian,121.62,38.92,745万
18,Xiamen,118.08,24.48,516万
19,Ningbo,121.55,29.88,854万
20,Hefei,117.28,31.86,937万
21,Fuzhou,119.30,26.08,829万
22,Jinan,117.00,36.67,920万
23,Taiyuan,112.55,37.87,530万
24,Changchun,125.35,43.88,906万
25,Kunming,102.72,25.04,846万
26,Nanning,108.37,22.82,874万
27,Lanzhou,103.82,36.06,435万
28,Yinchuan,106.27,38.47,285万
29,Xining,101.77,36.62,263万
30,Urümqi,87.62,43.82,405万
31,Lhasa,91.11,29.65,86万
32,Haikou,110.20,20.05,287万

3. 导入依赖

TXT作为一种矢量数据格式,可以使用矢量库OGR进行处理,以实现TXT数据从文本格式转换为Shp格式。其中还涉及坐标定义,所以还需要引入osr模块。

from osgeo import ogr,osr
import os
import csv

4. 数据读取与转换

定义一个方法Txt2Shp(txtPath,shpPath,encoding="UTF-8")用于将TXT数据转换为Shp数据。

"""
说明:将 TXT 文件转换为 Shapfile 文件
参数:
-txtPath:TXT 文件路径
-shpPath:Shp 文件路径
-encoding:TXT 文件编码
"
""
def Txt2Shp(txtPath,shpPath,encoding="UTF-8")

在进行TXT数据格式转换之前,需要检查数据路径是否存在。

# 检查文件是否存在
ifos.path.exists(txtPath):
print("TXT 文件存在。")
else:
print("TXT 文件不存在,请重新选择文件!")
return

通过GetDriverByName获取Shp数据驱动,并使用os.path.exists方法检查Shp文件是否已经创建,如果存在则将其删除。

# 注册所有驱动
ogr.RegisterAll()

# 添加Shp数据源
shpDriver = ogr.GetDriverByName('ESRI Shapefile')

ifos.path.exists(shpPath):
try:
shpDriver.DeleteDataSource(shpPath)
print("文件已删除!")
except Exception as e:
print(f"文件删除出错:{e}")
returnFalse

接着创建Shp数据源和空间参考,数据坐标系这里定义为4326。

# 创建Shp数据源
shpDataSource = shpDriver.CreateDataSource(shpPath)
ifshpDataSource is None:
print("无法创建Shp数据源,请检查文件!")
returnfalse
# 创建空间参考
spatialReference = osr.SpatialReference()
spatialReference.ImportFromEPSG(4326)

之后通过数据源方法CreateLayer创建Shp图层,使用图层方法CreateField添加属性字段,需要定义属性名称以及属性字段类型。

# 创建图层
shpLayer = shpDataSource.CreateLayer("points",spatialReference,ogr.wkbPoint)

# 添加图层字段
shpLayer.CreateField(ogr.FieldDefn("ID",ogr.OFTString))
shpLayer.CreateField(ogr.FieldDefn("Name",ogr.OFTString))
shpLayer.CreateField(ogr.FieldDefn("Longitude",ogr.OFTReal))
shpLayer.CreateField(ogr.FieldDefn("Latitude",ogr.OFTReal))
shpLayer.CreateField(ogr.FieldDefn("Population",ogr.OFTString))

读取TXT数据并将其转换为Shapefile数据,在打开数据时,根据TXT文件属性,使用逗号分隔符进行读取并跳过表头行数据。之后根据行数据进行属性遍历,将读取的字段值和几何属性写入到要素对象中。

# 读取TXT文件
with open(txtPath,"r",encoding=encoding) as txtFile:
# 根据逗号分隔符进行读取
reader = csv.reader(txtFile,delimiter=",")
# 跳过表头
header = next(reader)
# 遍历记录
forrowinreader:
print(f"要素记录:{row}")
# 创建要素
feature = ogr.Feature(shpLayer.GetLayerDefn())

# 根据图层字段写入属性
feature.SetField("ID",str(row[0]))
feature.SetField("Name",str(row[1]))
feature.SetField("Longitude",float(row[2]))
feature.SetField("Latitude",float(row[3]))
feature.SetField("Population",str(row[4]))

# 创建几何对象
wkt = f"POINT({float(row[2])} {float(row[3])})"
pointGeom = ogr.CreateGeometryFromWkt(wkt)

feature.SetGeometry(pointGeom)

# 将要素添加到图层
shpLayer.CreateFeature(feature)
feature = None

CreateCpgFile2Encode(shpPath,encoding)
# 释放数据资源
shpDataSource = None

其中CreateCpgFile2Encode方法用于创建字符编码文件,后缀名为.cpg

"""
说明:创建.cpg文件指定字符编码
参数:
-shpPath:Shp文件路径
-encoding:Shp文件字符编码
"
""
def CreateCpgFile2Encode(shpPath,encoding):
fileName = os.path.splitext(shpPath)[0]
cpgFile = fileName +".cpg"

with open(cpgFile,"w",encoding=encoding) as f:
f.write(encoding)
print(f"成功创建编码文件: {cpgFile}")

程序成功转换数据显示如下:

使用ArcMap打开显示结果如下:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 13:03:34

LangFlow中的A/B测试节点:比较不同提示词效果

LangFlow中的A/B测试节点:比较不同提示词效果 在构建基于大语言模型(LLM)的应用时,一个看似微小的改动——比如把“请解释”换成“你能告诉我吗?”——可能显著影响输出质量。然而,在实际开发中&#xff0c…

作者头像 李华
网站建设 2026/4/8 23:38:46

CANFD协议控制字段功能逐项解读

深入CAN FD控制字段:一位嵌入式工程师的实战解析最近在调试一个ADAS雷达节点时,我遇到了一个奇怪的问题:明明发送的是64字节的数据帧,接收端却只收到了8个字节,还报了CRC错误。花了整整两天排查硬件、示波器抓波形、翻…

作者头像 李华
网站建设 2026/4/16 6:36:19

LangFlow与用药提醒系统结合:慢性病患者管理工具

LangFlow与用药提醒系统结合:慢性病患者管理工具 在慢性病管理的日常实践中,一个看似简单却影响深远的问题始终存在:患者是否按时服药?据世界卫生组织统计,慢性病患者的平均用药依从性不足50%。这意味着,超…

作者头像 李华
网站建设 2026/4/6 23:25:28

LangFlow与简历筛选结合:HR招聘流程智能化

LangFlow与简历筛选结合:HR招聘流程智能化 在企业招聘一线,HR每天面对成百上千份简历,却仍不得不花费大量时间逐字阅读、手动比对岗位要求。这种高度重复的初筛工作不仅效率低下,还容易因疲劳导致误判。更棘手的是,当业…

作者头像 李华
网站建设 2026/4/11 11:28:11

新手必看:避免Keil中文注释乱码的三个关键步骤

告别中文乱码:Keil开发中字体编码的“坑”与实战解决方案你有没有遇到过这种情况?昨晚还在认真写代码,给每个函数都加上了清晰的中文注释,比如// 控制LED亮灭。第二天打开Keil,满屏变成// ???LED???——心一凉&a…

作者头像 李华
网站建设 2026/4/15 10:57:40

19、网络流量路由与过滤:Windows Server 2008 配置指南

网络流量路由与过滤:Windows Server 2008 配置指南 在网络管理中,合理配置网络流量的路由和过滤至关重要。本文将详细介绍 Windows Server 2008 中需求拨号路由、RIP 管理、数据包过滤以及 Windows 防火墙等方面的配置方法和相关要点。 1. 配置需求拨号路由 当创建了需求拨…

作者头像 李华