> > non è proprio semplice ma io mi sono fatto uno script in python/ruby > > che legge lo shape e poi scrive su un file osm ogni tot feature lette, > > usando le librerie messe a disposizione da OGR non è difficile. Se non > > hai troppa fretta posso vedere di adattarlo al tuo caso. > > Mi passi lo script?
ecco quà, alla fine lo riscritto in python per evitarti di installare i bindings di ruby (operazione non così semplice purtroppo). hai bisogno di gdal e di gdal-python (con osgeo4w li installi in un attimo anche sotto windows). lo script è molto semplice e non fa troppi controlli ma sembra funzionare, basta che lo avvii così: python split_shp.py [file.shp] [numero di features] il risultato sono un certo numero di file shp (con prj, shx relativi) creati nella cartella da cui l'hai lanciato, ognuno di essi contiene al massimo [numero di features]. lo script puoi consideralo in Public Domain ;-) Ciao, Stefano
#!/usr/bin/python # -*- coding: iso-8859-1 -*- import sys import os import osgeo.osr import osgeo.ogr driver = osgeo.ogr.GetDriverByName("ESRI Shapefile") data_source = osgeo.ogr.Open(sys.argv[1]) threshold = int(sys.argv[2]) if data_source == None: print "Non riesco a leggere il file shape" sys.exit(1) # leggi il primo (e di solito unico) layer layer = data_source.GetLayer(0) # cicla sulle features e salva i vari shp feature = layer.GetNextFeature(); i = 0 data_source_new = None layer_new = None while feature: print i if( i%threshold == 0): # chiudi lo shape attualmente aperto (tranne la prima volta) if data_source_new != None: data_source_new.Destroy() # crea un nuovo shape data_source_new = driver.CreateDataSource(".") # duplica il layer layer_defn = layer.GetLayerDefn() layer_new = data_source_new.CreateLayer( layer_defn.GetName() + "_" + str(i/threshold), layer.GetSpatialRef(), layer_defn.GetGeomType()) # duplica gli attributi del layer field_count = layer_defn.GetFieldCount() for j in range(field_count): field_defn = layer_defn.GetFieldDefn(j) layer_new.CreateField(field_defn) # scrivi la feature nel nuovo layer layer_new.CreateFeature(feature) # chiudi la feature feature.Destroy() # passa alla prossima i = i + 1 feature = layer.GetNextFeature() # chiudi l'ultimo shape aperto if data_source_new != None: data_source_new.Destroy()
_______________________________________________ Talk-it mailing list Talk-it@openstreetmap.org http://lists.openstreetmap.org/listinfo/talk-it