如何解析含LINESTRING的字符串提取X/Y坐标用于matplotlib绘图?
解决方法
核心逻辑
你手里的数据是带WKT格式LINESTRING的CSV类结构,不需要复杂的第三方库,用正则匹配筛选+字符串拆分就能完成解析,全程可以结合numpy做数值转换:
- 首先从每行里匹配地铁线路标识,筛选出U4对应的所有行
- 提取LINESTRING括号内的坐标串,拆分得到所有(x,y)点
- 转成numpy数组后直接用matplotlib绘图
可运行代码示例
import re import numpy as np import matplotlib.pyplot as plt # 假设你的3000行原始数据存在raw_lines列表中 raw_lines = [ 'OFFD.271818,271818,"LINESTRING (16.303895355263016 48.18772778239529, 16.304571765172827 48.18758202488568, 16.30482300975865 48.18755484403183, 16.305031079294384 48.187546649202545, 16.30536730486924 48.187533407177206, 16.307523452290432 48.18753396398144, 16.309072536732444 48.18748514596115, 16.312777938045286 48.18734458451529, 16.313426882251083 48.18727411748434, 16.315405366265555 48.186920966444205, 16.316609208646593 48.18670268519608, 16.317260447683868 48.18652861710351, 16.31853471535412 48.186166775088815)",U4,4,U-Bahn,' ] u4_x = [] u4_y = [] # 正则规则:匹配LINESTRING内容、匹配线路标识 line_re = re.compile(r'LINESTRING \((.*?)\)') route_re = re.compile(r',(U\d+),\d+,U-Bahn,') for line in raw_lines: # 先筛选U4的行 route_match = route_re.search(line) if not route_match or route_match.group(1) != 'U4': continue # 提取坐标串 coord_match = line_re.search(line) if not coord_match: continue coord_str = coord_match.group(1) # 拆分每个坐标点 for point_str in coord_str.split(', '): x, y = map(float, point_str.strip().split(' ')) u4_x.append(x) u4_y.append(y) # 转numpy数组 u4_x = np.array(u4_x) u4_y = np.array(u4_y) # 绘图 plt.figure(figsize=(10,6)) plt.plot(u4_x, u4_y, c='#0055aa', linewidth=2, label='U4 Line') plt.xlabel('Longitude') plt.ylabel('Latitude') plt.title('U-Bahn U4 Route') plt.legend() plt.axis('equal') # 避免坐标拉伸变形 plt.show()
注意事项
- 如果你的原始数据是从文件读取的,直接用
open()逐行读取替换raw_lines即可 - 正则已经规避了LINESTRING内部逗号和外层CSV逗号的冲突问题,不需要额外处理双引号
- 绘图时加
plt.axis('equal')可以保证地理坐标的比例不会失真
内容的提问来源于stack exchange,提问作者Div_st_mil
相关产品推荐
相关产品推荐

