I have a number of random rectangles (black) in and around a unit square (red) and need to extract all the polygonal regions inside the unit square that are not covered by any rectangle.
It looks like this can be done with Shapely and I've gotten to the point when I have the union of the rectangles (green) but I'm not sure how to subtract that from the unit square and retrieve a list of polygons.
Here is my code to generate the test data:
import pylab
import random
from matplotlib import pyplot
from shapely.geometry import Point, Polygon
from shapely.ops import cascaded_union
from descartes import PolygonPatch
def make_square(x, y, size1, size2):
dx = [size1, -size1, -size1, size1, size1]
dy = [size2, size2, -size2, -size2, size2]
return [(x+sx, y+sy) for sx, sy in zip(dx, dy)]
pylab.figure()
square = make_square(0.5, 0.5, 1.0, 1.0)
a, b = zip(*square)
pylab.plot(a, b, 'r-')
polygons = []
for i in xrange(10):
x = random.random()
y = random.random()
s1 = random.random()
s2 = random.random()
square = make_square(x, y, s1, s2)
polygons.append(Polygon(square))
a, b = zip(*square)
pylab.plot(a, b, 'k-')
u = cascaded_union(polygons)
patch2b = PolygonPatch(u, fc='#00ff00', ec='#00ff00', alpha=0.5, zorder=2)
pylab.gca().add_patch(patch2b)
pylab.show()