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

Rispondere a