banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#1 Tue 02 July 2024 22:23

Bertrand_D
Juste Inscrit !
Lieu: Colmar
Date d'inscription: 2 Dec 2005
Messages: 7

Mapserver, analyse thematique depuis plusieurs champs de table

Bonjour,

Ma structure utilise Mapserver dans un site intranet cartographique avec une interface sous Géomoose.
Jusqu'à présent, la discrétisation, pour les représentations graphiques, se fait sur un seul champ de table à la fois.
Là où MapInfo et Qgis permettent de faire une analyse thématique bivariée, à ma connaissance, Mapserver ne le permet pas.

Ainsi, une table présentant des chutes de blocs pourra être décrite ainsi
CLASSITEM "code_alea"
        CLASS
            EXPRESSION "4"
            NAME "Alea chute de blocs fort
- PAC Val d'Argent"
            STYLE
                OUTLINECOLOR 255    64    64
            END
            STYLE
                SYMBOL "cercle_remplissage"
                SIZE 6
                COLOR   255    64    64
            END
        END
.................
tandis qu'une table présentant des glissements pourra être décrite de la sorte
CLASSITEM "code_alea"
        CLASS
            EXPRESSION "4"
            NAME "Alea glissement semi profond fort
- PAC Val d'Argent"
            STYLE
                OUTLINECOLOR 255    64    64
            END
            STYLE
                SYMBOL "point1"
                SIZE 1
                GAP 3
                COLOR   255    64    64
            END
        END
        CLASS
            EXPRESSION "3"
.........................................

Ces deux tables se retrouvent désormais dans une table unique d'aléas mouvements de terrain, et le nom de la table ne permet plus de distinguer le type d'aléa, et le symbolisme associé
Dans les champs on a "type_alea" pour distinguer, respectivement, les glissements des chutes de blocs, et "code_alea" pour l'intensité des phénomènes.
Mapserver permet-il, à l'heure actuelle, d'associer les valeurs des deux champs "type_alea" et "code_alea", à commencer au niveau du CLASS_ITEM ?

Jusqu'à présent, face à un cas de figure comparable, nous passions par la création d'un champ de concaténation, ici, la valeur de "type_alea" et celle de "code_alea".
Devons nous continuer à passer par ce contournement ?

Merci d'avance pour vos éclaircissements

Hors ligne

 

#2 Thu 04 July 2024 12:15

Blaise Picinbono
Participant actif
Date d'inscription: 8 Jan 2015
Messages: 70
Site web

Re: Mapserver, analyse thematique depuis plusieurs champs de table

Bonjour ;

Je ne suis pas certain d'avoir compris précisément, mais vous semblez vouloir créer des classes en fonction de la combinaisons de plusieurs champs d'une même table, est-ce bien cela ?

Vous pouvez avoir des expressions complexes dans la définition des lignes "EXPRESSION" du mapfile.
La doc est là :
https://mapserver.org/mapfile/expressions.html

Vous pourriez par exemple définir une classe en fonction de la valeur de deux champs différents de cette manière :

EXPRESSION ( ([type_alea] 42) AND ([code_alea] 4) )
(pas testé mais ça doit fonctionner)

pour définir une classe pour une valeur du champ type_area de 42 et une valeur du champ code_area de 4.

Cela répond-il à votre question ?

Hors ligne

 

#3 Fri 30 August 2024 14:49

Bertrand_D
Juste Inscrit !
Lieu: Colmar
Date d'inscription: 2 Dec 2005
Messages: 7

Re: Mapserver, analyse thematique depuis plusieurs champs de table

Bonjour à tous,

J'ai essayé la solution proposée pour faire apparaître une analyse thématique sur deux champs distincts d'une couche d'informations géographique.
En tentant ce qui suit (les deux syntaxes sont possibles)
Début du mapfile [...]
CLASS
            EXPRESSION (("lib_alea"="CB") AND ("niv_alea"="Fort"))
            NAME "Alea chute de blocs fort"
            STYLE
                OUTLINECOLOR 255    64  64
            END
            STYLE
                SYMBOL "cercle_remplissage"
                SIZE 6
                COLOR   255 64  64
            END
        END
        CLASS
            EXPRESSION (([lib_alea]="CB") AND ([niv_alea]="Faible"))
            NAME "Alea chute de blocs faible"
            STYLE
                OUTLINECOLOR 160    160 255
            END
            STYLE
                SYMBOL "cercle_remplissage"
                SIZE 6
                COLOR   160 160 255
            END
        END
[...] fin du mapfile
J'arrive à faire apparaître les éléments de légende correspondants dans la partie d'arborescence de l'intranet cartographique de ma structure... sauf que sur la fenêtre de carte à côté, ils ne s'affichent pas (dommage de ne pas pouvoir joindre de captures d'écran)

Ce que je fais depuis des années, ou que je demande de faire aux gestionnaires des couches, si des informations sont à prendre sur deux champs séparés (chose élémentaire avec MapInfo ou Qgis), est de créer un champ concaténant les valeurs des deux champs initialement séparés. Exemple ci-dessous
Début du mapfile [...]
CLASSITEM "code_them"
CLASS
            EXPRESSION "CB-Fort"
            NAME "Alea chute de blocs fort"
            STYLE
                OUTLINECOLOR 255    64    64
            END
            STYLE
                SYMBOL "cercle_remplissage"
                SIZE 6
                COLOR   255    64    64
            END
        END
CLASS
            EXPRESSION "CB-Faible"
            NAME "Alea chute de blocs faible"
            STYLE
                OUTLINECOLOR 160 160 255
            END
            STYLE
                SYMBOL "cercle_remplissage"
                SIZE 6
                COLOR   160 160 255
            END
        END
[...] fin du mapfile

Cette syntaxe fonctionne très bien, si ce n'est qu'elle représente une légère contrainte pour les producteurs des couches, qui n'ont pas besoin de ce champ supplémentaire pour une utilisation avec Qgis. Et j'imaginais que Mapserver devait être capable de gérer des analyses thématiques au moins bivariées.

Bon we à tous

Hors ligne

 

#4 Fri 30 August 2024 20:27

Blaise Picinbono
Participant actif
Date d'inscription: 8 Jan 2015
Messages: 70
Site web

Re: Mapserver, analyse thematique depuis plusieurs champs de table

Bonjour,

Si,, on peut joindre des fichiers et des images ici, du moins on pouvait, je ne trouve plus la fonctionnalité. Sinon vous mettez vos images quelque part sur internet et vous mettez le lien ici...

Hmm, je ne pratique plus les mapfiles tous les jours actuellement, mais je suis persuadé que la classification selon plusieurs champs d'une même table est possible, la doc le prouve et je l'ai déjà mis en place il y a longtemps.

Je vois deux choses qui m'interpellent dans votre essai :

- pourquoi deux blocs STYLE pour la même CLASS, l'un avec OUTLINECOLOR et l'autre avec SYMBOL, SIZE et COLOR ? Pourquoi pas tout dans le même bloc STYLE, il ya peut-être un souci là ?

- pas évident de toujours bien comprendre la doc. Je vous recommande de faire quelques recherches sur la mailing list mapserver-users, on y trouve souvent des exemples fonctionnels.
Votre première expression est celle-ci :

Code:

EXPRESSION (("lib_alea"="CB") AND ("niv_alea"="Fort"))

L'exemple que je suggérais était :

Code:

EXPRESSION ( ([type_alea] 42) AND ([code_alea] 4) )

Je ne suis pas sûr que le signe égal (smile fonctionne, je crois qu'il faut juste laisser un espace entre le nom du champ et la valeur, valeur entre guillemets si c'est une chaine de caractères, sans guillemets si c'est un nombre.

Je pense que vous n'êtes pas loin du but, je vais essayer de monter une exemple fonctionnel simple.
Quelle version de mapserver utilisez-vous ?

Hors ligne

 

#5 Mon 02 September 2024 17:02

Blaise Picinbono
Participant actif
Date d'inscription: 8 Jan 2015
Messages: 70
Site web

Re: Mapserver, analyse thematique depuis plusieurs champs de table

Voilà, j'ai remonté la démo Itasca ici :

http://regattagame.org/georezo/mapserver_demo/

Dans la liste déroulante, il faut choisir le dernier élément "-- Adds dhtmlrubber-band box". Je dois débugger les autres modes, vu qu'il y a eu de petits changements sur le mapfile depuis la version 8 de mapserver.

J'ai ajouté une nouvelle couche vecteur de polygones nommée "Aleas" avec 3 champs dans la table attributaire : id, lib_alea et niv_alea.
J'ai dessiné 4 gros carrés dont voici les données :
1 | CB | Fort
2 | CB | Failbe
3 | CA | Fort
4 | CC | Faible

Voilà la définition de la couche dans le mapfile :

Code:

 LAYER
    NAME aleas
    TYPE POLYGON
    STATUS OFF
    DATA aleas

    CLASS
      EXPRESSION ( ('[lib_alea]' eq 'CB') AND ('[niv_alea]' eq 'Fort') )
      NAME 'Aleas CB Fort'
      TEMPLATE "templates/aleas.html"
      STYLE
        COLOR 255 0 0
      END
    END

    CLASS
      EXPRESSION ( ('[lib_alea]' eq 'CB') AND ('[niv_alea]' eq 'Faible') )
      NAME 'Aleas CB Faible'
      TEMPLATE "templates/aleas.html"
      STYLE
    COLOR 0 255 0
      END
    END

    CLASS
      NAME 'Aleas Autre'
      TEMPLATE "templates/aleas.html"
      STYLE
        COLOR 0 0 255
      END
    END

    HEADER "templates/aleas_header.html"
    FOOTER "templates/aleas_footer.html"

    TOLERANCE 3

###    DUMP TRUE # allow GML export

    METADATA
      WMS_TITLE "Aleas"
      WMS_ABSTRACT "Aleas"
      WMS_SRS "EPSG:26915"
    END
  END # aleas

Donc CB + Fort = rouge, CB + Faible = vert, autres combinaisons = bleu.

Il faut bien lire cette doc :
https://mapserver.org/mapfile/class.html#class
Notammente cet exemple :

Code:

EXPRESSION ([POPULATION] > 50000 AND '[LANGUAGE]' eq 'FRENCH')

Les noms de champs doivent être entre simple quote, les valeurs lorsque ce sont des chaines de caractères, également.
Enfin, ce n'est pas le signe égal (smile qu'il faut utiliser, ni aucun signe comme je le supposais, mais l'opérateur eq (equal) pour des comparaisons entre chaines de caractères.

J'espère que cela vous permettra de simplifier votre production de données. Joyeuses EXPRESSIONs !

Hors ligne

 

Pied de page des forums

Powered by FluxBB