MTES-MCT / metadata-postgresql

Plume : gestion des métadonnées du patrimoine PostgreSQL
https://mtes-mct.github.io/metadata-postgresql/
GNU Affero General Public License v3.0
1 stars 1 forks source link

Visualisation de tous les types de géométries ? #34

Closed alhyss closed 2 years ago

alhyss commented 2 years ago

... ou du moins tous ceux dont QGIS saura interpréter les WKT.

Au titre des pistes à creuser, je me demande s'il ne serait pas possible d'avoir un processus de visualisation qui s'appuie uniquement sur :

De cette façon, il n'y aurait plus besoin de différencier les types de géométries, ce qui pourrait permettre de les visualiser à peu près tous (tous ceux que reconnaît QgsGeometry.fromWkt).

J'ai testé en ajustant plume.bibli_plume_tools_map.GeometryMapToolShow.__init__ de la manière suivante :

...
if etat:
    res = split_rdf_wkt(mCoordSaisie)
    if res:
        geom_wkt, self.srid = res
        self.crs = QgsCoordinateReferenceSystem()
        try: 
            self.geom = QgsGeometry.fromWkt(geom_wkt)
            self.crs.createFromUserInput(self.srid)
        except: 
            zTitre = QtWidgets.QApplication.translate("plume_ui",
                "PLUME : Warning", None)
            zMess  = QtWidgets.QApplication.translate("plume_ui",
                "Géométrie invalide ou type non pris en charge.", None)
            bibli_plume.displayMess(self.Dialog,
                (2 if self.Dialog.displayMessage else 1),
                zTitre, zMess, Qgis.Warning, self.Dialog.durationBarInfo)
            return

        self.rubberBand = QgsRubberBand(self.canvas)
        self.rubberBand.setToGeometry(self.geom, crs=self.crs)
        # NB. le type de géométrie du QgsRubberBand est automatiquement
        # défini par setToGeometry

        # configuration du QgsRubberBand :
        self.rubberBand.setWidth(int(self.Dialog.geomEpaisseur))
        self.rubberBand.setColor(QColor(self.Dialog.geomColor))
        self.rubberBand.setFillColor(QColor(255, 0, 0, 0)) # transparent
        # dont paramètres qui ne serviront qu'aux géométries ponctuelles :
        icon = getattr(QgsRubberBand, self.Dialog.geomPoint, QgsRubberBand.ICON_X)
        self.rubberBand.setIcon(icon)
        self.rubberBand.setIconSize(9) # à rendre paramétrable ?

        self.rubberBand.show()

        # Zoom si case cochée dans personnalisation de l'interface :
        if self.Dialog.geomZoom: 
            map_crs = QgsCoordinateReferenceSystem()
            map_crs.createFromUserInput(self.mAuthid)
            transform = QgsCoordinateTransform(self.crs, map_crs, QgsProject.instance())
            self.canvas.setExtent(transform.transformBoundingBox(self.geom.boundingBox()))
            self.canvas.redrawAllLayers()

J'ai l'impression que ça fonctionne, mais je suis peut-être passée à côté d'effets de bord importants. @WREATCHED, je te laisse voir si cette piste est intéressante à investiguer ou si c'est une impasse.

(En fait, j'ai vu un peu par hasard - en essayant de comprendre où était le problème avec le référentiel OGC:CRS84 - qu'il y avait une variante de QgsRubberBand.setToGeometry qui permettait de spécifier le référentiel, et je n'ai pas pu résister à l'envie de voir jusqu'où on pouvait aller s'il n'était plus nécessaire de transformer manuellement les géométries... Même si on n'en fait rien, au moins je saurai maintenant de quoi tu me parles avec tes rubber bands.)

Une grosse différence est qu'avec cette méthode il faut un QgsRubberBand pour toutes les géométries, y compris ponctuelles. On dirait que ça marche assez bien quand on s'en tient à de la visualisation ? Par contre il me manquait une valeur pour QgsRubberBand.setIconSize. Je l'ai fixée en dur à 9, mais - en admettant qu'on parte là-dessus - ce serait certainement à gérer via un paramètre utilisateur ?

À voir quand tu as un peu de temps, donc...

Je flèche sur la version 1.0. Le système actuel fonctionne très bien, il n'y aucune urgence à le retoucher.

WREATCHED commented 2 years ago

Ok pour moi image

alhyss commented 2 years ago

Cool ! Tu t'es amusé à tester la visualisation sur des types qu'on ne prenait pas en charge jusque-là, genre multi-points ?

On est d'accord que ce sera dans la v0.4 bêta ? Tu l'as même déjà poussé sur le Git, si je ne me trompe pas.

WREATCHED commented 2 years ago

Bjr Leslie, Oui, je l'ai poussé sur le git en version 0.4 Non, je n'ai pas testé multipoints, car je ne l'ai pas implémenté dans la création. Je pense que c'est déjà plus que satisfaisant. non ?

alhyss commented 2 years ago

Oh, on est bien d'accord : il n'est en aucun cas question de proposer davantage de types à la création à ce stade, alors qu'on a déjà du mal à imaginer des cas d'usage pour tous ceux qui sont implémentés. Si je proposais de le faire pour la visualisation, c'est seulement parce que c'était peu coûteux pour nous.

alhyss commented 2 years ago

@WREATCHED Est-ce que tu pourras retirer la fonction plume.rdf.utils.geomtype_from_wkt des imports du module plume.bibli_plume_tools_map ? Si elle ne sert plus nulle part (tu confirmes ?) j'ai l'intention de la supprimer. C'était un machin un peu bricolé dont je n'étais pas franchement fière, je ne vois pas l'intérêt de la conserver si on n'en a plus besoin. J'ai déjà supprimé le passage de la documentation technique qui l'évoquait (anciennement dans cette partie), j'attends que tu retires l'import de ton côté et pousses ça sur le Git pour régler définitivement son compte à la fonction.

Accessoirement, tu utilises encore shapely dans ce module ? Si non, mieux vaudrait peut-être enlever aussi les imports, ça peut représenter un petit gain de temps. Et ça nous fera une dépendance en moins, même si c'est une bibliothèque aujourd'hui intégrée dans les distributions de QGIS...

WREATCHED commented 2 years ago

OK, c'est fait et poussé sur le GitHub à l'instant

alhyss commented 2 years ago

Merci ! Je viens de pousser la suppression de la fonction.