import shapely.geometry as sg
def polygon_intersect_x(poly, x_val):
"""
Find the intersection points of a vertical line at
x=`x_val` with the Polygon `poly`.
"""
if x_val < poly.bounds[0] or x_val > poly.bounds[2]:
raise ValueError('`x_val` is outside the limits of the Polygon.')
if isinstance(poly, sg.Polygon):
poly = poly.boundary
vert_line = sg.LineString([[x_val, poly.bounds[1]],
[x_val, poly.bounds[3]]])
pts = [pt.xy[1][0] for pt in poly.intersection(vert_line)]
pts.sort()
return pts
下面是一个快速而肮脏的插值示例:
请注意,如果多边形是凹的,那么
(x, miny)
-(x,maxy)
都包含在其中,以防重要。在根据@tcaswell的建议,shapely使得这一点相当简单。具体来说,该方法是计算多边形边界和所选x位置的垂直线之间的^{} (即重叠)。在
这里需要注意的一点是,shapely多边形是填充对象,因此计算这些多边形与直线的重叠将返回多边形内部的直线段。因此,要得到垂直线与多边形边缘相交的点,计算多边形的^{} 属性与垂直线的交集可能是最简单的。在
实施
以下函数返回输入多边形与指定x值处垂直线的交点:
示例用法
首先创建一个示例
^{pr2}$shapely.geometry.Polygon
:请注意,还可以通过以下方式创建shapely对象: a) wrapping NumPy arrays to shapely types, b) 将MPL路径转换为shapely多边形
p = sg.Polygon(my_path.vertices)
。在上述函数现在可用于计算最小/最大交点,如下所示:
下面是一个简单的图来演示这种方法:
相关问题 更多 >
编程相关推荐