| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- import random
- import unittest
- from functools import partial
- from itertools import islice
- import pytest
- from shapely.geometry import MultiPolygon, Point
- from shapely.ops import unary_union
- def halton(base):
- """Returns an iterator over an infinite Halton sequence"""
- def value(index):
- result = 0.0
- f = 1.0 / base
- i = index
- while i > 0:
- result += f * (i % base)
- i = i // base
- f = f / base
- return result
- i = 1
- while i > 0:
- yield value(i)
- i += 1
- class UnionTestCase(unittest.TestCase):
- def test_unary_union_partial(self):
- # Use a partial function to make 100 points uniformly distributed
- # in a 40x40 box centered on 0,0.
- r = partial(random.uniform, -20.0, 20.0)
- points = [Point(r(), r()) for i in range(100)]
- # Buffer the points, producing 100 polygon spots
- spots = [p.buffer(2.5) for p in points]
- # Perform a cascaded union of the polygon spots, dissolving them
- # into a collection of polygon patches
- u = unary_union(spots)
- assert u.geom_type in ("Polygon", "MultiPolygon")
- def setUp(self):
- # Instead of random points, use deterministic, pseudo-random Halton
- # sequences for repeatability sake.
- self.coords = zip(
- list(islice(halton(5), 20, 120)),
- list(islice(halton(7), 20, 120)),
- )
- def test_unary_union(self):
- patches = [Point(xy).buffer(0.05) for xy in self.coords]
- u = unary_union(patches)
- assert u.geom_type == "MultiPolygon"
- assert u.area == pytest.approx(0.718572540569)
- def test_unary_union_multi(self):
- # Test of multipart input based on comment by @schwehr at
- # https://github.com/shapely/shapely/issues/47#issuecomment-21809308
- patches = MultiPolygon([Point(xy).buffer(0.05) for xy in self.coords])
- assert unary_union(patches).area == pytest.approx(0.71857254056)
- assert unary_union([patches, patches]).area == pytest.approx(0.71857254056)
|