views:

103

answers:

1

I am developing a GeoDjango application where users can upload map files and do some basic mapping operations like querying features inside polygons.

I recognized that users happen to upload "MultiLineString"s instead of "Polygon"s sometimes. This causes the queries expecting closed geometries to fail.

What is the best way to convert a MultiLineString object to a Polygon in Python?

Thanks.

-- oMat

+2  A: 

Hehe, at first I wrote this:

def close_geometry(self, geometry):
   if geometry.empty or geometry[0].empty:
       return geometry # empty

   if(geometry[-1][-1] == geometry[0][0]):
       return geometry  # already closed

   result = None
   for linestring in geom:
      if result is None:
          resultstring = linestring.clone()
      else:
          resultstring.extend(linestring.coords)

   geom = Polygon(resultstring)

   return geom

but then I discovered that there is a nifty little method called convex_hull that does the polygon conversion for you automatically.

>>> s1 = LineString((0, 0), (1, 1), (1, 2), (0, 1))
>>> s1.convex_hull
<Polygon object at ...>
>>> s1.convex_hull.coords
(((0.0, 0.0), (0.0, 1.0), (1.0, 2.0), (1.0, 1.0), (0.0, 0.0)),)

>>> m1=MultiLineString(s1)
>>> m1.convex_hull
<Polygon object at...>
>>> m1.convex_hull.coords
(((0.0, 0.0), (0.0, 1.0), (1.0, 2.0), (1.0, 1.0), (0.0, 0.0)),)
drozzy
such an obscure name for a method that saves the day. thanks.if the MultiLineString has more than 1 LineString, convex_hull returns 1 Polygon that contains them all. if you want to have each LineString as a separate Polygon, you still have to loop in the MultiLineString and apply convex_hull to each LineString.
omat
True, you just never mentioned that you wanted a separate polygon for each line. :-)
drozzy
The Convex Hull of the multiline may not be what you need. A Convex Hull defines the minimal polygon that contains the shape, and may not be as accurate as you need as it will not include any points on the shape's boundary that are "inside". i.e. if you have a shape with a chunk taken out of it, you may not see that the shape has a chunk out of its border.
ianmjones
You got a better idea?
drozzy