我试图将一个点插入到LineStringShapely 中,然后相应地分割线串。但是,由于精度误差,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
Run Code Online (Sandbox Code Playgroud)
我认为问题如下:
1.我对原始点/线坐标进行了舍入,这样它们就不会达到机器的精度限制。
2. 但是INTERPOLATED点的精度非常高。我不知道如何控制这个。
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
Run Code Online (Sandbox Code Playgroud)
小智 5
我尝试使用上面的代码,但有时由于大量分割结果而失败......显然创建的多边形将线分成几个点,不知道为什么。
我使用了 snap 函数,它似乎有效:
snap(line_to_modify,closest_point,0.01)
Run Code Online (Sandbox Code Playgroud)
返回的值是修改后的几何图形,其中包含最近的点。首先,您需要使用投影和插值来找到不在直线上的最近点。你可以用 intersect 来验证它