Açık Kaynak Python / PostGIS prototipi için en iyi tasarım


9

Apache üzerinden sunulan veri yoğun bir web uygulaması yazıyorum. Sorum, birden fazla seçenek olduğu için işlemenin en iyi nasıl düzenleneceği ile ilgili.

Benim emrinde OpenLayers / JQuery / Javascript, PostGIS / Postgresql (pgsql ile), python / psycopg2, php var.

Veritabanı yaklaşık 3 milyon satır içeriyor ve prototip şu anda şu şekilde çalışıyor:

  • Kullanıcı OpenLayers penceresindeki bir noktayı tıklar

  • Koordinat, sunucudaki bir python işlevine AJAX isteği olarak gönderilir

  • Şu anda başvurum vatansız

  • Python'un psycopg2 bir pgsql saklı yordamı çağırmak için kullanılır ve büyük bir WKT değerleri kümesi (ve bir veri alanı) python modülüne geri döndürülür

  • Veri alanı, Python'daki WKT kayıtlarını aşağıdaki gibi kategorilere ayırmak için kullanılır: tüm WKT değerleri 5 gruptan birinde sınıflandırılır. WKT değerlerinin yaklaşık% 1'i aslında değiştirilir.

  • WKT'nin beş seti / grubu, beş farklı çokgen oluşturmak için tamponlanır. Şu anda bunu yapmak için veritabanında saklı bir yordam çağırıyorum. Bu da sadece ST_BUFFER kullanır. (Shapely kullanmayı düşündüm ama GEOS kütüphanesi her iki durumda da kullanıldığından performans avantajı olacağından emin değilim ...)

  • Son olarak, 5 WKT metin değeri bir JSON dizesinde toplanır ve beş katman halinde oluşturulması için OpenLayers'a geri gönderilir.

Darboğazların ilk mekansal araştırma ve son tamponlama aşaması olduğunu görüyorum.

Soru sanırım:

Bir şeyleri düzenlemenin daha iyi bir yolu var mı? Örneğin, TÜM veri işleme PostgreSQL'de (örneğin imleçlerle) yapılmalıdır ve bu bakım ve performans açısından iyi bir şey midir? Uzun WKT dizelerini web istemcisine aktarmaktan kaçınmak için bir döşeme sunucusu kullanmak daha iyi olur mu? Nasıl hitap edersin?


Tamponlar her zaman aynı mesafede mi yoksa kullanıcı girişine göre mi? Arabellek saklı yordam, python veya özgün tablodan gönderilen verilere karşı çalışır mı? Ayrıca neyi başarmaya çalıştığınız hakkında bir fikriniz olması da yararlı olacaktır.
Matthew Snape

Matthew - Aktarma zamanı çokgenleri oluşturmaya çalışıyorum. İçbükey çokgenler hakkında bir şeyler biliyorum ama öncelikle daha iyi doğruluk için bu şekilde denemek istedim. Çokgenler 200m MultiLinestrings tamponudur (yani yollar). Şu anda veritabanındaki tüm yolları önceden arabelleğe alma fikri ile oynuyorum, ama yine de onları birleştirmem gerekiyor. \ n #
John Steedman

Daha genel olarak, oldukça yoğun bir coğrafi işlemeyi duyarlı bir web kullanıcı arayüzü ile dengeleyen bir mimariye yerleşmeye çalışıyorum: elbette Google kadar hızlı değil, bugünün kullanıcı beklentileri açısından tanınabilir! Bu, birkaç uzman kullanıcı içindir.
John Steedman

Yanıtlar:


3

Arabelleğe alma darboğaz

ST_Buffer kullanırken, daha düşük bir num_seg_quarter_circle seçeneği ekleyerek ortaya çıkan şeklin karmaşıklığını azaltabilirsiniz. Bu, arabelleğe alma sırasında ve sonraki işlemlerde işleme miktarını azaltmalıdır.

PostGIS belgelerinden:

resim açıklamasını buraya girin

Genellikle PostGIS'te, uygun şekilde dizinlenmiş tablolara karşı sorgular çalıştırırsanız daha iyi performans elde edersiniz. Bu, çeşitli optimizasyonlara (kümeleme gibi) kolay erişim sağlar. Ayrı olarak değişen% 1'i işlemeyi ve sonunda ikisini birleştirmeyi düşünün.


2

Mimari hakkında hiç düşünmüyorsanız, tüm Web haritalama uygulamaları için, işlemlerin çoğunu önceden yapmak istersiniz. Bu, eğer mümkünse, tamponların önceden hesaplanması, tüm verilerinizin SRS çıktısında vb. Olması gerektiği anlamına gelir. Açıkçası, bazı verilerin ve hesaplamaların dinamik olması gerekir.

Python'un ötesinde, hesaplamaları yapmak ve çıktıyı üretmek için MapServer ve Geoserver'a bakmanızı öneririm. Her ikisi de görüntü döşemeleri veya GeoJSON çıktısı üretebilir. Her iki uygulama da PostGIS'i arka uç olarak kullanabilir.


Teşekkürler, David. Kendime doğru sürüklediğim iyi bir politika gibi geliyor. Resim döşemeleri için GeoServer'a bakacağım. Bunun için geçmişte python / mapnik kullandım.
John Steedman

Az önce öğrendiğim bir diğer şey de, saklı yordam ile satır döndürmenin çok (çok, çok) yavaş olmasıdır.
John Steedman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.