Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 由于精度问题,Shapely无法在点上分割线_Python_Shapely - Fatal编程技术网

Python 由于精度问题,Shapely无法在点上分割线

Python 由于精度问题,Shapely无法在点上分割线,python,shapely,Python,Shapely,我试图在线串上以形状插入一个点,然后相应地分割线串。但是,由于精度错误,Shapely认为插值点不在行字符串上,因此拆分操作不起作用 以下是一个例子: 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)])

我试图在
线串
上以形状插入一个点,然后相应地分割线串。但是,由于精度错误,Shapely认为插值点不在
行字符串
上,因此
拆分
操作不起作用

以下是一个例子:

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.我将原始点/线坐标四舍五入,这样它们就不会超出机器的精度限制。
2.但是,插值点具有非常高的精度。我不知道如何控制这一切。
3.理论上,我可以对这个新点的坐标进行四舍五入,但这似乎也不能确保新点在直线上


相关问题,以及。

我想出了一个有点老套的解决方案。如果有人发布更好的,我会接受

# 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

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

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

    snap(line_to_modify,closest_point,0.01)
返回的值是修改后的几何图形,其中包含最近的点。首先,需要使用“投影”和“插值”来查找不在直线中的最近点。那你就可以用intersect了