PnX-SI / GeoNature

Application de saisie et de synthèse des observations faune et flore
GNU General Public License v3.0
103 stars 102 forks source link

Controles spatiaux - PostGIS ou Javascript ? #642

Open camillemonchicourt opened 5 years ago

camillemonchicourt commented 5 years ago

Pour le module https://github.com/PnX-SI/gn_module_flore_prioritaire, @richardvergely a besoin de contrôler que les observations saisies sont bien dans la zone de prospection créée auparavant.

Pour cela, il a investigué 2 pistes :

Il a pu tester la deuxième solution, en ajoutant TurfJS dans le packages.json de GeoNature et cela fonctionne bien. Par contre ça charge pas mal de javascript et d'autres librairies dépendantes dans les node_modules de GeoNature.

Néanmoins cette librairie pourrait avoir de nombreux usages.

Un avis sur le sujet ?

jbrieuclp commented 5 years ago

Toujours, assurer des verifs côté serveur... Par contre une question qui pour moi est pour le moment restée sans réponse, c'est comment avoir les même objet geo entre le js et postgis : postgis traite les données en format WKB (et encore j'suis même pas certain) à moins que leaflet turf ou n'importe quelle autre lib gère ce format, il y a forcement une modif de la géométrie au moindre aller-retour Postgis>JS>Postgis ou JS>Postgis>JS du au changement de format et aux arrondies des coordonnées... En attendant pour moi le faire côté serveur c'est, en plus de la sécurité, utiliser la force de postgis en laissant un peu de repos à son navigateur qui déjà en a ras la margoulette avec des apps toujours plus lourdes. C'est garder une stabilité de fonctionnement, les évolutions de postgis sont moins éphémères que celles des lib JS qui sont soumissent à un phénomène de mode. Il y a juste le problème d'aller/retour des géométries. Enfin l’inconvénient de faire les traitement sous postgis c'est le temps de latence dû à l'attente de la réponse du serveur pour pouvoir continuer les modifs...

camillemonchicourt commented 5 years ago

Oui j'aime bien aussi le faire par PostGIS, plus sur et solide à priori. C'est d'ailleurs comme ça qu'on fait au niveau de Occtax pour renvoyer au Front les altitudes, les communes etc... Et tu soulèves un point important qu'est la sollicitation du navigateur et de la RAM du client.

gildeluermoz commented 5 years ago

Il est difficile d'avoir une réponse unique à ce genre de problématique car tout cela est dépendant de points non maîtrisables. Les performances globales de l'appli sont dépendantes :

Si les volumes à transmettre entre le client et serveur ne sont pas trop importants et ni trop fréquents, j'aurais tendance à faire coté client pour ne pas pénaliser ceux qui ont des accès internet pitoyables (fluidité de l'appli). Par contre si les traitements sont potentiellement lourds et/ou que des croisements doivent se faire avec des couches difficilement importables coté client (communes, mnt, etc,...) il est bien souvent préférable de le faire faire par Postgis coté serveur.

camillemonchicourt commented 5 years ago

Oui en effet le contexte du besoin est à prendre en compte. Ajouter des possibilités de contrôle spatial coté client peut être un plus pour GeoNature. Par contre les premiers tests de la librairie Turf JS ont montré que celui-ci avait de nombreuses dépendances (dont NodeJS) qui faisaient considérablement grossir le projet, ses dépendances, donc sa maintenabilité. Cela aussi est à prendre en compte dans les solutions à privilégier. Du coup pour le moment, on met al solution Turf JS de côté.

gildeluermoz commented 5 years ago

Oui ça me semble plus sage. Vous comptiez la charger de quel type de contrôles spatiaux (surtout quelles couches seraient en jeu) ?

richardvergely commented 5 years ago

Quand on crée une aire de présence, on vérifie qu'elle est bien dans la zone de prospection. Le contrôle spatial effectué par turf est booleanContains qui renvoie un booléen en sortie.

gildeluermoz commented 5 years ago

Ok, 1 ap et 1 ZP, donc les volumes sont faibles, ça peut valoir le cout de le faire coté client. Leaflet ne sais pas faire ça ? ou au moins un plugin leaflet. Dans GN1, de mémoire, c'est Openlayers qui le faisait. Car oui Camille a raison, installer nodejs pour ça, je trouve que c'est dommage.

gildeluermoz commented 5 years ago

https://leafletjs.com/reference-1.5.0.html#latlngbounds-contains

gildeluermoz commented 5 years ago

A creuser, il n'y a pas de fonction native on dirait http://jsfiddle.net/nathansnider/egzxw86h/

camillemonchicourt commented 5 years ago

Voici un premier développement pour le faire directement en javascript : https://github.com/PnX-SI/gn_module_flore_prioritaire/commit/3130dfb89ec46d34f2bbe9c7eea7c69819923364

camillemonchicourt commented 5 years ago

Une piste. Dans ce plugin Leaflet ils font des CONTAINS ou INTERSECT : https://github.com/zakjan/leaflet-lasso

Ça peut valoir le coup de voir comment ils les font.