87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
import numpy as np
|
|
import pytest
|
|
|
|
from shapely import LineString
|
|
|
|
|
|
class TestCoords:
|
|
"""
|
|
Shapely assumes contiguous C-order float64 data for internal ops.
|
|
Data should be converted to contiguous float64 if numpy exists.
|
|
c9a0707 broke this a little bit.
|
|
"""
|
|
|
|
def test_data_promotion(self):
|
|
coords = np.array([[12, 34], [56, 78]], dtype=np.float32)
|
|
processed_coords = np.array(LineString(coords).coords)
|
|
|
|
assert coords.tolist() == processed_coords.tolist()
|
|
|
|
def test_data_destriding(self):
|
|
coords = np.array([[12, 34], [56, 78]], dtype=np.float32)
|
|
|
|
# Easy way to introduce striding: reverse list order
|
|
processed_coords = np.array(LineString(coords[::-1]).coords)
|
|
|
|
assert coords[::-1].tolist() == processed_coords.tolist()
|
|
|
|
|
|
class TestCoordsGetItem:
|
|
def test_index_2d_coords(self):
|
|
c = [(float(x), float(-x)) for x in range(4)]
|
|
g = LineString(c)
|
|
for i in range(-4, 4):
|
|
assert g.coords[i] == c[i]
|
|
with pytest.raises(IndexError):
|
|
g.coords[4]
|
|
with pytest.raises(IndexError):
|
|
g.coords[-5]
|
|
|
|
def test_index_3d_coords(self):
|
|
c = [(float(x), float(-x), float(x * 2)) for x in range(4)]
|
|
g = LineString(c)
|
|
for i in range(-4, 4):
|
|
assert g.coords[i] == c[i]
|
|
with pytest.raises(IndexError):
|
|
g.coords[4]
|
|
with pytest.raises(IndexError):
|
|
g.coords[-5]
|
|
|
|
def test_index_coords_misc(self):
|
|
g = LineString() # empty
|
|
with pytest.raises(IndexError):
|
|
g.coords[0]
|
|
with pytest.raises(TypeError):
|
|
g.coords[0.0]
|
|
|
|
def test_slice_2d_coords(self):
|
|
c = [(float(x), float(-x)) for x in range(4)]
|
|
g = LineString(c)
|
|
assert g.coords[1:] == c[1:]
|
|
assert g.coords[:-1] == c[:-1]
|
|
assert g.coords[::-1] == c[::-1]
|
|
assert g.coords[::2] == c[::2]
|
|
assert g.coords[:4] == c[:4]
|
|
assert g.coords[4:] == c[4:] == []
|
|
|
|
def test_slice_3d_coords(self):
|
|
c = [(float(x), float(-x), float(x * 2)) for x in range(4)]
|
|
g = LineString(c)
|
|
assert g.coords[1:] == c[1:]
|
|
assert g.coords[:-1] == c[:-1]
|
|
assert g.coords[::-1] == c[::-1]
|
|
assert g.coords[::2] == c[::2]
|
|
assert g.coords[:4] == c[:4]
|
|
assert g.coords[4:] == c[4:] == []
|
|
|
|
|
|
class TestXY:
|
|
"""New geometry/coordseq method 'xy' makes numpy interop easier"""
|
|
|
|
def test_arrays(self):
|
|
x, y = LineString([(0, 0), (1, 1)]).xy
|
|
assert len(x) == 2
|
|
assert list(x) == [0.0, 1.0]
|
|
assert len(y) == 2
|
|
assert list(y) == [0.0, 1.0]
|