This is variation of Shapely contains(point) always gives False, not a duplicate
I want to determine if a point inside a certain figure created of many points, but to start simple I do this test, which fails. I define a 2x2 square, and the first point should be inside, the second outside, but both calls return 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)
The output is
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
So obviously I'm doing something (simple?) wrong.
According to the Shapely documentation there are three fundamental types of geometric objects: points, curves, and surfaces. The LinearRing
is one of the implementations of the curve type.
Citing the docs:
A Curve has an interior set consisting of the infinitely many points along its length (imagine a Point dragged in space), a boundary set consisting of its two end points, and an exterior set of all other points. A Curve has a topological dimension of 1.
And here is what it says about object.contains(other)
method:
Returns
True
if no points of other lie in the exterior of the object and at least one point of the interior of other lies in the interior of object.
So, in your case the points Point(1, 1)
, Point(3, 3)
don't lie on the curve LinearRing([[0, 0], [2, 0], [2, 2], [0, 2]])
but outside it, in the exterior, hence your tests return False
.
In order to check if the points are enclosed by the LinearRing
, in your simple case, you could construct polygons from those rings and do the same check:
>>> Polygon(ring).contains(Point(1, 1))
True
>>> Polygon(ring).contains(Point(3, 3))
False
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments