检查LinearRing是否包含点在Shapely中始终返回False

时间:2019-05-23 08:06:40

标签: python shapely

这是Shapely contains(point) always gives False的变体,不是重复的

我想确定某个图形内的某个点是否由许多点创建,但是从简单开始,我进行了此测试,但失败了。我定义了一个2x2的正方形,第一个点应该在内部,第二个点应该在外部,但是两个调用都返回False

import unittest
from shapely.geometry import LineString,Point,LinearRing
class TestTools(unittest.TestCase):
    def test_isInside(self):
        points = [
            [0,0],
            [2,0],
            [2,2],
            [0,2]
        ]
        ring=LinearRing(points)
        print(ring)
        print(Point(1,2))
        self.assertEqual(ring.contains(Point(1,1)),True) 
        self.assertEqual(ring.contains(Point(3,3)),False)

输出为

LINEARRING (0 0, 2 0, 2 2, 0 2, 0 0)
POINT (1 2)
======================================================================
FAIL: test_isInside (__main__.TestTools)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_tools.py", line 17, in test_isInside
    self.assertEqual(ring.contains(Point(1,1)),True)
AssertionError: False != True

显然,我在做某事(简单?)。

1 个答案:

答案 0 :(得分:1)

根据Shapely documentation,存在三种基本的几何对象类型:点,曲线和曲面。 LinearRing是曲线类型的一种实现。

引用文档:

  

曲线具有一个 interior 集,该集合由沿其长度的无限多个点组成(想象一个 Point 在空间中拖动),一个<由两个端点组成的em> boundary 集,以及由所有其他端点组成的 exterior 集。 曲线的拓扑维数为1。

关于object.contains(other)方法的内容如下:

  

如果 other 的任何点都没有位于 object 的外部且内部至少有一个点 other True。 em>位于 object 的内部。

因此,在您的情况下,点Point(1, 1)Point(3, 3)不在曲线LinearRing([[0, 0], [2, 0], [2, 2], [0, 2]])上,而是在曲线的外部,外部,因此测试返回False

为了检查点是否被LinearRing包围,在您的简单情况下,您可以从这些环构造polygons并进行相同的检查:

>>> Polygon(ring).contains(Point(1, 1))
True

>>> Polygon(ring).contains(Point(3, 3))
False