Substitution à la volée

Author:Steve Lime
Contact:steve.lime at DNR.STATE.MN.US
Last Updated:2017-04-30

Introduction

La substitution à la volée pour le MapServer CGI a été mise en place depuis la version 4.0 et son utilisation a continué à se développer. En bref, elle vous permet de modifier des parties d’un mapfile basée sur les données transmises via une requête CGI. Cette fonctionnalité est uniquement disponible via l’application standard CGI.

Avertissement

Cette fonctionnalité est seulement disponible via l’application CGI mapserv. A l’aide de MapScript, il est facile de le faire par soi-même comme le développeur a un contrôle total sur la manière dont l’entrée est gérée.

Sensible à la casse

Depuis la version 6.4, les noms des paramètres CGI sont insensibles à la casse. Les valeurs des paramètres CGI sont eux sensibles à la casse.

Exemple basique

Disons que vous souhaitez que l’utilisateur définisse dynamiquement une partie d’une expression pour qu’ils puissent mettre en évidence une certaine classe d’occupation des sols, et vous avez un formulaire (appelé ctype) qui leur permettent de choisir entre : forêts, eau, zones humides et développées. Vous pouvez ensuite

Une requête doit ressembler à ceci (en supposant que “marsh” est une classe valide pour land cover)

http://...mapserv?map=....&ctype=marsh

Vous pouvez alors configurer une couche de cette manière :

LAYER
    NAME 'covertypes'
    ...
    VALIDATION
        "ctype" "[a-z]+"
    END
    CLASSITEM 'type'
    CLASS # highlighted presentation
        EXPRESSION '%ctype%'
        ...
    END
    CLASS # default presentation
        ...
    END
END

Quand une requête est traitée la valeur pour ctype est remplacé par la chaîne %Ctype% et le mapfile est traitée comme d’habitude. Si aucun ctype n’est passé dans EXPRESSION celle-ci ne sera jamais vraie par conséquent cela ne posera pas de problème sauf une petite baisse de performance. Souvent, vous devrez définir une classe par défaut pour dessiner les géométries qui ne correspondent pas, mais ce n’est pas obligatoire.

Paramètres gérés

Tous les paramètres du mapfile ne sont pas gérés pour la substitution à la volée et une attention a été portée pour essayer de gérer ceux qui font le plus de sens. N’oubliez pas que vous pouvez aussi configurer à la volée en utilisant la syntaxe du type map_object_property détaillée dans Modifier les paramètres du fichier map à l’aide d’un formulaire ou d’une URL. Voici une liste des propriétés dont la substitution à la volée est permise :

  • CLASS: EXPRESSION

  • CLASS: TEXT

  • LAYER: CONNECTION

  • LAYER: DATA

  • LAYER: FILTER

  • LAYER: TILEINDEX

  • LAYER: METADATA

    Nouveau dans la version 7.0.

  • LAYER: PROCESSING

    Nouveau dans la version 7.0.

  • OUTPUTFORMAT: FORMATOPTION: FILENAME (must have a MAP VALIDATION pattern)

    Nouveau dans la version 6.2.

  • OUTPUTFORMAT: all FORMATOPTIONs

    Nouveau dans la version 7.0.

  • MAP->WEB: METADATA (values only, not keys)

    Nouveau dans la version 7.0.

FILTER

Vous pouvez utiliser des substitutions à la volée pour modifier des valeurs dans un FILTER. Par exemple, votre objet FILTER peut être écrit comme ceci:

FILTER (multimedia='%multimedia%' and seats >= '%nseats%' and Sound= '%sound%')

Puis (en supposant que vous utilisez l’interface CGI), vous pourrez passer des variables nommées multimedia, nseats et le sound avec des valeurs définies par l’utilisateur dans un formulaire HTML.

You should also define VALIDATION expressions on these variables to guard against unintentional SQL being submitted to postgis (since version 6.0, validation is mandatory). Within the layer you’d do the following:

VALIDATION
    'multimedia' '^yes|no$'
    'sound' '^yes|no$'
    'nseats' '^[0-9]{1,2}$'
END

Les chaînes de validation sont des expressions régulières qui sont appliquées sur les valeurs de la variable appropriée avant d’être ajoutée au filtre. Les deux premiers limitent la valeur de multimedia et de sounds à oui ou non. La troisième limite la valeur pour nseats à un nombre entier à 2 chiffres.

Valeurs par défaut si non fournies dans l’URL

Le mécanisme de substitution à la volée créera toujours des mapfiles incorrect au niveau de la syntaxe et presque toujours au niveau sématique si le paramètre de substitution n’a pas été fournie dans l’url.

Depuis la version 5.6, vous pouvez fournir une valeur par défaut pour n’importe quel paramètre de substitution qui sera appliqué si le paramètre n’était pas trouvé dans l’URL. Vous pouvez réaliser cela en fournissant des entrées spéciales dans les blocs de validation de CLASS, LAYER ou WEB :

VALIDATION
    'default_sound' 'yes'
    'default_nseats' '5'
    'default_multimedia' 'yes'
END

Dans cet exemple, le mapfile sera créé comme si l’url contenait “&sound=yes&nseats=5&multimedia=yes”.

Providing a default value for a substitution parameter in the WEB section of the MAP wasn’t implemented until version 7.0.7.

Si des clés par défaut identiques apparaissent dans plus d’un bloc de validation, alors les clés dans les blocs plus spécialisés surchargeront ceux qui sont dans les blocs plus généralistes c’est à dire que CLASS aura priorité sur LAYER qui aura lui-même priorité sur WEB. La même fonctionnalité est disponible en utilisant les blocs METADATA à la place de VALIDATION mais c’est déprécié avec MapServer 5.4.0. Ce comportement est également accessible dans l’utilitaire shp2img, vous permettant de tester les mapfiles avec substitution à la volée sans l’aide d’un serveur web.

VALIDATION

Comme la substitution à la volée affecte potentiellement des zones sensibles de votre mapfile, comme les colonnes et les noms de base de données, il est obligatoire d’utiliser une validation par pattern (depuis la version 6.0)

La validation par pattern utilise les expressions régulières, qui sont des chaînes qui décrivent comment comparer des chaînes de caractères avec des patterns. La même fonctionnalité d’expressions régulières de votre système est susceptible de varier, mais vous pouvez trouver un grand nombre d’informations génrales en effectuant une recherche Google avec “tutoriel expressions régulières”.

As of MapServer 5.4.0 the preferred mechanism is a VALIDATION block in the LAYER definition. This is only slightly different from the older METADATA mechanism. VALIDATION blocks can be used with CLASS, LAYER and WEB.

VALIDATION
  # %firstname% substitutions can only have letters and hyphens
  'firstname'     '^[a-zA-Z\-]+$'

  # %parcelid% must be numeric and between 5 and 8 characters
  'parcelid'      '^[0-9]{5,8}$'

  # %taxid% must be two capital letters and six digits
  'taxid'         '^[A-Z]{2}[0-9]{6}$'
END

Si des clés identiques apparaissent dans plus d’un bloc de validation, alors les clés dans les blocs plus spécialisés surchargeront ceux qui sont dans les blocs plus généralistes, c’est à dire que CLASS aura priorité sur LAYER qui aura lui-même priorité sur WEB.

Valeurs magiques

Certaines substitutions à la volée ont des avertissements spéciaux.

ID

En plus de la définition de n’importe quel METADATA ou VALIDATION, le paramètre ‘id’ sera sujet à une vérification spéciale. Il doit être alphanumérique et ne peut pas dépasser en longueur 63 caractères.