174 lines
6.4 KiB
Python
174 lines
6.4 KiB
Python
import unittest
|
|
|
|
import pytest
|
|
|
|
from shapely import geometry
|
|
from shapely.constructive import BufferCapStyle, BufferJoinStyle
|
|
from shapely.geometry.base import CAP_STYLE, JOIN_STYLE
|
|
|
|
|
|
@pytest.mark.parametrize("distance", [float("nan"), float("inf")])
|
|
def test_non_finite_distance(distance):
|
|
g = geometry.Point(0, 0)
|
|
with pytest.raises(ValueError, match="distance must be finite"):
|
|
g.buffer(distance)
|
|
|
|
|
|
class BufferTests(unittest.TestCase):
|
|
"""Test Buffer Point/Line/Polygon with and without single_sided params"""
|
|
|
|
def test_empty(self):
|
|
g = geometry.Point(0, 0)
|
|
h = g.buffer(0)
|
|
assert h.is_empty
|
|
|
|
def test_point(self):
|
|
g = geometry.Point(0, 0)
|
|
h = g.buffer(1, quad_segs=1)
|
|
assert h.geom_type == "Polygon"
|
|
expected_coord = [(1.0, 0.0), (0, -1.0), (-1.0, 0), (0, 1.0), (1.0, 0.0)]
|
|
for index, coord in enumerate(h.exterior.coords):
|
|
assert coord[0] == pytest.approx(expected_coord[index][0])
|
|
assert coord[1] == pytest.approx(expected_coord[index][1])
|
|
|
|
def test_point_single_sidedd(self):
|
|
g = geometry.Point(0, 0)
|
|
h = g.buffer(1, quad_segs=1, single_sided=True)
|
|
assert h.geom_type == "Polygon"
|
|
expected_coord = [(1.0, 0.0), (0, -1.0), (-1.0, 0), (0, 1.0), (1.0, 0.0)]
|
|
for index, coord in enumerate(h.exterior.coords):
|
|
assert coord[0] == pytest.approx(expected_coord[index][0])
|
|
assert coord[1] == pytest.approx(expected_coord[index][1])
|
|
|
|
def test_line(self):
|
|
g = geometry.LineString([[0, 0], [0, 1]])
|
|
h = g.buffer(1, quad_segs=1)
|
|
assert h.geom_type == "Polygon"
|
|
expected_coord = [
|
|
(-1.0, 1.0),
|
|
(0, 2.0),
|
|
(1.0, 1.0),
|
|
(1.0, 0.0),
|
|
(0, -1.0),
|
|
(-1.0, 0.0),
|
|
(-1.0, 1.0),
|
|
]
|
|
for index, coord in enumerate(h.exterior.coords):
|
|
assert coord[0] == pytest.approx(expected_coord[index][0])
|
|
assert coord[1] == pytest.approx(expected_coord[index][1])
|
|
|
|
def test_line_single_sideded_left(self):
|
|
g = geometry.LineString([[0, 0], [0, 1]])
|
|
h = g.buffer(1, quad_segs=1, single_sided=True)
|
|
assert h.geom_type == "Polygon"
|
|
expected_coord = [(0.0, 1.0), (0.0, 0.0), (-1.0, 0.0), (-1.0, 1.0), (0.0, 1.0)]
|
|
for index, coord in enumerate(h.exterior.coords):
|
|
assert coord[0] == pytest.approx(expected_coord[index][0])
|
|
assert coord[1] == pytest.approx(expected_coord[index][1])
|
|
|
|
def test_line_single_sideded_right(self):
|
|
g = geometry.LineString([[0, 0], [0, 1]])
|
|
h = g.buffer(-1, quad_segs=1, single_sided=True)
|
|
assert h.geom_type == "Polygon"
|
|
expected_coord = [(0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
|
|
for index, coord in enumerate(h.exterior.coords):
|
|
assert coord[0] == pytest.approx(expected_coord[index][0])
|
|
assert coord[1] == pytest.approx(expected_coord[index][1])
|
|
|
|
def test_polygon(self):
|
|
g = geometry.Polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]])
|
|
h = g.buffer(1, quad_segs=1)
|
|
assert h.geom_type == "Polygon"
|
|
expected_coord = [
|
|
(-1.0, 0.0),
|
|
(-1.0, 1.0),
|
|
(0.0, 2.0),
|
|
(1.0, 2.0),
|
|
(2.0, 1.0),
|
|
(2.0, 0.0),
|
|
(1.0, -1.0),
|
|
(0.0, -1.0),
|
|
(-1.0, 0.0),
|
|
]
|
|
for index, coord in enumerate(h.exterior.coords):
|
|
assert coord[0] == pytest.approx(expected_coord[index][0])
|
|
assert coord[1] == pytest.approx(expected_coord[index][1])
|
|
|
|
def test_polygon_single_sideded(self):
|
|
g = geometry.Polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]])
|
|
h = g.buffer(1, quad_segs=1, single_sided=True)
|
|
assert h.geom_type == "Polygon"
|
|
expected_coord = [
|
|
(-1.0, 0.0),
|
|
(-1.0, 1.0),
|
|
(0.0, 2.0),
|
|
(1.0, 2.0),
|
|
(2.0, 1.0),
|
|
(2.0, 0.0),
|
|
(1.0, -1.0),
|
|
(0.0, -1.0),
|
|
(-1.0, 0.0),
|
|
]
|
|
for index, coord in enumerate(h.exterior.coords):
|
|
assert coord[0] == pytest.approx(expected_coord[index][0])
|
|
assert coord[1] == pytest.approx(expected_coord[index][1])
|
|
|
|
def test_enum_values(self):
|
|
assert CAP_STYLE.round == 1
|
|
assert CAP_STYLE.round == BufferCapStyle.round
|
|
assert CAP_STYLE.flat == 2
|
|
assert CAP_STYLE.flat == BufferCapStyle.flat
|
|
assert CAP_STYLE.square == 3
|
|
assert CAP_STYLE.square == BufferCapStyle.square
|
|
|
|
assert JOIN_STYLE.round == 1
|
|
assert JOIN_STYLE.round == BufferJoinStyle.round
|
|
assert JOIN_STYLE.mitre == 2
|
|
assert JOIN_STYLE.mitre == BufferJoinStyle.mitre
|
|
assert JOIN_STYLE.bevel == 3
|
|
assert JOIN_STYLE.bevel == BufferJoinStyle.bevel
|
|
|
|
def test_cap_style(self):
|
|
g = geometry.LineString([[0, 0], [1, 0]])
|
|
h = g.buffer(1, cap_style=BufferCapStyle.round)
|
|
assert h == g.buffer(1, cap_style=CAP_STYLE.round)
|
|
assert h == g.buffer(1, cap_style="round")
|
|
|
|
h = g.buffer(1, cap_style=BufferCapStyle.flat)
|
|
assert h == g.buffer(1, cap_style=CAP_STYLE.flat)
|
|
assert h == g.buffer(1, cap_style="flat")
|
|
|
|
h = g.buffer(1, cap_style=BufferCapStyle.square)
|
|
assert h == g.buffer(1, cap_style=CAP_STYLE.square)
|
|
assert h == g.buffer(1, cap_style="square")
|
|
|
|
def test_buffer_style(self):
|
|
g = geometry.LineString([[0, 0], [1, 0]])
|
|
h = g.buffer(1, join_style=BufferJoinStyle.round)
|
|
assert h == g.buffer(1, join_style=JOIN_STYLE.round)
|
|
assert h == g.buffer(1, join_style="round")
|
|
|
|
h = g.buffer(1, join_style=BufferJoinStyle.mitre)
|
|
assert h == g.buffer(1, join_style=JOIN_STYLE.mitre)
|
|
assert h == g.buffer(1, join_style="mitre")
|
|
|
|
h = g.buffer(1, join_style=BufferJoinStyle.bevel)
|
|
assert h == g.buffer(1, join_style=JOIN_STYLE.bevel)
|
|
assert h == g.buffer(1, join_style="bevel")
|
|
|
|
|
|
def test_deprecated_quadsegs():
|
|
point = geometry.Point(0, 0)
|
|
with pytest.warns(FutureWarning):
|
|
result = point.buffer(1, quadsegs=1)
|
|
expected = point.buffer(1, quad_segs=1)
|
|
assert result.equals(expected)
|
|
|
|
|
|
def test_deprecated_resolution():
|
|
point = geometry.Point(0, 0)
|
|
with pytest.deprecated_call(match="Use 'quad_segs' instead"):
|
|
result = point.buffer(1, resolution=1)
|
|
expected = point.buffer(1, quad_segs=1)
|
|
assert result.equals(expected)
|