| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- import unittest
- import numpy as np
- import pytest
- from shapely.geometry import MultiPolygon, Point, box
- @pytest.mark.filterwarnings("ignore:The 'shapely.vectorized:")
- class VectorizedContainsTestCase(unittest.TestCase):
- def assertContainsResults(self, geom, x, y):
- from shapely.vectorized import contains
- result = contains(geom, x, y)
- x = np.asanyarray(x)
- y = np.asanyarray(y)
- self.assertIsInstance(result, np.ndarray)
- self.assertEqual(result.dtype, bool)
- result_flat = result.flat
- x_flat, y_flat = x.flat, y.flat
- # Do the equivalent operation, only slowly, comparing the result
- # as we go.
- for idx in range(x.size):
- assert result_flat[idx] == geom.contains(Point(x_flat[idx], y_flat[idx]))
- return result
- def construct_torus(self):
- point = Point(0, 0)
- return point.buffer(5).symmetric_difference(point.buffer(2.5))
- def test_contains_poly(self):
- y, x = np.mgrid[-10:10:5j], np.mgrid[-5:15:5j]
- self.assertContainsResults(self.construct_torus(), x, y)
- def test_contains_point(self):
- y, x = np.mgrid[-10:10:5j], np.mgrid[-5:15:5j]
- self.assertContainsResults(Point(x[0], y[0]), x, y)
- def test_contains_linestring(self):
- y, x = np.mgrid[-10:10:5j], np.mgrid[-5:15:5j]
- self.assertContainsResults(Point(x[0], y[0]), x, y)
- def test_contains_multipoly(self):
- y, x = np.mgrid[-10:10:5j], np.mgrid[-5:15:5j]
- # Construct a geometry of the torus cut in half vertically.
- cut_poly = box(-1, -10, -2.5, 10)
- geom = self.construct_torus().difference(cut_poly)
- assert isinstance(geom, MultiPolygon)
- self.assertContainsResults(geom, x, y)
- def test_y_array_order(self):
- y, x = np.mgrid[-10:10:5j, -5:15:5j]
- y = y.copy("f")
- self.assertContainsResults(self.construct_torus(), x, y)
- def test_x_array_order(self):
- y, x = np.mgrid[-10:10:5j, -5:15:5j]
- x = x.copy("f")
- self.assertContainsResults(self.construct_torus(), x, y)
- def test_xy_array_order(self):
- y, x = np.mgrid[-10:10:5j, -5:15:5j]
- x = x.copy("f")
- y = y.copy("f")
- result = self.assertContainsResults(self.construct_torus(), x, y)
- # Preserve the order
- assert result.flags["F_CONTIGUOUS"]
- def test_array_dtype(self):
- y, x = np.mgrid[-10:10:5j], np.mgrid[-5:15:5j]
- x = x.astype(np.int16)
- self.assertContainsResults(self.construct_torus(), x, y)
- def test_array_2d(self):
- y, x = np.mgrid[-10:10:15j, -5:15:16j]
- result = self.assertContainsResults(self.construct_torus(), x, y)
- assert result.shape == x.shape
- def test_shapely_xy_attr_contains(self):
- g = Point(0, 0).buffer(10.0)
- self.assertContainsResults(self.construct_torus(), *g.exterior.xy)
- @pytest.mark.filterwarnings("ignore:The 'shapely.vectorized:")
- class VectorizedTouchesTestCase(unittest.TestCase):
- def test_touches(self):
- from shapely.vectorized import touches
- y, x = np.mgrid[-2:3:6j, -1:3:5j]
- geom = box(0, -1, 2, 2)
- result = touches(geom, x, y)
- expected = np.array(
- [
- [False, False, False, False, False],
- [False, True, True, True, False],
- [False, True, False, True, False],
- [False, True, False, True, False],
- [False, True, True, True, False],
- [False, False, False, False, False],
- ],
- dtype=bool,
- )
- from numpy.testing import assert_array_equal
- assert_array_equal(result, expected)
|