test_prepared.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import numpy as np
  2. import pytest
  3. from shapely.geometry import Point, Polygon
  4. from shapely.prepared import PreparedGeometry, prep
  5. def test_prepared_geometry():
  6. polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])
  7. p = PreparedGeometry(polygon)
  8. assert p.contains(Point(0.5, 0.5))
  9. assert not p.contains(Point(0.5, 1.5))
  10. def test_prep():
  11. polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])
  12. p = prep(polygon)
  13. assert p.contains(Point(0.5, 0.5))
  14. assert not p.contains(Point(0.5, 1.5))
  15. def test_op_not_allowed():
  16. p = PreparedGeometry(Point(0.0, 0.0).buffer(1.0))
  17. with pytest.raises(TypeError):
  18. Point(0.0, 0.0).union(p)
  19. def test_predicate_not_allowed():
  20. p = PreparedGeometry(Point(0.0, 0.0).buffer(1.0))
  21. with pytest.raises(TypeError):
  22. Point(0.0, 0.0).contains(p)
  23. def test_prepared_predicates():
  24. # check prepared predicates give the same result as regular predicates
  25. polygon1 = Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)])
  26. polygon2 = Polygon([(0.5, 0.5), (1.5, 0.5), (1.0, 1.0), (0.5, 0.5)])
  27. point2 = Point(0.5, 0.5)
  28. polygon_empty = Polygon()
  29. prepared_polygon1 = PreparedGeometry(polygon1)
  30. for geom2 in (polygon2, point2, polygon_empty):
  31. with np.errstate(invalid="ignore"):
  32. assert polygon1.disjoint(geom2) == prepared_polygon1.disjoint(geom2)
  33. assert polygon1.touches(geom2) == prepared_polygon1.touches(geom2)
  34. assert polygon1.intersects(geom2) == prepared_polygon1.intersects(geom2)
  35. assert polygon1.crosses(geom2) == prepared_polygon1.crosses(geom2)
  36. assert polygon1.within(geom2) == prepared_polygon1.within(geom2)
  37. assert polygon1.contains(geom2) == prepared_polygon1.contains(geom2)
  38. assert polygon1.contains_properly(
  39. geom2
  40. ) == prepared_polygon1.contains_properly(geom2)
  41. assert polygon1.overlaps(geom2) == prepared_polygon1.overlaps(geom2)
  42. def test_prepare_already_prepared():
  43. polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])
  44. prepared = prep(polygon)
  45. # attempt to prepare an already prepared geometry with `prep`
  46. result = prep(prepared)
  47. assert isinstance(result, PreparedGeometry)
  48. assert result.context is polygon
  49. # attempt to prepare an already prepared geometry with `PreparedGeometry`
  50. result = PreparedGeometry(prepared)
  51. assert isinstance(result, PreparedGeometry)
  52. assert result.context is polygon