J'écris une application Web gourmande en données qui est livrée via Apache. Ma question est de savoir comment organiser au mieux le traitement étant donné qu'il existe plusieurs options.
J'ai à ma disposition OpenLayers / JQuery / Javascript, PostGIS / Postgresql (avec pgsql), python / psycopg2, php.
La base de données contient environ 3 millions de lignes et le prototype fonctionne actuellement comme suit:
L'utilisateur clique sur un point de la fenêtre OpenLayers
Les coordonnées sont envoyées sous forme de requête AJAX à une fonction python sur le serveur
Actuellement, ma demande est apatride
Le psycopg2 de Python est utilisé pour appeler une procédure stockée pgsql et un ensemble plus large de valeurs WKT (et un champ de données) sont renvoyés au module python
Le champ de données est utilisé pour classer les enregistrements WKT en python comme suit: toutes les valeurs WKT sont classées dans l'un des 5 groupes. Environ 1% des valeurs WKT sont réellement modifiées.
Les cinq ensembles / groupes de WKT sont tamponnés pour créer cinq polygones distincts. J'appelle actuellement une procédure stockée dans la base de données pour ce faire. À son tour, cela utilise simplement ST_BUFFER. (J'ai envisagé d'utiliser Shapely mais je ne suis pas sûr qu'il y aura un avantage en termes de performances car la bibliothèque GEOS est utilisée dans les deux cas ...)
Enfin, les 5 valeurs de texte WKT sont enveloppées dans une chaîne JSON et renvoyées à OpenLayers pour un rendu sous forme de cinq couches.
Je trouve que les goulots d'étranglement sont la recherche spatiale initiale et la dernière étape de mise en mémoire tampon.
Je suppose que la question est:
Y a-t-il une meilleure façon d'organiser les choses? Par exemple, TOUS les traitements de données devraient-ils être effectués dans PostgreSQL (par exemple avec des curseurs) et est-ce que ce serait une bonne chose en termes de maintenance et de performances? Serait-il préférable d'utiliser un serveur de tuiles pour éviter de passer de longues chaînes WKT au client Web? Comment aborderiez-vous cela?