Convert Multipolygon to Polygon in Python [closed]

北战南征 提交于 2020-07-15 02:28:10

问题


Is it possible to convert a Multipolygon into a Polygon which fills all holes or missing inner areas using Shapely? I have been trying since a while but I can't find it in the documentation. The following image I show an example of a multipolygon with those holes I want to fill, and those squares I want to remove.


回答1:


An approximate approach could be to:

  1. extract the outer boundary of individual components of the MultiPolygon of interest
  2. expand-shrink each of the outer boundaries in order to fill "holes" which these boundaries approximately encompass, e.g., to handle a "doughnut with a cut"
  3. merge all geometries obtained in previous step

For example:

#!/usr/bin/env python
from shapely.geometry import MultiPolygon, Polygon
from shapely.ops import cascaded_union

a = 0.25
delta = 0.49

P = MultiPolygon([
    (
        ((0,0),(0,3),(3,3),(3,2-delta),(2,2-delta),(2,2),(1,2),(1,1),(2,1),(2,1+delta),(3,1+delta),(3,0),(0,0)),
        [((a, a), (1-a,a), (1-a,1-a), (a,1-a), (a,a))]
    )
])


eps = 0.01

omega = cascaded_union([
    Polygon(component.exterior).buffer(eps).buffer(-eps) for component in P
])
for x,y in zip(*omega.exterior.coords.xy):
    print(x, y)

The MultiPolygon P looks like:

while the script listed above produces as expected an approximate square with side of length 3, i.e., it fills the hole in the lower-left corner as well as the "empty space" in the center of the MultiPolygon which is rendered equivalent to a hole in the expand-shrink procedure with sufficient high value of parameter eps.




回答2:


If it's enough to fill the holes of some MultiPolygon m, you could do this:

no_holes = MultiPolygon(Polygon(p.exterior) for p in m)

If you also need to fill the holes that arise from touching Polygons inside your MultiPolygon, the following should work:

# Create a polygon `b` that contains `m`
xmin, ymin, xmax, ymax = m.bounds
b = Polygon([(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin)]).buffer(1, resolution=1)

# Take the complement of `m` in `b`, which is a MultiPolygon.
# Pick the outer polygon and take the complement in `b`.
no_holes = b - min(b - m, key=lambda p: p.bounds)


来源:https://stackoverflow.com/questions/48082553/convert-multipolygon-to-polygon-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!