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" <[EMAIL PROTECTED]> A : [email protected] 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 <[EMAIL PROTECTED]> > ## 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: > [EMAIL PROTECTED] Comune di Grosseto > jabber: [EMAIL PROTECTED] 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 [email protected] > 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 [EMAIL PROTECTED] cell.: 347 6720673 tel.: 06 83502893 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _______________________________________________ Prenota la tua maglietta GFOSS.it: http://wiki.gfoss.it/index.php/Gadgets Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione [email protected] 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.
