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 :

How to convert an XML to Shapefile polyline


Sujet :

Python

  1. #1
    Futur Membre du Club
    Femme Profil pro
    sig
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : sig

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Points : 7
    Points
    7
    Par défaut How to convert an XML to Shapefile polyline
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <ci nc="BMSKDMA10" nl="BMskDMA10" mt="6" ct="DM" dtt="17342" dtu="15/01/2016 09:47:29"> 
      <tr la="33.5510900" lo="-7.5741300" tr="COLLECTE" nr="BOULEVARD ACHAHID LAARBI AL BANNAY" ce="CASABLANCA" er="0" mt="6" cm="3" id="0" dt="418" />
      <tr la="33.5532900" lo="-7.5704600" tr="COLLECTE" nr="BOULEVARD ACHAHID LAARBI AL BANNAY" ce="CASABLANCA" er="0" mt="6" cm="2" id="1" dt="206" />
      <tr la="33.5547700" lo="-7.5714700" tr="COLLECTE" nr="BOULEVARD AL JOULANE" ce="CASABLANCA" er="0" mt="6" cm="3" sa="" hc="" id="2" dt="182" />
    </ci>
    i want convert this XML file to SHP polyline howe i can do this please ?!!!

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    PyShp permet le traitement des fichiers SHP avec Python.

    https://code.google.com/archive/p/py...PyShpDocs.wiki

  3. #3
    Futur Membre du Club
    Femme Profil pro
    sig
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : sig

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Points : 7
    Points
    7
    Par défaut convert wih pyshp library
    Citation Envoyé par VinsS Voir le message
    Salut,

    PyShp permet le traitement des fichiers SHP avec Python.

    https://code.google.com/archive/p/py...PyShpDocs.wiki
    I tried this code with pyshp library, it works but I have as result points

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    from xml.etree import ElementTree
    import shapefile
    import os
     
    xml_file = 'BMSKDMA10.xml'
    shape_file = 'BMSKDMA10.shp'
    projection = 'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]'
     
    tree = ElementTree.parse(xml_file)
    w = shapefile.Writer(shapefile.POLYLINE)
     
    # create fields
    w.field('la', fieldType = 'N', size = 200)
    w.field('lo', fieldType = 'N', size = 200)
    w.field('tr', fieldType = 'C', size = 200)
    w.field('nr', fieldType = 'C', size = 200)
    w.field('ce', fieldType = 'C', size = 200)
    w.field('er', fieldType = 'N', size = 200)
    w.field('mt', fieldType = 'N', size = 200)
    w.field('cm', fieldType = 'N', size = 200)
    w.field('id', fieldType = 'N', size = 200)
    w.field('dt', fieldType = 'N', size = 200)
     
    root = tree.getroot()
    ci = root.getchildren()
     
    for tr in ci:
     
        part = []
        part.append([float(tr.get('lo')), float(tr.get('la'))])
        w.poly(parts=[part])
     
        # copy attributes
        w.record(float(tr.get('la')),float(tr.get('lo')), tr.get('tr'),tr.get('nr'),tr.get('ce'),int(tr.get('er')),int(tr.get('mt')),int(tr.get('cm')),int(tr.get('id')),int(tr.get('dt')))
    w.save(shape_file)
     
    # create the PRJ file
    with open(os.path.splitext(shape_file)[0] + os.extsep + 'prj', 'w') as prj:prj.write(projection)

  4. #4
    Membre expérimenté 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 : 59
    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
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour,

    il y a un problème de fond dans ce que tu fais et tu ne peux y arriver comme ça.

    Ton fichier XML contient 3 points de coordonnées géographiques WGS84 (lo(ngitude), la(titude)) différentes.

    Je comprends que tu veux les relier pour en faire un et un seul "arc" (PolyLine pour shapefile) et aussi lui transférer les attributs/propriétés des points.

    Problème : tes points ont certains attributs avec des valeurs différentes (même si l'on oublie, id, la et lo qui, quand on passe du XML au shapefile, n'ont plus d'intérêt). Tu ne peux donner qu'une seul valeur à chacun des attributs de ton arc !

    Alors, que choisir pour l'arc résultat ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            arc         point id=0                              point id=1                          point id=2
     
    tr      COLLECTE    COLLECTE                                COLLECTE                            COLLECTE
    nr      ???         BOULEVARD ACHAHID LAARBI AL BANNAY      BOULEVARD ACHAHID LAARBI AL BANNAY  BOULEVARD AL JOULANE
    ce      CASABLANCA  CASABLANCA                              CASABLANCA                          CASABLANCA
    er      0           0                                       0                                   0
    mt      6           6                                       6                                   6
    cm      ???         3                                       2                                   3
    dt      ???         418                                     206                                 182

    Et d'ailleurs, les attributs de tes points ont-ils encore un sens pour l'arc ? tous ?



    Dans ton code, ce qui ne va pas :

    • tu crées autant d'objets (arcs/PolyLine) qu'il y a de points (boucle for, lignes 27 à 34)
    • les arcs créés n'ont qu'un point, du coup, ils ne sont pas valides (voir ESRI Shapefile Technical Description : "A PolyLine is an ordered set of vertices that consists of one or more parts. A part is a connected sequence of two or more points. Parts may or may not be connected to one another. Parts may or may not intersect one another."
    • dans la méthode field, pour des réels (ici, la et lo), il faut utiliser le type 'F' et fournir une valeur à l'argument decimal (nb de chiffres décimaux, par défaut 0)


    Tout ceci se voit sur l'image jointe (j'ai exécuté ton script et ouvert ton shapefile dons OpenJump, SIG Open Source).

    En ne s'occupant que de la géométrie, ton code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    from xml.etree import ElementTree
    import shapefile
    import os
     
    xml_file = 'BMSKDMA10.xml'
    shape_file = 'BMSKDMA10.shp'
    projection = 'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]'
     
    tree = ElementTree.parse(xml_file)
    w = shapefile.Writer(shapefile.POLYLINE)
     
    root = tree.getroot()
    ci = root.getchildren()
     
    part = list()
    for tr in ci:
        part.append([float(tr.get('lo')), float(tr.get('la'))])
     
    # default value for shapeType is shapefile.POLYGON (see shapefile.py, line 940)
    w.poly(parts=[part], shapeType=shapefile.POLYLINE)
     
    w.save(shape_file)
     
    # create the PRJ file
    with open(os.path.splitext(shape_file)[0] + os.extsep + 'prj', 'w') as prj:
    	prj.write(projection)
    te donnera un shapefile avec un arc. Si tu veux mettre des attributs sur ton arc, c'est une base.
    Images attachées Images attachées  
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  5. #5
    Futur Membre du Club
    Femme Profil pro
    sig
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : sig

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Probleme resolut :D
    Bonsoir merci beaucoup pour votre réponse je viens de trouvé la solution grace a ce lien :

    Monsieur plxpy le fichier xml que j'ai c pas juste une partie de trois ligne j'ai 100 points que j'ai voulez avec construire des ligne liée avec c points .

    j'ai mis ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    line_parts = []
    line = []
    for tr in ci:
      line.append([float(tr.get('lo')),float(tr.get('la'))])
      line_parts.append(line)
      w.line(parts=line_parts)
      w.record(float(tr.get('la')),float(tr.get('lo')), tr.get('tr'),tr.get('nr'),tr.get('ce'),int(tr.get('er')),int(tr.get('mt')),int(tr.get('cm')),int(tr.get('id')),int(tr.get('dt')))
    w.save(shape_file)
    a la place de ce lui la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    part = list()
    for tr in ci:
        part.append([float(tr.get('lo')), float(tr.get('la'))])
     
    # default value for shapeType is shapefile.POLYGON (see shapefile.py, line 940)
    w.poly(parts=[part], shapeType=shapefile.POLYLINE)
     
    w.save(shape_file)
    et sa marché

  6. #6
    Membre expérimenté 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 : 59
    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
    Points : 1 481
    Points
    1 481
    Par défaut
    Citation Envoyé par wissssam Voir le message
    j'ai mis ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    line_parts = []
    line = []
    for tr in ci:
      line.append([float(tr.get('lo')),float(tr.get('la'))])
      line_parts.append(line)
      w.line(parts=line_parts)
      w.record(float(tr.get('la')),float(tr.get('lo')), tr.get('tr'),tr.get('nr'),tr.get('ce'),int(tr.get('er')),int(tr.get('mt')),int(tr.get('cm')),int(tr.get('id')),int(tr.get('dt')))
    w.save(shape_file)
    ...

    et sa marché
    Je vais regarder plus en détails mais, là, tout de suite, je dis que c'est impossible.

    w.line (ligne 6) est appelé pour chaque élément <tr> du XML, ça crée 1 objet shapefile à chaque fois et c'est incompatible avec le fait d'avoir 1 arc résultat.

    Ou alors, je n'ai pas compris ce que tu veux faire
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  7. #7
    Membre expérimenté 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 : 59
    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
    Points : 1 481
    Points
    1 481
    Par défaut
    J'ai exploité (la géométrie) du shapefile obtenu (voir fichier attaché) sous OpenJUMP.

    Tu as ajouté un nouveau problème.

    Je reproduis ton dernier code, en le simplifiant et en utilisant des caractères (symbolisant des points, et pas des coordonnées pas très lisibles).

    A chaque itération tu mets à jour line (ajout d'un point) mettant du même coup à jour les objets python line qui sont déjà dans line_parts et tu ajoutes un exemplaire de plus de line dans line_parts

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    >>> coords = ('A', 'B', 'C')
    >>> line = []
    >>> line_parts = []
    >>> 
    >>> for c in coords:
    ...     line.append(c)
    ...     line_parts.append(line)
    ...     print "iteration %s : line vaut %s" % (c, line)
    ...     print "iteration %s : line_parts vaut %s ET ON CREE UN OBJET VIA w.line" % (c, line_parts)
    ... 
    iteration A : line vaut ['A']
    iteration A : line_parts vaut [['A']] ET ON CREE UN OBJET VIA w.line
    iteration B : line vaut ['A', 'B']
    iteration B : line_parts vaut [['A', 'B'], ['A', 'B']] ET ON CREE UN OBJET VIA w.line
    iteration C : line vaut ['A', 'B', 'C']
    iteration C : line_parts vaut [['A', 'B', 'C'], ['A', 'B', 'C'], ['A', 'B', 'C']] ET ON CREE UN OBJET VIA w.line

    Tu disais que ton vrai XML a 100 points.
    Et bien ton shapefile en sortie contient 100 objets:

    Objet no 1 : géométrie invalide (Pt1)
    Objet no 2 : multi-arcs de 2 arcs identiques de 1 segment (Pt1-Pt2)
    Objet no 3 : multi-arcs de 3 arcs identiques de 2 segments (Pt1-Pt2-Pt3)
    ...
    Objet no 100 : multi-arcs de 100 arcs identiques de 99 segments (Pt1-Pt2- ... -Pt99-Pt100)

    Alors, on peut dire que ça marche si on ne regarde que le côté visuel mais ça repasse sans arrêt et plein de fois aux mêmes endroits. Mais un shapefile est à utiliser dans un SIG et à la moindre opération dessus, tu vas avoir des soucis ! Et pour les attributs, le problème reste entier.
    Images attachées Images attachées  
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/07/2006, 09h18
  2. Equivalent XML converter?
    Par kobe dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 12/04/2006, 10h41

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