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
|
import unittest
import pytest
import shapely
from shapely.geometry import LineString, MultiLineString, Point
class LinearReferencingTestCase(unittest.TestCase):
def setUp(self):
self.point = Point(1, 1)
self.line1 = LineString([(0, 0), (2, 0)])
self.line2 = LineString([(3, 0), (3, 6)])
self.multiline = MultiLineString(
[list(self.line1.coords), list(self.line2.coords)]
)
def test_line1_project(self):
assert self.line1.project(self.point) == 1.0
assert self.line1.project(self.point, normalized=True) == 0.5
def test_alias_project(self):
assert self.line1.line_locate_point(self.point) == 1.0
assert self.line1.line_locate_point(self.point, normalized=True) == 0.5
def test_line2_project(self):
assert self.line2.project(self.point) == 1.0
assert self.line2.project(self.point, normalized=True) == pytest.approx(
0.16666666666, 8
)
def test_multiline_project(self):
assert self.multiline.project(self.point) == 1.0
assert self.multiline.project(self.point, normalized=True) == 0.125
def test_not_supported_project(self):
with pytest.raises(shapely.GEOSException, match="IllegalArgumentException"):
self.point.buffer(1.0).project(self.point)
def test_not_on_line_project(self):
# Points that aren't on the line project to 0.
assert self.line1.project(Point(-10, -10)) == 0.0
def test_line1_interpolate(self):
assert self.line1.interpolate(0.5).equals(Point(0.5, 0.0))
assert self.line1.interpolate(-0.5).equals(Point(1.5, 0.0))
assert self.line1.interpolate(0.5, normalized=True).equals(Point(1, 0))
assert self.line1.interpolate(-0.5, normalized=True).equals(Point(1, 0))
def test_alias_interpolate(self):
assert self.line1.line_interpolate_point(0.5).equals(Point(0.5, 0.0))
assert self.line1.line_interpolate_point(-0.5).equals(Point(1.5, 0.0))
assert self.line1.line_interpolate_point(0.5, normalized=True).equals(
Point(1, 0)
)
assert self.line1.line_interpolate_point(-0.5, normalized=True).equals(
Point(1, 0)
)
def test_line2_interpolate(self):
assert self.line2.interpolate(0.5).equals(Point(3.0, 0.5))
assert self.line2.interpolate(0.5, normalized=True).equals(Point(3, 3))
def test_multiline_interpolate(self):
assert self.multiline.interpolate(0.5).equals(Point(0.5, 0))
assert self.multiline.interpolate(0.5, normalized=True).equals(Point(3.0, 2.0))
def test_line_ends_interpolate(self):
# Distances greater than length of the line or less than
# zero yield the line's ends.
assert self.line1.interpolate(-1000).equals(Point(0.0, 0.0))
assert self.line1.interpolate(1000).equals(Point(2.0, 0.0))
|