Desain terbaik untuk prototipe Open Source Python / PostGIS

9

Saya menulis aplikasi web intensif data yang dikirimkan melalui apache. Pertanyaan saya adalah tentang cara mengatur pemrosesan yang terbaik karena ada beberapa opsi.

Saya memiliki OpenLayers / JQuery / Javascript, PostGIS / Postgresql (dengan pgsql), python / psycopg2, php.

Basis data berisi sekitar 3 juta baris dan prototipe saat ini berjalan sebagai berikut:

  • Pengguna mengklik suatu titik di jendela OpenLayers

  • Koordinat dikirim sebagai permintaan AJAX melalui ke fungsi python di server

  • Saat ini aplikasi saya tidak memiliki kewarganegaraan

  • Psycopg2 Python digunakan untuk memanggil prosedur tersimpan pgsql dan sekumpulan nilai WKT (dan bidang data) yang besar dikembalikan ke modul python

  • Bidang data digunakan untuk mengkategorikan catatan WKT dalam python sebagai berikut: semua nilai WKT dikategorikan ke dalam salah satu dari 5 grup. Sekitar 1% dari nilai WKT sebenarnya dimodifikasi.

  • Lima set / grup WKT disangga untuk membuat lima poligon yang berbeda. Saat ini saya memanggil prosedur tersimpan dalam database untuk melakukan ini. Ini pada gilirannya hanya menggunakan ST_BUFFER. (Saya sudah mempertimbangkan menggunakan Shapely tetapi saya tidak yakin akan ada keuntungan kinerja karena perpustakaan GEOS digunakan dalam kedua kasus ...)

  • Akhirnya 5 nilai teks WKT dibungkus dalam string JSON dan dikirim kembali ke OpenLayers untuk dirender sebagai lima lapisan.

Saya menemukan bahwa kemacetan adalah pencarian spasial awal dan tahap buffering akhir.

Saya kira pertanyaannya adalah:

Apakah ada cara yang lebih baik untuk mengatur berbagai hal? Sebagai contoh, haruskah SEMUA pemrosesan data dilakukan dalam PostgreSQL (misalnya dengan kursor) dan apakah ini akan menjadi hal yang baik dalam hal pemeliharaan dan kinerja? Apakah lebih baik menggunakan server ubin untuk menghindari melewatkan string WKT panjang ke klien web? Bagaimana Anda mengatasinya?

John Steedman
sumber
Apakah buffer selalu jarak yang sama atau berdasarkan input pengguna? Apakah Anda buffer prosedur tersimpan beroperasi terhadap data yang dikirimkan dari python atau tabel asli? Juga akan berguna untuk memiliki beberapa gagasan tentang apa yang ingin Anda capai.
Matthew Snape
Matthew - Saya mencoba membuat poligon drivetime. Saya tahu sesuatu tentang poligon cekung tetapi ingin mencobanya dengan cara ini, terutama untuk akurasi yang lebih baik. Poligon adalah 200 m buffer MultiLinestrings (yaitu: jalan). Saat ini saya bermain dengan ide pre-buffering semua jalan di database, tapi saya masih harus menggabungkannya. \ n #
John Steedman
Secara umum, saya ingin menyelesaikan arsitektur yang menyeimbangkan pemrosesan geo yang cukup intensif dengan antarmuka pengguna web yang responsif: tentu saja tidak secepat Google, tetapi dapat dikenali dari segi harapan pengguna saat ini! Ini untuk beberapa pengguna listrik.
John Steedman

Jawaban:

3

Buffering bottleneck

Saat menggunakan ST_Buffer, Anda dapat mengurangi kerumitan bentuk yang dihasilkan dengan menambahkan opsi num_seg_quarter_circle yang lebih rendah. Ini harus mengurangi jumlah pemrosesan saat buffering, dan dalam operasi selanjutnya.

Dari dokumentasi PostGIS:

masukkan deskripsi gambar di sini

Secara umum di PostGIS Anda akan mendapatkan kinerja yang lebih baik jika Anda menjalankan query terhadap tabel yang diindeks dengan benar. Ini memberi Anda akses mudah ke beberapa optimisasi (seperti pengelompokan). Pertimbangkan memproses 1% yang berubah secara terpisah, dan menggabungkan keduanya di akhir.

Matthew Snape
sumber
2

Sama sekali tidak memikirkan arsitektur, untuk semua aplikasi pemetaan Web, Anda ingin melakukan sebanyak mungkin pemrosesan sebelumnya. Ini berarti bahwa jika Anda bisa, buffer harus dipra-komputasi, semua data Anda harus dalam SRS keluaran, dll. Jelas, beberapa data dan perhitungan harus dinamis.

Saya menyarankan selain Python, Anda melihat MapServer dan Geoserver untuk melakukan perhitungan dan menghasilkan output. Keduanya dapat menghasilkan ubin gambar atau output GeoJSON. Kedua aplikasi dapat menggunakan PostGIS sebagai ujung belakang.

DavidF
sumber
Terima kasih, David. Kedengarannya seperti kebijakan yang bagus yang telah saya ikuti sendiri. Saya akan melihat GeoServer untuk ubin gambar. Saya telah menggunakan python / mapnik di masa lalu untuk ini.
John Steedman
Hal lain yang baru saya ketahui adalah mengembalikan baris melalui prosedur tersimpan sangat, (sangat, sangat) lambat.
John Steedman