IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

shapely : union de polygones


Sujet :

Python

  1. #21
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Une première question pour être bien sur de comprendre ce à quoi tu veux arriver.

    Tu travailles à la base sur des volumes (de l'espace aérien) puis tu en fais différentes coupes à altitude constante ce qui fournit les différents polygones, chaque polygone étant donc attaché à une altitude (tu l'indiques quelque part).

    Quel est le but de la démarche qui consiste à faire, ensuite, l'union des polygones, toutes altitudes de coupe confondues ? Est-ce pour déterminer l'emprise au sol de l'espace aérien, de la zone de terrain survolée/survolable ?

    Si c'est cela, tu as tout intêret à :
    • d'abord travailler à altitude constante en faisant l'union des polygones attachés à cette altitude, uniquement ceux-là,
    • faire, à la fin, l'union de ces unions intermédiaires


    Je pense que ça peut t'éviter des cas de figures "dangereux", numériquement parlant (volumes avec des faces quasiment verticales, tranchées selon des z très proches)

    En plus, c'est à altitude constante qu'il faut rechercher les éventuels trous mais, surtout, les éventuels recouvrements : selon les volumes, ca peut se recouvrir dans tous les sens sans qu'il y ait d'intersection entre tes volumes, tout simplement parce que tu traites tous les polygones en même temps.

    Par exemple, un seul volume formé par un 'L' en 3D : si tu le découpes tout en haut et tout en bas, tu as 2 polygones qui s'intersectent (l'un est même contenu dans l'autre) sans qu'il y ait de problème.

    Enfin, pour être "couvrant" (dans ta recherche de trous et de recouvrements, j'ai l'impression qu'il faut "trancher" tes volumes à toutes les altitudes (différentes) des points définissant les volumes. S'il n'y en a pas trop (j'ai l'impression que c'est le cas) j'ai parlé trop vite


    Ensuite, concernant les précisions de calcul et ton souhait de travailler à une tolérance près.

    Le seul endroit où Shapely prend en compte une tolérance est la méthode almost_equals qui indique si deux géométries sont égales à N décimales près. On ne peut pas en faire grand-chose ici, il me semble.

    Mais même si tu travailles en secondes d'arc entières (je comprends que tu définis les différents points/sommets de tes volumes avec des (x,y) entiers, des réels, certes, mais valeurs entieres), je ne vois pas trop où on pourrait prendre en compte une quelconque tolérance.

    Même des petits trous (ou des petits recouvrements, voir un de mes premiers messages) peuvent être révélateur d'un problème bien réel. Donc éliminer des trous, des recouvrements ou retoucher des coordonnées sur de tels critères (précision, arrondis à la seconde d'arc entière la plus proche, ...) ne me semble pas une bonne idée et plutôt contraire à la vérification des contraintes dont tu parlais au post#17)


    Tout dernier point : tu parles enveloppe, trous, recouvrements mais je ne vois pas trop la logique des choses ni l'ordre dans lequel tu fais tout ça. Tu pourrais préciser ?

    Aurais-tu également l'altitude des différents polygones dont tu as fournis la représentation wkt plus haut ?

  2. #22
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut
    Bonjour,
    Je vais tenter d'expliquer sur quoi je travaille : tout d'abord cela concerne de la simulation, il y a donc des simplifications opérationnelles au cas ou tu serais de la partie.
    Un espace aérien de simulation est défini par une zone rectangulaire d'altitude 0 à 999 (centaines de pieds) (en fait on parle de niveau de vol, mais disons altitude pour simplifier).
    Notre espacé aérien de simulation est défini par des volumes. Chaque volume est un polygone + une altitude min et une max. L'ensemble des altitudes min et max définit les différentes altitudes sur lesquels on va raisonner. On a donc des volumes qui vont concerner une ou plusieurs tranches d'altitude.
    Pour le simulateur : cet espace aérien ne doit comporter ni trous, ni overlaps, ni segments communs (on va écarter ce dernier cas qui n'est pas traité avec shapely).

    Mon premier traitement a consisté à déterminer l'espace aérien de simulation :
    1er temps : j'ai donc fait l'union de tous les volumes avec le pb que tu connais. J'ai changé mon algo, et aujourd'hui je prends un objet multipoint avec tous les points qui définissent mes volumes, puis je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    multipoint = MultiPoint(self.l_envelop)
    envelop = multipoint.envelope
    j'ai donc ma zone rectangulaire, l'altitude n'a pas été prise en compte ici (car il n'y en a pas au niveau des points)
    2ème temps : recherche des trous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pour chaque altitude
       pour chaque volume
          si volume concerné par l altitude
              on fait la somme des volumes (avec union())
       si la somme des volumes != enveloppe : il y a au moins un trou
          holes = envelop.difference(volumes)
          gestion du contenu des trous obtenus : traitement des différents cas : polygons, multipolygons, polylines ...
    3ème temps: recherche des overlaps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pour chaque altitude
       pour chaque couple de volumes vol_i, vol_j
          si volumes concernés par l altitude
               inter = vol_i.intersection(vol_j)
               si intersection non vide
                  gestion du contenu des intersections obtenues : traitement des différents cas  : polygons, multipolygons, polylines ...
    Voilà pour ce qui est de l'algorithmie.
    Sur le fond, j'ai l'impression que ce que je dois faire est assez simple : union ou intersection, par rapport à toutes les fonctions de géométrie possibles. Mes polygones sont définis par des valeurs entières alors que la précision va jusqu'à 10**-12. Si j'ai rencontré ce cas, d'autres vont le rencontrer à coup sur.
    Ce qui est bloquant, ce n'est pas les erreurs de précision qui font apparaitre des micro trous (car je pourrais les exclure en fonction d'une taille fournie par mon client), mais le fait que l'union ne se fait pas et qu'on part en erreur : je pense que ça relève d'un bug de shapely (ou geos). Cette erreur ne se reproduit plus pour l'instant car j'ai changé la façon de calculer l'enveloppe, mais j'ai toujours une union plus loin, donc on ne peut pas savoir si cela va se reproduire ou pas. Potentiellement c'est possible. Si ça se reproduit, je pourrais capter l'exception, mais pour en faire quoi ? si l'union n'est pas faite, comment faire autrement ?
    Voilà ou j'en suis.
    Cordialement

Discussions similaires

  1. Union de polygones concaves
    Par regliss76 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 05/07/2010, 14h50
  2. Intersection Line2D et Shape (voire Polygon..)
    Par GrassEh dans le forum 2D
    Réponses: 1
    Dernier message: 26/01/2010, 15h18
  3. classe héritée de system.windows.shapes.polygon
    Par eldrad95 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 18/01/2010, 15h34
  4. Union de deux polygones
    Par aidos dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 02/01/2007, 11h39
  5. Union de deux polygones
    Par aidos dans le forum C++
    Réponses: 4
    Dernier message: 21/12/2006, 04h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo