test_linear_referencing.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import unittest
  2. import pytest
  3. import shapely
  4. from shapely.geometry import LineString, MultiLineString, Point
  5. class LinearReferencingTestCase(unittest.TestCase):
  6. def setUp(self):
  7. self.point = Point(1, 1)
  8. self.line1 = LineString([(0, 0), (2, 0)])
  9. self.line2 = LineString([(3, 0), (3, 6)])
  10. self.multiline = MultiLineString(
  11. [list(self.line1.coords), list(self.line2.coords)]
  12. )
  13. def test_line1_project(self):
  14. assert self.line1.project(self.point) == 1.0
  15. assert self.line1.project(self.point, normalized=True) == 0.5
  16. def test_alias_project(self):
  17. assert self.line1.line_locate_point(self.point) == 1.0
  18. assert self.line1.line_locate_point(self.point, normalized=True) == 0.5
  19. def test_line2_project(self):
  20. assert self.line2.project(self.point) == 1.0
  21. assert self.line2.project(self.point, normalized=True) == pytest.approx(
  22. 0.16666666666, 8
  23. )
  24. def test_multiline_project(self):
  25. assert self.multiline.project(self.point) == 1.0
  26. assert self.multiline.project(self.point, normalized=True) == 0.125
  27. def test_not_supported_project(self):
  28. with pytest.raises(shapely.GEOSException, match="IllegalArgumentException"):
  29. self.point.buffer(1.0).project(self.point)
  30. def test_not_on_line_project(self):
  31. # Points that aren't on the line project to 0.
  32. assert self.line1.project(Point(-10, -10)) == 0.0
  33. def test_line1_interpolate(self):
  34. assert self.line1.interpolate(0.5).equals(Point(0.5, 0.0))
  35. assert self.line1.interpolate(-0.5).equals(Point(1.5, 0.0))
  36. assert self.line1.interpolate(0.5, normalized=True).equals(Point(1, 0))
  37. assert self.line1.interpolate(-0.5, normalized=True).equals(Point(1, 0))
  38. def test_alias_interpolate(self):
  39. assert self.line1.line_interpolate_point(0.5).equals(Point(0.5, 0.0))
  40. assert self.line1.line_interpolate_point(-0.5).equals(Point(1.5, 0.0))
  41. assert self.line1.line_interpolate_point(0.5, normalized=True).equals(
  42. Point(1, 0)
  43. )
  44. assert self.line1.line_interpolate_point(-0.5, normalized=True).equals(
  45. Point(1, 0)
  46. )
  47. def test_line2_interpolate(self):
  48. assert self.line2.interpolate(0.5).equals(Point(3.0, 0.5))
  49. assert self.line2.interpolate(0.5, normalized=True).equals(Point(3, 3))
  50. def test_multiline_interpolate(self):
  51. assert self.multiline.interpolate(0.5).equals(Point(0.5, 0))
  52. assert self.multiline.interpolate(0.5, normalized=True).equals(Point(3.0, 2.0))
  53. def test_line_ends_interpolate(self):
  54. # Distances greater than length of the line or less than
  55. # zero yield the line's ends.
  56. assert self.line1.interpolate(-1000).equals(Point(0.0, 0.0))
  57. assert self.line1.interpolate(1000).equals(Point(2.0, 0.0))