Ho uno shapefile abbastanza dettagliato con funzionalità poligono / multipoligono (il file è di circa 500 MB). In realtà è uno shapefile di tutto il mondo, con le caratteristiche che rappresentano le coste. Devo dividere questi dati usando una griglia. Per essere chiari, non voglio 'ordinare' i dati, ma in realtà tagliare i poligoni in tessere. Mi rendo conto che questa domanda è stata posta prima, ma le soluzioni che ho trovato non hanno funzionato per me.
Ho provato:
Utilizzando QGIS e intersecando i contenuti del mio shapefile con una griglia vettoriale, i risultati sono terribili. La maggior parte della grande massa terrestre scompare magicamente, anche se a volte sembra che piccoli pezzi di terra ce la facciano. Dovrei notare che questo metodo funziona davvero bene con dati molto più semplici (cioè meno punti)
Utilizzo degli strumenti di intersezione di OGR. L'ho provato sia tramite ogr2ogr che anche ruotando il mio strumento C ++. Entrambi hanno lo stesso problema di QGIS. Inoltre non presentano questo problema per file semplici, ma falliscono quelli più complessi. Per riferimento, sto usando uno shapefile di Australia e Nuova Zelanda, con dimensioni inferiori a 20 MB, e sia QGIS che OGR non riescono a "grigliarlo".
Qualcuno ha suggerito di utilizzare PostGIS a un certo punto, poiché ha una funzione di intersezione, ma ST_Intersect di PostGIS utilizza lo stesso back-end GEOS di OGR. In effetti entrambi chiamano la stessa funzione per quanto posso dire, quindi non credo che PostGIS produrrà risultati diversi.
Stavo cercando suggerimenti su cos'altro avrei potuto provare. Ho bisogno di una robusta applicazione o toolkit in grado di dividere shapefile altamente dettagliati in riquadri.
MODIFICA: aggiunta di ulteriori informazioni
In risposta a Simbamangu:
Lo shapefile è fondamentalmente dati sulla costa da OpenStreetMap. È una versione unita del file'roc_p_p (quindi non è suddivisa in riquadri) che ho ricevuto inviando una e-mail alla loro lista di sviluppo. Nota che la loro suddivisione delle tessere (in blocchi di 100 km x 100 km con sovrapposizione) non è necessariamente quello che voglio - non voglio sovrapposizioni e voglio la libertà di scegliere la dimensione della griglia, o userei semplicemente valore elaborato_p predefinito.
Per impostazione predefinita, i dati sulla costa presentano errori di geometria segnalati da QGIS. Correggo questi errori con un piccolo strumento che ho messo insieme usando del codice che ho trovato progettato per affrontare specificamente questo problema (riparazione degli errori di geometria nei dati della costa: https://github.com/tudelft-gist/prepair ). Il passaggio sui file con questo strumento corregge praticamente tutti gli errori rilevati da QGIS. Tento di fare l'intersezione solo dopo aver pulito i file.
Esattamente quello che ho fatto usando QGIS: Apri i dati per assicurarti che appaiano bene in QGIS. Prova a dividerlo in riquadri creando uno strato di riquadri utilizzando Griglia vettoriale con una spaziatura specificata, quindi intersecando i due livelli: non ci sono problemi. Prova a utilizzare un set di dati più piccolo: seleziona le funzionalità in Oceania (Aus, NZ) per provare un set di dati più piccolo: questo file di forma ha dimensioni <20 MB. Prova di nuovo a dividerlo, non funziona.
Cosa ho fatto con OGR: ogr2ogr usando direttamente le opzioni '-spat' e '-clipsrc' con spat_extent. Ho anche scritto un piccolo strumento C ++ che funziona su WKT, quindi converto lo shapefile in WKT usando ogr2ogr, quindi invio il file di testo alla mia applicazione. Scorre il file e chiama il metodo Intersection () documentato qui: http://www.gdal.org/ogr/classOGRGeometry.html . Penso che finisca per fare esattamente la stessa cosa che usare direttamente ogr2ogr.
In risposta a Brent:
- Lo fa. Tutto è in WGS84 Lat / Lon
- Avrei pensato che fosse vero il contrario: che per un dato set di tessere a griglia, occorrerebbe molto più tempo per intersecare un multipoligono gigante piuttosto che un gruppo di elementi frammentati che potrebbero essere più localizzati spazialmente per ogni tessera, ma questo è un suggerimento interessante - lo proverò e riporterò indietro.
- Nessun campo di attributo viene mantenuto durante il processo, mi interessa solo la geometria.
- Non sono sicuro, ma penso che tu stia dicendo che dovrei selezionare i poligoni che si sovrappongono a una determinata tessera della griglia e quindi eseguire l'intersezione. Questo è troppo ingombrante manualmente con QGIS. Il mio strumento lo fa già in una certa misura con un segno di spunta. C'è un po 'di accelerazione, ma il risultato finale è ancora scarso e non notevolmente diverso.
- Questa non è un'opzione. In questo momento sto cercando di dividere i dati in modo che sia 1 ° lat x 1 ° lon, e sto cercando una metodologia generale / robusta che funzioni con tutti i casi. Ho provato ad aumentare le dimensioni della griglia (cioè 10x10) per vedere se avrei ottenuto risultati migliori e non vedo alcuna correlazione tra le dimensioni della griglia e la qualità dell'output.
Modifica n. 2:
Ho provato a giocarci di più e in generale sembra che i risultati siano inaffidabili sia usando GEOS che con QGIS (che usa fTools, non so se a sua volta utilizzi di nuovo GEOS). Ho sbagliato a dichiarare che la dimensione della griglia non ha nulla a che fare con i risultati: più grande è la griglia, migliori sono i risultati (va bene sapere ma non è ancora una soluzione). Ecco uno screenshot di una griglia molto distanziata che per lo più ha funzionato, ma parzialmente fallita in un riquadro:
La geometria è pulita - QGIS mostra 0 errori con lo strumento "Verifica validità". Non sto cercando di affrontare questo problema in modo graduale; verificare se alcune funzionalità non hanno superato l'intersezione di un set di dati così grande quando non è visivamente evidente (e non lo sarà con tessere più piccole) non è pratico.