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?
sumber
Jawaban:
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:
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.
sumber
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.
sumber