OSDN Git Service

data write directory change. shapely library include.
[openembroidery/EmbroideryOutputExtensionForInkscape.git] / embroider / shapely / tests / test_union.py
diff --git a/embroider/shapely/tests/test_union.py b/embroider/shapely/tests/test_union.py
new file mode 100644 (file)
index 0000000..7a657db
--- /dev/null
@@ -0,0 +1,72 @@
+from . import unittest
+import random
+from itertools import islice
+from shapely.geos import geos_version
+from shapely.ftools import partial
+from shapely.geometry import Point, MultiPolygon
+from shapely.ops import cascaded_union, 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_cascaded_union(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 = cascaded_union(spots)
+        self.assertTrue(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)),
+        )
+
+    @unittest.skipIf(geos_version < (3, 3, 0), 'GEOS 3.3.0 required')
+    def test_unary_union(self):
+        patches = [Point(xy).buffer(0.05) for xy in self.coords]
+        u = unary_union(patches)
+        self.assertEqual(u.geom_type, 'MultiPolygon')
+        self.assertAlmostEqual(u.area, 0.71857254056)
+
+    @unittest.skipIf(geos_version < (3, 3, 0), 'GEOS 3.3.0 required')
+    def test_unary_union_multi(self):
+        # Test of multipart input based on comment by @schwehr at
+        # https://github.com/Toblerity/Shapely/issues/47#issuecomment-21809308
+        patches = MultiPolygon([Point(xy).buffer(0.05) for xy in self.coords])
+        self.assertAlmostEqual(unary_union(patches).area,
+                               0.71857254056)
+        self.assertAlmostEqual(unary_union([patches, patches]).area,
+                               0.71857254056)
+
+
+def test_suite():
+    return unittest.TestLoader().loadTestsFromTestCase(UnionTestCase)