python - 浮点精度导致 Shapely interpolate 方法出现问题
问题描述
我正在尝试使用他们文档cut
中描述的 shapely 函数将一个简单的线串切成 10 块:
def cut(line, distance):
# Cuts a line in two at a distance from its starting point
if distance <= 0.0 or distance >= line.length:
return [shapely.geometry.LineString(line)]
coords = list(line.coords)
for i, p in enumerate(coords):
pd = line.project(shapely.geometry.Point(p))
if pd == distance:
return [
shapely.geometry.LineString(coords[:i+1]),
shapely.geometry.LineString(coords[i:])]
if pd > distance:
cp = line.interpolate(distance)
return [
shapely.geometry.LineString(coords[:i] + [(cp.x, cp.y)]),
shapely.geometry.LineString([(cp.x, cp.y)] + coords[i:])]
我使用另一个函数来调用上述函数,因为该cut
函数仅根据插值点将一条线分成两段:
def split_linestring(linestring, split_length):
#cuts a linestring in length/split_length number of segments
length = linestring.length
result_list = []
if length>split_length:
while length > split_length:
two_segment_list = cut(linestring,split_length)
length = two_segment_list[1].length
result_list.append(two_segment_list[0])
#print two_segment_list[0].length
linestring = two_segment_list[1]
result_list.append(two_segment_list[1])
else:
result_list.append(linestring)
return result_list
我编写了以下小测试来检查线串对象的输出列表及其各自的长度:
A = shapely.geometry.Point(0, 0)
B = shapely.geometry.Point(2, 0)
AB = shapely.geometry.LineString([A, B])
split_length =Decimal('0.2')
#split_length = 0.2
r = split_linestring(AB, split_length)
for item in r:
print item.length
输出列表看起来不错,但最后一个线串的长度接近零:
0.2
0.2
0.2
0.2
0.2
0.2
0.2
0.2
0.2
0.2
2.22044604925e-16
我怀疑这是舍入错误,但很难跟踪哪里或为什么。我怎样才能将我的线分成 10 个相等的部分,而没有尾随接近零的线串?
解决方案
推荐阅读
- javascript - 如何在 react-native webView 和 React web-app 之间进行通信?
- python - 使用 Python 抓取谷歌搜索结果
- node.js - 进行更改时 ts-node-dev 未重新启动
- python - 如何在列表列表中随机替换列表之间的元素
- python - Beautiful Soup findAll() 找到其中的一半
- r - R - 将字符串添加到列表
- symfony - DoctrineMigrationsBundle 3.0.1:元数据存储不是最新的
- python - 如何在 Django 中测试模型字段类型?
- python - 如果第一个值重复,如何从 csv 中删除下一行
- c# - 为什么 XElement(XName, Object[]) 对这些 XElement 集合的处理方式不同?