Точность с плавающей точкой вызывает проблемы в методе интерполяции Shapely
Я пытаюсь разрезать простую подкладку на 10 частей, используя cut
Функция описана в их документах:
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 равных участков без конечных близких к нулю строк?