You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:55:24