Release eraly and often:

Ho trovato il gns2shp.py di Jan-Oliver Wagner per capire come scrivere
i shapefiles.

In allegato versione 0.2:  ora il shape in output si vede in QGIS ;-)

Da fare ancora:
* testare
* verificare se funziona con particelle con buchi (magari dipende del
ordinamento dei vertici
* magari separare in moltipli layers...
* forse scrivere un .prj file??? [1]
* parsing di altri layers, in particolare i punti fiduciari

[1] ho guardato il prj file velociemente e sembra che il "nuovo stile"
usa WKT e sembra anche che OGR lo legge.  Sarebbe interessante di
vedere che fanno poi tool di inserimento in postgis (ogr2ogr,
shp2pgsql) con questo metadata sul ref sys, in particolare se tenta fare
un match tra WKT e SRID...

Suggerimenti e richieste su come meglio fare molto benvenuti.  In
particolare:

* che layer conviene fare?  Ad esempio uno per mappa, uno per acqua e
strade, uno per particelle, uno per fabricati?  

* quali altri elementi del CMF sono importanti da leggere?  

saluti
-b


-- 
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/
#######################################################################
## =======
## 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, dbflib
import elementtree.ElementTree as ET

version = "0.2 18/12/2007"
inFileName = "testdata/E202_000100.CMF"
#inFileName = "testdata/vertisola.CMF"
outFileName = "testout"


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 createShp(self, name):
        "creates a shp and a dbf file, the latter based on the attDict"
        shp = shapelib.create(name, shapelib.SHPT_POLYGON)
        dbf = dbflib.create(name)
        dbf.add_field("bordoType", dbflib.FTString, 10, 0)
        dbf.add_field("mappaID", dbflib.FTString, 11, 0)
        dbf.add_field("particellaID", dbflib.FTString, 15, 0)
        dbf.add_field("valenza", dbflib.FTString, 11, 0)
        dbf.add_field("esternconf", dbflib.FTString, 2, 0)
        del dbf
        dbf = dbflib.open(name, 'r+b')
        return shp, dbf

    def writeToShp(self, shpFile, dbfFile):
        "writes out feature to a shape file"
        #print self.geom
        #shpObj = shapelib.SHPObject(shapelib.SHPT_POLYGON, 1, self.geom)
        #shpObj = shapelib.SHPObject(shapelib.SHPT_POLYGON, 1, [[(10,10), (10,20), (20,20), (10,10)],])
        fid = shpFile.write_object(-1, shapelib.SHPObject(shapelib.SHPT_POLYGON, 1, self.geom))
        dbfFile.write_record(fid, (self.bordoType, self.mappaID, self.particellaID, self.valenza, self.esterconf))
        #del shpObj
        print "fid is: %s" % fid
        

#-------------------------------------
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 = [map(float, subStr.split(',')) for subStr in coordStr.split()]
    vertexList = map(tuple, vertexList)
    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(inFileName)
mapRoot = mapTree.getroot()
mapID = mapRoot.find("INFOMAPPA").get("nome")
featureList = []

#-- process BORDO elements ------------------
# FixMe:  there can be multiple "COORD" elements, see spec of CML..

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))

shpf, dbff = featureList[0].createShp(outFileName)
for feature in featureList:
    feature.writeToShp(shpf, dbff)
shpf.close()
dbff.close()
del shpf
del dbff
_______________________________________________
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.

Rispondere a