test_predicates.py 2.9 KB

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