匀称的Python:查找线串和多边形接触的位置

时间:2018-09-20 17:00:29

标签: python shapely boolean-operations touches

我正在整形地处理几何图形。我无法找到LineString刚接触多边形外部的点。我一直在使用“触摸”功能,但它似乎并不总是有效。

根据Shapely用户手册:

  

object.touches(其他)​​

     

如果对象具有至少一个共同点并且其内部不与另一点的任何部分相交,则返回True。

作为参考,请考虑以下两个示例。一种有效,另一种无效。

from shapely.geometry import Polygon
from shapely.speedups._speedups import LineString
from matplotlib import pyplot as plt

examples = {
    "Example 1": {
        "poly_coords": [(-1, -1), (-1, 1), (1, 1), (1, -1), (-1, -1)],
        "line_coords": [(1, 0), (2, 0)]
    },
    "Example 2": {
        "poly_coords": [(336.2, 326.0), (337.65, 338.15), (333.84, 338.8), (333.78, 338.76), (333.14, 338.39),
                        (331.98, 337.77), (331.25, 337.42), (330.05, 336.91), (329.3, 336.63), (328.09, 336.23),
                        (327.27, 335.99), (326.02, 335.69), (325.16, 335.54), (323.92, 335.36), (323.03, 335.28),
                        (321.76, 335.22), (321.19, 335.22), (321.8, 334.9), (322.12, 334.72), (323.64, 333.86),
                        (323.96, 333.68), (325.53, 332.72), (325.84, 332.51), (327.29, 331.53), (327.61, 331.31),
                        (329.01, 330.28), (329.33, 330.04), (330.68, 328.96), (331.0, 328.7), (332.27, 327.58),
                        (332.45, 327.42), (336.2, 326.0)],
        "line_coords": [(336.92499999999995, 332.075), (339.80456651646705, 331.731348028899)]
    }
}
for example_key, ex in examples.items():

    poly = Polygon(ex["poly_coords"])
    line = LineString(ex["line_coords"])
    print("{1} {0} {1}".format(example_key, "#" * 20))
    print(line.touches(poly))
    print(line.intersection(poly))
    print(line.overlaps(poly))

    xpoly, ypoly = poly.exterior.xy
    xline, yline = zip(*ex["line_coords"])
    plt.figure()
    plt.title(example_key)
    plt.fill(xpoly, ypoly, alpha=0.5, fc='r')
    plt.plot(xline, yline)
plt.show()

示例代码的输出如下。为什么“触摸”在示例1中返回True,而在示例2中返回False?他们不应该一样吗?

#################### Example 2 ####################
False
POINT (336.925 332.075)
#################### Example 1 ####################
True
POINT (1 0)

以下是生成的图像:

enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

我认为答案就在定义中:

  

object.touches(其他)​​

     

如果对象具有至少一个共同点并且其内部不与另一点的任何部分相交,则返回True。

我怀疑通过仔细检查,您会发现line_string与多边形重叠,而不仅仅是触摸它。这将导致它无法通过定义中的and语句的第二子句,因为直线上的多个点与多边形隐含相交。