2010-06-03 7 views
2

Je suis en train de développer une application GeoDjango dans laquelle les utilisateurs peuvent télécharger des fichiers de cartes et effectuer des opérations de mappage de base comme l'interrogation de fonctions à l'intérieur de polygones.Comment convertir un GEOS MultiLineString en polygone en utilisant Python?

J'ai reconnu que les utilisateurs peuvent télécharger des "MultiLineString" au lieu de "Polygon" parfois. Cela provoque l'échec des requêtes qui attendent des géométries fermées.

Quelle est la meilleure façon de convertir un objet MultiLineString en un Polygone en Python?

Merci.

- OMat

Répondre

2

Hehe, tout d'abord je l'ai écrit ceci:

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 

mais je découvre qu'il ya un peu nifty méthode appelée convex_hull qui fait la conversion de polygones automatiquement pour vous .

>>> 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)),) 
+0

un tel nom obscur pour une méthode qui enregistre le jour. Merci. Si MultiLineString a plus de 1 LineString, convex_hull renvoie 1 Polygon qui les contient tous. Si vous souhaitez que chaque LineString soit un Polygon séparé, vous devez toujours boucler MultiLineString et appliquer convex_hull à chaque LineString. – omat

+0

Certes, vous n'avez jamais mentionné que vous vouliez un polygone séparé pour chaque ligne. :-) – drozzy

+8

La coque convexe de la multiline n'est peut-être pas ce dont vous avez besoin. Une coque convexe définit le polygone minimal qui contient la forme et peut ne pas être aussi précis que nécessaire car il n'inclura aucun point sur la limite de la forme qui soit "à l'intérieur". c'est-à-dire que si vous avez une forme avec un morceau sorti de celui-ci, vous ne pouvez pas voir que la forme a un morceau hors de sa bordure. – ianmjones

Questions connexes