Dividi un file di forma complesso in una griglia


11

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:

  1. Lo fa. Tutto è in WGS84 Lat / Lon
  2. 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.
  3. Nessun campo di attributo viene mantenuto durante il processo, mi interessa solo la geometria.
  4. 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.
  5. 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:

inserisci qui la descrizione dell'immagine

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.


Dove hai preso lo shapefile del mondo o dell'Australia? Sospetto che la geometria di quel file possa avere dei problemi (prova Vector | Geometry Tools | Controlla la geometria in QGIS). Ho appena provato un incrocio su un shapefile di mondo più piccolo e tessere a 5 gradi e funziona perfettamente in QGIS.
Simbamangu,

1
Ho provato questo con la costa australiana da 100K di Geoscience Australia (20 MB) e piastrelle a 4 gradi, funziona anche bene (QGIS 1.7.4, OSX 10.7). Potresti descrivere più in dettaglio i tuoi dati e cosa hai fatto?
Simbamangu,

Grazie per tutte le informazioni extra. Sospetto che ci sia qualcosa di strano nei dati OSM; provalo con il set di dati che ho citato e vedi se ottieni risultati migliori. Mi sembra di ricordare di aver sperimentato qualche stranezza con i dati del lago OSM in passato, proverò a cercarlo.
Simbamangu,

Potresti condividere il set di dati o anche una parte ritagliata (come nell'esempio sopra)?
Simbamangu,

Risposte:


7

Ho appena finito di creare i miei strumenti per farlo.

Ho usato la libreria Clipper ( http://www.angusj.com/delphi/clipper.php ) insieme a OGR per dividere il mio set di dati. Qualcosa da notare è che eseguire intersezioni ingenuamente con questa lib richiede molto tempo, quindi ho invece usato un approccio quadrifoglio ... vale a dire, dividere in quattro celle della griglia, dividere ognuna di esse in altre quattro, ecc., Finché non si ottiene la risoluzione desiderata. La lib funziona alla grande però, ho allegato uno screenshot che mostra i risultati nell'emisfero orientale:

inserisci qui la descrizione dell'immagine

Il risultato di cui sopra ha richiesto circa 4,5 ore su un processore da 1,33 GHz.

Ecco gli strumenti nel caso in cui qualcuno dovesse riscontrare un problema simile in futuro. Tieni presente che sono stati hackerati insieme alla prova di concetti e probabilmente non dovresti usarli direttamente (potrebbe essere un buon punto di partenza per qualcosa):

https://github.com/preet/scratch/tree/master/gis/polytoolkit

https://github.com/preet/scratch/tree/master/gis/shapefiles/shptk


Il codice collegato non è più disponibile :-(
Shaun McDonald

Ho spostato il repository su github.com/preet/scratch/tree/master/gis/polytoolkit . A seconda di cosa esattamente stai cercando di realizzare, potresti trovare github.com/preet/scratch/tree/master/gis/shapefiles/shptk più utile.
Pris,

Quello successivo è più utile. Ora ho trovato un metodo che utilizza PostGIS, anche se sarebbe interessato a scoprire se questo fosse più veloce. Hai un readme per la compilazione e l'installazione?
Shaun McDonald,

Potresti forse modificare la tua risposta per correggere il link? Grazie
Afr

4

Sembra proprio che tu abbia problemi di geometria. È improbabile che sia in grado di produrre risultati puliti da un file di input sporco, indipendentemente dal software utilizzato, a meno che non si affrontino per la prima volta i problemi di geometria. Una volta risolti i problemi di geometria, puoi provare quanto segue se i problemi persistono:

1) Assicurarsi che il set di dati della griglia abbia la stessa proiezione del set di dati del poligono mondiale. In caso contrario, ricrearlo nella proiezione corretta.

2) Converti tutte le funzionalità in una singola parte - molto più facile da elaborare

3) Rimuovi tutti i campi estranei mantenendo solo il campo ID che ti consentirà di unire nuovamente i tuoi attributi dopo che è stata eseguita l'intersezione, ancora più facile da elaborare

4) Invece di intersecare l'intero set di dati della griglia con l'intero set di dati del poligono mondiale, prova a passare in rassegna i poligoni della griglia, selezionando i poligoni che si intersecano nel set di dati del mondo e eseguendo una clip in base al poligono della griglia. Ciò ti consentirà di isolare eventuali problemi e alla fine potrai unire i risultati per raggiungere il tuo obiettivo originale.

5) Prova a utilizzare poligoni a griglia più grandi.


+1 Davvero interessante: quanto influisce sulla velocità di geoprocessing se si mantiene il campo ID, o multipart, nei dati?
Simbamangu,

1
In realtà non ho mai provato a quantificare le differenze. Posso solo parlare per esperienza in cui le operazioni di geoprocesing overaly sono fallite e queste sono le cose che hanno contribuito a risolvere il problema.
Brent Edwards,

Non sono riuscito a far funzionare (2) affatto. La selezione delle funzionalità e il tentativo di unirle usando QGIS sembra fondamentalmente bloccare il mio sistema - forse sta ancora elaborando roba, ma a quel ritmo non è pratico: ho lasciato il mio sistema durante la notte con QGIS ancora cercando di unire un paio di funzionalità nel set di dati e continuava ad esserci al mattino.
Pris,

1
Non ci dovrebbe essere alcuna fusione coinvolta. L'obiettivo è quello di far esplodere funzionalità multipart. Ad esempio, nello screenshot della tessera fallita, l'obiettivo è quello di far esplodere tutti i tuoi record contenenti poligoni raggruppati e spazialmente disgiunti come le caratteristiche dell'isola lungo la costa del BC e dell'Alaska, in record poligonali separati, a parte singola. Ciò può essere ottenuto in QGIS utilizzando lo strumento "Da più parti a parti singole" nel menu Vettore> Strumenti geometria.
Brent Edwards,

Una volta convertito in una singola parte, è necessario riconvalidare la geometria, solo per essere certi che tutto sia pulito.
Brent Edwards,

0

Un altro approccio potrebbe essere stato quello di provare una conversione da vettore a raster per creare un set di dati punto e quindi utilizzare il set di dati punto come base per scrivere del codice per creare i riquadri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.