[Gfoss] cml2shp.py
Guglielmo R. Raimondi
g.raimondi a glasic.it
Ven 14 Dic 2007 13:34:24 CET
Ottimo Bud!
Ti segnalo comunque che la versione di Dxf2PostGIS che
converte anche i file CXF sara' disponibile sul nostro sito
(www.glasic.it) entro Lunedi' prossimo.
Guglielmo
----- Original Message -----
Da : "Bud P. Bruegger" <bud at comune.grosseto.it>
A : gfoss at faunalia.com
Oggetto : [Gfoss] cml2shp.py
Data : Fri, 14 Dec 2007 13:02:47 +0100
> Ciao a tutti,
>
> Ho finalmente messo mano su un file CXF e uno CML, tutte e
> due disponibile ugualmente dal portale per comuni del
> catasto. Ho capito dal file (e non l'avevo capito dalla
> spec) che l'attributo e' gia' logicamente associato alla
> geometria. Cosi il parsing e' molto piu' facile che
> pensavo.
>
> Allora mi ho messo a scrivere un piccolo parser per CML
> che e' xml e cosi piu' facile che quello di CXF.
>
> La versione attuale prende solo Bordi (incl. particelle e
> fabbricati). Fin ora lo mette in una rappresentazione in
> memoria. Il prossimo passo sara' di scrivere su un shape
> file usando la shapelib di python. Spero di mandare una
> versione che include questo piu' tardi oggi.
>
> Commenti molto benvenuti
>
> saluti
> -b
>
>
>
> ##########################################################
> ############# ## ======## cml2shp
> ## ======##
> ## Converts a subset of content from a file in
> ## Cadastral Markup Language (CML) [1] to a
> ## shape file
> ##
> ## [1] CML spec:
> ##
>
http://www.agenziaterritorio.it/servizi/comunieistituzioni/..
> ##
> .fornitura_dati_catastali/specifica%20tecnica%20CML.doc ##
> ## Copyright: Comune di Grosseto
> ## Author: Bud P. Bruegger <bud at comune.grosseto.it>
> ## License: GPL (any version)
> ##########################################################
> #############
>
> import operator
>
> import shapelib
> import elementtree.ElementTree as ET
>
> version = "0.1 14/12/2007"
>
> #fileName = "testdata/E202_000100.CMF"
> fileName = "testdata/vertisola.CMF"
>
> class Feature(object):
> "a simple in memory rep of a feature"
> def __init__(self, bordoType, mappaID, particellaID,
> valenza, esterconf, geom): self.bordoType = bordoType
> self.mappaID = mappaID
> self.particellaID = particellaID
> self.valenza = valenza
> self.esterconf = esterconf
> self.geom = geom
> #geometry is represented by a list of rings,
> #where every ring is a list of x/y tuples
> #the first ring is the main one,
> #the others are islands
>
> #-------------------------------------
> def parseFabbriPart(codbo):
> "parses a codbo of a fabbricato or particella"
> bordoType = "PARTICELLA"
> particellaID = codbo
> if codbo[-1] == '+':
> bordoType = "FABBRICATO"
> particellaID = codbo[:-1]
> return bordoType, particellaID
>
> def codboParse(codbo, mapName):
> "parses a codbo"
> #returns: bordoType, particellaID
> codbo = codbo.strip()
> mappaID = mapName
> if codbo == mapName:
> bordoType = "MAPPA"
> particellaID = ""
> elif codbo == "STRADA":
> bordoType = "STRADA"
> particellaID = ""
> elif codbo == "ACQUA":
> bordoType = "ACQUA"
> particellaID = ""
> else:
> bordoType, particellaID = parseFabbriPart(codbo)
> return bordoType, particellaID
>
> def vertConsume(nVerts, vertList):
> return vertList[:nVerts], vertList[nVerts:]
>
> def coordParse(nVert, vertIsolaList, coordStr):
> noIsolaVerts = reduce(operator.add, vertIsolaList, 0)
> vertexList = [subStr.split(',') for subStr in
> coordStr.split()]
> geom = []
> mainRing, remainingVerts = vertConsume((nVert -
> noIsolaVerts), vertexList) geom.append(mainRing)
> for noIslandVerts in vertIsolaList:
> islandRing, remainingVerts =
> vertConsume(noIslandVerts, remainingVerts)
> geom.append(islandRing)
> return geom
>
>
> #-- main parsing ---------------------
> mapTree = ET.parse(fileName)
> mapRoot = mapTree.getroot()
> mapID = mapRoot.find("INFOMAPPA").get("nome")
> featureList = []
>
> #-- process BORDO elements ------------------
> for border in mapRoot.getiterator("BORDO"):
> bordoType, particellaID =
> codboParse(border.get("codbo"), mapID)
> valenza = border.get("valenza")
> esterconf = border.get("esterconf")
> gbordo = border.find("GBORDO")
> #nIsole = gbordo.get("n.isole")
> nVert = int(gbordo.get("n.vert"))
> vertIsolaList = map(int, [i.text for i in
> gbordo.getiterator ("VERTISOLA")]) coordStr =
> gbordo.find("COORD").text
> geom = coordParse(nVert, vertIsolaList, coordStr)
> featureList.append(Feature(bordoType, mapID,
> particellaID,
> valenza, esterconf, geom))
>
>
> --
> Bud P. Bruegger, Ph.D. +39-0564-488577 (voice),
> -21139 (fax)
> European Chair, Global Collaboration Forum on eID
> Chair, Porvoo Subgroup on collab. govs/operating
> systems
> Leader of the Permanent eID Status Observatory (PESO)
> project Servizio Elaborazione Dati e-mail:
> bud at comune.grosseto.it Comune di Grosseto
> jabber: bud at jabber.no Via Ginori, 43
> http://www.comune.grosseto.it/ 58100 Grosseto (Tuscany,
> Italy) http://www.comune.grosseto.it/interopEID/
>
> _______________________________________________
> Prenota la tua maglietta GFOSS.it:
> http://wiki.gfoss.it/index.php/Gadgets
> Iscriviti all'associazione GFOSS.it:
> http://www.gfoss.it/drupal/iscrizione Gfoss at faunalia.com
> http://www.faunalia.com/cgi-bin/mailman/listinfo/gfoss
> Questa e' una lista di discussione pubblica aperta a
> tutti. I messaggi di questa lista non rispecchiano
> necessariamente le posizioni dell'Associazione GFOSS.it.
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ing. Guglielmo R. Raimondi
Glasic S.r.l.
www.glasic.it
g.raimondi at glasic.it
cell.: 347 6720673
tel.: 06 83502893
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Maggiori informazioni sulla lista
Gfoss