如何解决Ramer Douglas Peucker算法应用于字符串坐标的类型错误?
解决RDP算法中坐标字符串类型的问题
核心问题原因
报错TypeError: unsupported operand type(s) for -: 'str' and 'str'是因为你的坐标列表元素都是字符串类型,而RDP算法需要基于数值计算点与折线的距离,字符串无法直接执行减法等数值运算。
解决步骤
1. 将字符串坐标转换为数值数组
先把每个'纬度,经度'格式的字符串分割为两个数值,转换成numpy数组(RDP算法通常依赖numpy数组做运算):
import numpy as np from rdp import rdp # 原始字符串坐标列表 pos = ['52,13','53,15',....,'54,16'] # 分割每个字符串并转换为float类型,生成数值数组 coords = np.array([list(map(float, p.split(','))) for p in pos])
2. 修正数组形状处理逻辑
你之前的length = len(pos)/2是错误的——pos的长度就是坐标对的总数,不需要除以2。转换后的coords已经是(466, 2)形状的二维数组,可直接用于RDP计算。
3. 应用RDP算法并控制输出点数
如果要精准得到8个坐标,需要调整RDP的epsilon参数(控制点到折线的最大距离阈值,阈值越大保留的点越少)。可以通过循环调整epsilon来匹配目标点数:
target_points = 8 epsilon = 0.1 # 初始阈值,可根据经纬度范围调整 result = rdp(coords, epsilon=epsilon) # 循环调整阈值直到得到目标点数 while len(result) != target_points: if len(result) > target_points: epsilon += 0.1 # 点数过多,增大阈值减少点数量 else: epsilon -= 0.05 # 点数过少,减小阈值增加点数量 result = rdp(coords, epsilon=epsilon) print(result)
额外说明
- 如果你的
rdp是自定义实现,要确保它接收的是数值类型数组,而非字符串数组。 - 初始epsilon的取值可根据坐标范围调整(经纬度场景下从0.1开始测试比较合适)。
内容的提问来源于stack exchange,提问作者thereiswaldo
相关产品推荐
相关产品推荐

