这是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
显然,我在做某事(简单?)。
答案 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