1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
"""Test GEOS predicates"""
import unittest
import pytest
import shapely
from shapely import geos_version
from shapely.geometry import Point, Polygon
class PredicatesTestCase(unittest.TestCase):
def test_binary_predicates(self):
point = Point(0.0, 0.0)
point2 = Point(2.0, 2.0)
assert point.disjoint(Point(-1.0, -1.0))
assert not point.touches(Point(-1.0, -1.0))
assert not point.crosses(Point(-1.0, -1.0))
assert not point.within(Point(-1.0, -1.0))
assert not point.contains(Point(-1.0, -1.0))
assert not point.equals(Point(-1.0, -1.0))
assert not point.touches(Point(-1.0, -1.0))
assert point.equals(Point(0.0, 0.0))
assert point.covers(Point(0.0, 0.0))
assert point.covered_by(Point(0.0, 0.0))
assert not point.covered_by(point2)
assert not point2.covered_by(point)
assert not point.covers(Point(-1.0, -1.0))
def test_unary_predicates(self):
point = Point(0.0, 0.0)
assert not point.is_empty
assert point.is_valid
assert point.is_simple
assert not point.is_ring
assert not point.has_z
def test_binary_predicate_exceptions(self):
p1 = [
(339, 346),
(459, 346),
(399, 311),
(340, 277),
(399, 173),
(280, 242),
(339, 415),
(280, 381),
(460, 207),
(339, 346),
]
p2 = [
(339, 207),
(280, 311),
(460, 138),
(399, 242),
(459, 277),
(459, 415),
(399, 381),
(519, 311),
(520, 242),
(519, 173),
(399, 450),
(339, 207),
]
g1 = Polygon(p1)
g2 = Polygon(p2)
assert not g1.is_valid
assert not g2.is_valid
if geos_version < (3, 13, 0):
with pytest.raises(shapely.GEOSException):
g1.within(g2)
else: # resolved with RelateNG
assert not g1.within(g2)
def test_relate_pattern(self):
# a pair of partially overlapping polygons, and a nearby point
g1 = Polygon([(0, 0), (0, 1), (3, 1), (3, 0), (0, 0)])
g2 = Polygon([(1, -1), (1, 2), (2, 2), (2, -1), (1, -1)])
g3 = Point(5, 5)
assert g1.relate(g2) == "212101212"
assert g1.relate_pattern(g2, "212101212")
assert g1.relate_pattern(g2, "*********")
assert g1.relate_pattern(g2, "2********")
assert g1.relate_pattern(g2, "T********")
assert not g1.relate_pattern(g2, "112101212")
assert not g1.relate_pattern(g2, "1********")
assert g1.relate_pattern(g3, "FF2FF10F2")
# an invalid pattern should raise an exception
with pytest.raises(shapely.GEOSException, match="IllegalArgumentException"):
g1.relate_pattern(g2, "fail")
|