由于精度问题而无法在点上分割线

时间:2018-05-05 21:13:09

标签: python shapely

我正在尝试将一个点插入到Shapely中的LineString上,然后相应地拆分线串。但是,由于精度错误,Shapely认为插值点不在linestring上,因此split操作不起作用。

以下是一个例子:

from shapely.ops import split
from shapely.geometry import LineString, Point

### Initialize point and line
line = LineString([(0.123,0.456),(5.678,7.890),(12.135,6.789)])    
point = Point(4.785,8.382)   

### Interpolate point onto line
new_point = line.interpolate(line.project(point))
print new_point
>> POINT (5.593949278213755 7.777518800043393)

### BUT: line does not intersect the interpolated point
line.intersects(new_point)
>> False

### EVEN THOUGH: distance between them is essentially (not exactly) zero
line.distance(new_point)
>> 0.0

### THEREFORE: line cannot be split using the new point
len(split(line, new_point))
>> 1

我认为问题如下:
 1.我舍入原始的点/线坐标,使它们不会超出机器的精度限制  但是,INTERPOLATED点的精度非常高。我不知道如何控制它。
 3.理论上,我可以围绕这个新点的坐标,但这似乎并不能确保新点在线上。

相关问题hereherehere

2 个答案:

答案 0 :(得分:0)

我发现了一个有些狡猾的解决方案。如果有人发布更好的,我会接受。

# After the code above: 

### Create a buffer polygon around the interpolated point
buff = new_point.buffer(0.0001)

### Split the line on the buffer
first_seg, buff_seg, last_seg = split(line,buff)

### Stitch together the first segment, the interpolated point, and the last segment 
line = LineString(list(first_seg.coords) + list(new_point.coords) + list(last_seg.coords))

line.intersects(new_point)
>> True

答案 1 :(得分:0)

我用上面的代码尝试了一下,但是有时由于大量分割结果而失败了……显然,创建的多边形将线分成数个点,不知道为什么。

我改用snap函数,它似乎可以工作:

    snap(line_to_modify,closest_point,0.01)

返回的值是修改后的几何图形,其中包含最近的点。首先,您需要使用项目和插值法来找到不在直线上的最近点。您可以将其与相交