Miglior design per il prototipo Open Source Python / PostGIS


9

Sto scrivendo un'applicazione Web ad alta intensità di dati che viene fornita tramite apache. La mia domanda è su come organizzare al meglio l'elaborazione dato che ci sono più opzioni.

Ho a disposizione OpenLayers / JQuery / Javascript, PostGIS / Postgresql (con pgsql), python / psycopg2, php.

Il database contiene circa 3 milioni di righe e il prototipo attualmente funziona come segue:

  • L'utente fa clic su un punto nella finestra OpenLayers

  • Le coordinate vengono inviate come richiesta AJAX attraverso una funzione Python sul server

  • Attualmente la mia applicazione è apolide

  • Psycopg2 di Python viene utilizzato per richiamare una procedura memorizzata pgsql e un ampio set di valori WKT (e un campo dati) vengono restituiti al modulo python

  • Il campo dati viene utilizzato per classificare i record WKT in Python come segue: tutti i valori WKT sono classificati in uno dei 5 gruppi. Circa l'1% dei valori WKT viene effettivamente modificato.

  • I cinque set / gruppi di WKT sono bufferizzati per creare cinque poligoni distinti. Attualmente chiamo una procedura memorizzata nel database per farlo. Questo a sua volta utilizza solo ST_BUFFER. (Ho considerato l'utilizzo di Shapely ma non sono sicuro che ci sarà un vantaggio in termini di prestazioni poiché la libreria GEOS viene utilizzata in entrambi i casi ...)

  • Infine, i 5 valori di testo WKT sono racchiusi in una stringa JSON e rispediti a OpenLayers per il rendering in cinque livelli.

Sto scoprendo che i colli di bottiglia sono la ricerca spaziale iniziale e la fase di buffering finale.

Immagino che la domanda sia:

C'è un modo migliore per organizzare le cose? Ad esempio, TUTTO l'elaborazione dei dati dovrebbe essere eseguita in PostgreSQL (ad es. Con i cursori) e sarebbe una buona cosa in termini di manutenzione e prestazioni? Sarebbe meglio usare un server tile per evitare di passare lunghe stringhe WKT al client web? Come lo affronteresti?


I buffer sono sempre alla stessa distanza o in base all'input dell'utente? La procedura memorizzata nel buffer funziona con i dati inviati da Python o dalla tabella originale? Inoltre sarebbe utile avere un'idea di ciò che stai cercando di ottenere.
Matthew Snape,

Matthew - Sto cercando di creare poligoni nel periodo di guida. So qualcosa sui poligoni concavi, ma volevo provarlo in questo modo, principalmente per una migliore precisione. I poligoni sono buffer di 200 m di MultiLinestrings (ovvero: strade). Attualmente sto giocando con l'idea di pre-buffering di tutte le strade nel database, ma ho ancora bisogno di unirle. \ n #
John Steedman,

Più in generale sto cercando di accontentarmi di un'architettura che bilanci una geo-elaborazione piuttosto intensa con un'interfaccia utente web reattiva: non veloce come Google, ovviamente, ma riconoscibile in termini di aspettative degli utenti di oggi! Questo è per pochi utenti esperti.
John Steedman,

Risposte:


3

Collo di bottiglia nel buffer

Quando si utilizza ST_Buffer è possibile ridurre la complessità della forma risultante aggiungendo un'opzione num_seg_quarter_circle inferiore. Ciò dovrebbe ridurre la quantità di elaborazione durante il buffering e nelle operazioni successive.

Dalla documentazione PostGIS:

inserisci qui la descrizione dell'immagine

Generalmente in PostGIS si ottengono prestazioni migliori se si eseguono query su tabelle esistenti correttamente indicizzate. Ciò consente di accedere facilmente a diverse ottimizzazioni (come il clustering). Valuta di elaborare l'1% che cambia separatamente e di unire i due alla fine.


2

Non pensando affatto all'architettura, per tutte le applicazioni di mappatura Web, si desidera eseguire la maggior parte dell'elaborazione in anticipo. Ciò significa che se è possibile, i buffer devono essere pre-calcolati, tutti i dati dovrebbero essere nell'output SRS, ecc. Ovviamente, alcuni dati e calcoli devono essere dinamici.

Suggerisco che oltre a Python, guardi MapServer e Geoserver per fare i calcoli e produrre l'output. Entrambi potrebbero produrre riquadri immagine o output GeoJSON. Entrambe le applicazioni possono utilizzare PostGIS come back-end.


Grazie David. Sembra una buona politica che sto andando alla deriva verso me stesso. Esaminerò GeoServer per le tessere immagine. Ho usato python / mapnik in passato per questo.
John Steedman,

L'altra cosa che ho appena scoperto è che la restituzione delle righe tramite una stored procedure è molto, molto, molto lenta.
John Steedman,
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.