| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- import numpy as np
- import pytest
- from shapely import LineString, geos_version
- from shapely.tests.common import (
- line_string,
- line_string_m,
- line_string_z,
- line_string_zm,
- point,
- point_m,
- point_z,
- point_zm,
- )
- 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_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_coords_z(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_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_coords_z(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]
- @pytest.mark.parametrize("geom", [point, point_z, line_string, line_string_z])
- def test_coords_array_copy(geom):
- """Test CoordinateSequence.__array__ method."""
- coord_seq = geom.coords
- assert np.array(coord_seq) is not np.array(coord_seq)
- assert np.array(coord_seq, copy=True) is not np.array(coord_seq, copy=True)
- # Behaviour of copy=False is different between NumPy 1.x and 2.x
- if int(np.version.short_version.split(".", 1)[0]) >= 2:
- with pytest.raises(ValueError, match="A copy is always created"):
- np.array(coord_seq, copy=False)
- else:
- assert np.array(coord_seq, copy=False) is np.array(coord_seq, copy=False)
- @pytest.mark.skipif(geos_version < (3, 12, 0), reason="GEOS < 3.12")
- def test_coords_with_m():
- assert point_m.coords[:] == [(2.0, 3.0, 5.0)]
- assert point_zm.coords[:] == [(2.0, 3.0, 4.0, 5.0)]
- assert line_string_m.coords[:] == [
- (0.0, 0.0, 1.0),
- (1.0, 0.0, 2.0),
- (1.0, 1.0, 3.0),
- ]
- assert line_string_zm.coords[:] == [
- (0.0, 0.0, 4.0, 1.0),
- (1.0, 0.0, 4.0, 2.0),
- (1.0, 1.0, 4.0, 3.0),
- ]
|