67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
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)
|