| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- import numpy as np
- import pytest
- from shapely import Point, geos_version
- from shapely.coords import CoordinateSequence
- from shapely.errors import DimensionError, UnsupportedGEOSVersionError
- def test_from_coordinates():
- # Point
- p = Point(1.0, 2.0)
- assert p.coords[:] == [(1.0, 2.0)]
- assert p.has_z is False
- # PointZ
- p = Point(1.0, 2.0, 3.0)
- assert p.coords[:] == [(1.0, 2.0, 3.0)]
- assert p.has_z
- # empty
- p = Point()
- assert p.is_empty
- assert isinstance(p.coords, CoordinateSequence)
- assert p.coords[:] == []
- def test_from_sequence():
- # From single coordinate pair
- p = Point((3.0, 4.0))
- assert p.coords[:] == [(3.0, 4.0)]
- p = Point([3.0, 4.0])
- assert p.coords[:] == [(3.0, 4.0)]
- # From coordinate sequence
- p = Point([(3.0, 4.0)])
- assert p.coords[:] == [(3.0, 4.0)]
- p = Point([[3.0, 4.0]])
- assert p.coords[:] == [(3.0, 4.0)]
- # PointZ
- p = Point((3.0, 4.0, 5.0))
- assert p.coords[:] == [(3.0, 4.0, 5.0)]
- p = Point([3.0, 4.0, 5.0])
- assert p.coords[:] == [(3.0, 4.0, 5.0)]
- p = Point([(3.0, 4.0, 5.0)])
- assert p.coords[:] == [(3.0, 4.0, 5.0)]
- def test_from_numpy():
- # Construct from a numpy array
- p = Point(np.array([1.0, 2.0]))
- assert p.coords[:] == [(1.0, 2.0)]
- p = Point(np.array([1.0, 2.0, 3.0]))
- assert p.coords[:] == [(1.0, 2.0, 3.0)]
- def test_from_numpy_xy():
- # Construct from separate x, y numpy arrays - if those are length 1,
- # this is allowed for compat with shapely 1.8
- # (https://github.com/shapely/shapely/issues/1587)
- p = Point(np.array([1.0]), np.array([2.0]))
- assert p.coords[:] == [(1.0, 2.0)]
- p = Point(np.array([1.0]), np.array([2.0]), np.array([3.0]))
- assert p.coords[:] == [(1.0, 2.0, 3.0)]
- def test_from_point():
- # From another point
- p = Point(3.0, 4.0)
- q = Point(p)
- assert q.coords[:] == [(3.0, 4.0)]
- p = Point(3.0, 4.0, 5.0)
- q = Point(p)
- assert q.coords[:] == [(3.0, 4.0, 5.0)]
- def test_from_generator():
- gen = (coord for coord in [(1.0, 2.0)])
- p = Point(gen)
- assert p.coords[:] == [(1.0, 2.0)]
- def test_from_invalid():
- with pytest.raises(TypeError, match="takes at most 3 arguments"):
- Point(1, 2, 3, 4)
- # this worked in shapely 1.x, just ignoring the other coords
- with pytest.raises(
- ValueError, match="takes only scalar or 1-size vector arguments"
- ):
- Point([(2, 3), (11, 4)])
- class TestPoint:
- def test_point(self):
- # Test XY point
- p = Point(1.0, 2.0)
- assert p.x == 1.0
- assert type(p.x) is float
- assert p.y == 2.0
- assert type(p.y) is float
- assert p.coords[:] == [(1.0, 2.0)]
- assert str(p) == p.wkt
- assert p.has_z is False
- with pytest.raises(DimensionError):
- p.z
- if geos_version >= (3, 12, 0):
- assert p.has_m is False
- with pytest.raises(DimensionError):
- p.m
- else:
- with pytest.raises(UnsupportedGEOSVersionError):
- p.m
- # Check XYZ point
- p = Point(1.0, 2.0, 3.0)
- assert p.coords[:] == [(1.0, 2.0, 3.0)]
- assert str(p) == p.wkt
- assert p.has_z is True
- assert p.z == 3.0
- assert type(p.z) is float
- if geos_version >= (3, 12, 0):
- assert p.has_m is False
- with pytest.raises(DimensionError):
- p.m
- # TODO: Check XYM and XYZM points
- # Coordinate access
- p = Point((3.0, 4.0))
- assert p.x == 3.0
- assert p.y == 4.0
- assert tuple(p.coords) == ((3.0, 4.0),)
- assert p.coords[0] == (3.0, 4.0)
- with pytest.raises(IndexError): # index out of range
- p.coords[1]
- # Bounds
- assert p.bounds == (3.0, 4.0, 3.0, 4.0)
- # Geo interface
- assert p.__geo_interface__ == {"type": "Point", "coordinates": (3.0, 4.0)}
- def test_point_empty(self):
- # Test Non-operability of Null geometry
- p_null = Point()
- assert p_null.wkt == "POINT EMPTY"
- assert p_null.coords[:] == []
- assert p_null.area == 0.0
- assert p_null.__geo_interface__ == {"type": "Point", "coordinates": ()}
- def test_coords(self):
- # From Array.txt
- p = Point(0.0, 0.0, 1.0)
- coords = p.coords[0]
- assert coords == (0.0, 0.0, 1.0)
- # Convert to Numpy array, passing through Python sequence
- a = np.asarray(coords)
- assert a.ndim == 1
- assert a.size == 3
- assert a.shape == (3,)
- def test_point_immutable():
- p = Point(3.0, 4.0)
- with pytest.raises(AttributeError):
- p.coords = (2.0, 1.0)
- with pytest.raises(TypeError):
- p.coords[0] = (2.0, 1.0)
- def test_point_array_coercion():
- # don't convert to array of coordinates, keep objects
- p = Point(3.0, 4.0)
- arr = np.array(p)
- assert arr.ndim == 0
- assert arr.size == 1
- assert arr.dtype == np.dtype("object")
- assert arr.item() == p
- def test_numpy_empty_point_coords():
- pe = Point()
- # Access the coords
- a = np.asarray(pe.coords)
- assert a.shape == (0, 2)
- def test_numpy_object_array():
- geom = Point(3.0, 4.0)
- ar = np.empty(1, object)
- ar[:] = [geom]
- assert ar[0] == geom
|