CLUSTER

Description

Depuis la version 6.0, Mapserver a la capcité de combiner plusieurs objets d’une couche ponctuelle en un seul (par aggrégation) à partir de leurs positions relatives. Seules les couches POINT sont supportées. Cette fonctionnalité a été ajoutée via la MS RFC 69: Support for clustering of features in point layers.

Types de couches supportés

Only layers of TYPE POINT are supported.

Paramètres du Mapfile

MAXDISTANCE [double]

Spécifier la distance de la région de recherche (rectangle ou ellipse) par la position en pixel

REGION [string]

Définit la région de recherche autour d’un objet dans lequel les objets de voisins sont négociés. Cela peut être un ‘rectangle’ ou une ‘ellipse’.

BUFFER [double]

Définit une région tampon autour de l’étendue de la carte en pixels. La valeur par défaut est 0. Utiliser un tampon permet que les formes avoisinantes de la carte soit aussi prises en compte pendant la création du cluster.

GROUP [string]
This expression evaluates to a string and only the features that have the same group value are negotiated. This parameter can be omitted. The evaluated group value is available in the ‘Cluster_Group’ feature attribute.
FILTER [string]
We can define the FILTER expression filter some of the features from the final output. This expression evaluates to a boolean value and if this value is false the corresponding shape is filtered out. This expression is evaluated after the the feature negotiation is completed, therefore the ‘Cluster_FeatureCount’ parameter can also be used, which provides the option to filter the shapes having too many or to few neighbors within the search region.

Options de traitements supportées

Les options de traitement suivantes peuvent être utilisées avec les couches cluster:

CLUSTER_GET_ALL_SHAPES=ON
Return all shapes contained by a cluster instead of a single shape. This setting affects both the drawing and the query processing (especially useful for GetFeatureInfo requests). Example usage: PROCESSING “CLUSTER_GET_ALL_SHAPES=ON”
CLUSTER_KEEP_LOCATIONS=ON
Set whether the location of the cluster shape should be preserved (setting this will show all points in the cluster). Example usage: PROCESSING “CLUSTER_KEEP_LOCATIONS=ON”
CLUSTER_USE_MAP_UNITS=ON
Provide scale independent clustering (maxdistance and the buffer parameters are specified in map units). Example usage: PROCESSING “CLUSTER_USE_MAP_UNITS=ON”
ITEMS
Specify the feature attributes in the cluster to expose during a query, separated by a comma. Example usage: PROCESSING “ITEMS=attribute_x,attribute_y,attribute_z”

Extrait de mapfile

LAYER
  NAME "my-cluster"
  TYPE POINT
  ...
  CLUSTER
     MAXDISTANCE 20  # in pixels
     REGION "ellipse"  # can be rectangle or ellipse
     GROUP (expression)  # an expression to create separate groups for each value
     FILTER (expression) # a logical expression to specify the grouping condition
  END
  LABELITEM "Cluster_FeatureCount"
  CLASS
    ...
    LABEL
     ...
    END
  END
  ...
END

Attributs des entités

La couche regroupée elle-même fournies les attributs agrégés suivants :

  1. Cluster_FeatureCount - count of the features in the clustered shape
  2. Cluster_Group - The group value of the cluster (to which the group expression is evaluated)

Note

If you are using MapServer version 6.x these attributes contain a ”:” in their names instead, such as Cluster:FeatureCount & Cluster:Group. The “_” was changed in MapServer 7.

Ces attributs (en plus de ceux forunis par la source de données originale) peuvent être utilisés pour configurer les étiquettes des objets et peuvent également être utilisés dans les expressions. L’option de traitement ITEMS peut être utilisée pour spécifier une sous-ensemble des attributs de la couche originale dans les opérations d’interrogation en fonction de la préférence utilisateur.

We can use simple aggregate functions (Min, Max, Sum, Count) to specify how the clustered attribute should be calculated from the original attributes. The aggregate function should be specified as a prefix separated by ‘:’ in the attribute definition, like: [Max:itemname]. If we don’t specify aggregate functions for the source layer attributes, then the actual value of the cluster attribute will be non-deterministic if the cluster contains multiple shapes with different values. The Count aggregate function in fact provides the same value as Cluster_FeatureCount.

Handling GetFeatureInfo

If you want to allow WMS GetFeatureInfo on all features inside a cluster, you must 1) set the “wms_include_items” metadata as usual, and 2) set the following PROCESSING parameters in the layer:

PROCESSING "CLUSTER_GET_ALL_SHAPES=ON"
PROCESSING "ITEMS=attribute_x,attribute_y,attribute_z"

So your layer might look like the following:

LAYER
  NAME "my-cluster"
  TYPE POINT
  METADATA
    "wms_title"    "myttitle"
    "wms_include_items" "all"
  END
  ...
  CLUSTER
     ...
  END
  LABELITEM "Cluster_FeatureCount"
  CLASS
    ...
    LABEL
     ...
    END
  END
  ...
  PROCESSING "CLUSTER_GET_ALL_SHAPES=ON"
  PROCESSING "ITEMS=name,description"
END

Usage avec PHP MapScript

L’objet CLUSTER est exposé via PHP MapScript. Un exemple suit:

$map = ms_newMapobj("/var/www/vhosts/mysite/httpdocs/test.map");
$layer1=$map->getLayerByName("test1");
$layer1->cluster;

Exemple: regroupement des gares

L’exemple suivant utilise une source ponctuelle, dans ce cas en format KML, pour afficher les regroupements de gares. Deux classes sont utilisées: une pour styler et étiqueter le regroupement, l’autre pour styler et étiqueter la gare simple.

Note

Comme nous ne pouvons pas utiliser 2 “labelitems”, pour la classe gare simple, nous utilisons le paramètre TEXT pour étiqueter la gare.

Couche de Mapfile

####################
# Lightrail Stations
####################
SYMBOL
  NAME "lightrail"
  TYPE PIXMAP
  IMAGE "../etc/lightrail.png"
END
LAYER
    NAME "lightrail"
    GROUP "default"
    STATUS DEFAULT
    TYPE POINT
    CONNECTIONTYPE OGR
    CONNECTION "lightrail-stations.kml"
    DATA "lightrail-stations"
    LABELITEM "Cluster_FeatureCount"
    CLASSITEM "Cluster_FeatureCount"
    ###########################
    # Define the cluster object
    ###########################
    CLUSTER
      MAXDISTANCE 50
      REGION "ellipse"
    END
    ################################
    # Class1: For the cluster symbol
    ################################
    CLASS
      NAME "Clustered Lightrail Stations"
      EXPRESSION ("[Cluster_FeatureCount]" != "1")
      STYLE
        SIZE 30
        SYMBOL "citycircle"
        COLOR 255 0 0
      END
      LABEL
        FONT scb
        TYPE TRUETYPE
        SIZE 8
        COLOR 255 255 255
        ALIGN CENTER
        PRIORITY 10
        BUFFER 1
        PARTIALS TRUE
        POSITION cc
      END
    END
    ################################
    # Class2: For the single station
    ################################
    CLASS
      NAME "Lightrail Stations"
      EXPRESSION "1"
      STYLE
        SIZE 30
        SYMBOL "lightrail"
      END
      TEXT "[Name]"
      LABEL
        FONT scb
        TYPE TRUETYPE
        SIZE 8
        COLOR 0 0 0
        OUTLINECOLOR 255 255 255
        ALIGN CENTER
        PRIORITY 9
        BUFFER 1
        PARTIALS FALSE
        POSITION ur
      END
    END
    # the following is used for a query
    TOLERANCE 50
    UNITS PIXELS
    HEADER "../htdocs/templates/cluster_header.html"
    FOOTER "../htdocs/templates/cluster_footer.html"
    TEMPLATE "../htdocs/templates/cluster_query.html"
END

Image de carte

../_images/cluster.png