> > 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
[email protected]
http://lists.openstreetmap.org/listinfo/talk-it