1. Если кластеризация нужна только для визуализации данных, то можно взять за основу пример из документации - никаких проблем возникнуть не должно, пример того, что получилось - во вложении.
2. Если помимо отображения данных необходима поддержка запросов GetFeatureInfo - то тут нужны некоторые приседания. Посылаем запрос к кластеру, допустим, в формате "application/vnd.ogc.gml", при этом добавив в секцию METADATA map-файла тег gml_include_items "all" как описано здесь. В результате получаем довольно странный ответ от сервера:
Код: Выделить всё
<?xml version="1.0" encoding="ISO-8859-1"?>
<msGMLOutput
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<herbary_layer>
<herbary_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:900913">
<gml:coordinates>11695979.680968,11929262.599170 11695979.680968,11929262.599170</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<Cluster:FeatureCount>7</Cluster:FeatureCount>
<Cluster:Group></Cluster:Group>
</herbary_feature>
</herbary_layer>
</msGMLOutput>
то есть возвращается информация не о всех объектах кластера, а о самом кластере. Немножко погуглив, находим тикет #3873, который говорит о том, что для того, чтобы получить информацию обо всех объектах, необходимо указать ключ CLUSTER_GET_ALL_SHAPES. Но данная возможность доступна только в svn версии, а в последнем на текущий момент релизе (6.1) её нет. Ок, ставим MapServer из SVN и добавляем необходимый ключ внутрь объекта LAYER:
Код: Выделить всё
PROCESSING "CLUSTER_GET_ALL_SHAPES=True"
Код: Выделить всё
<?xml version="1.0" encoding="ISO-8859-1"?>
<msGMLOutput
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<herbary_layer>
<herbary_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:900913">
<gml:coordinates>11695979.680968,11929262.599170 11695979.680968,11929262.599170</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<Cluster:FeatureCount></Cluster:FeatureCount>
<Cluster:Group></Cluster:Group>
</herbary_feature>
<herbary_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:900913">
<gml:coordinates>11695979.680968,11929262.599170 11695979.680968,11929262.599170</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<Cluster:FeatureCount></Cluster:FeatureCount>
<Cluster:Group></Cluster:Group>
</herbary_feature>
<herbary_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:900913">
<gml:coordinates>11695979.680968,11929262.599170 11695979.680968,11929262.599170</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<Cluster:FeatureCount></Cluster:FeatureCount>
<Cluster:Group></Cluster:Group>
</herbary_feature>
<herbary_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:900913">
<gml:coordinates>11695979.680968,11929262.599170 11695979.680968,11929262.599170</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<Cluster:FeatureCount></Cluster:FeatureCount>
<Cluster:Group></Cluster:Group>
</herbary_feature>
<herbary_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:900913">
<gml:coordinates>11695979.680968,11929262.599170 11695979.680968,11929262.599170</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<Cluster:FeatureCount></Cluster:FeatureCount>
<Cluster:Group></Cluster:Group>
</herbary_feature>
<herbary_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:900913">
<gml:coordinates>11695979.680968,11929262.599170 11695979.680968,11929262.599170</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<Cluster:FeatureCount></Cluster:FeatureCount>
<Cluster:Group></Cluster:Group>
</herbary_feature>
<herbary_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:900913">
<gml:coordinates>11695979.680968,11929262.599170 11695979.680968,11929262.599170</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<Cluster:FeatureCount>7</Cluster:FeatureCount>
<Cluster:Group></Cluster:Group>
</herbary_feature>
</herbary_layer>
</msGMLOutput>
Но где же атрибутика? Опять же немного погуглив, высняется, что для того, чтобы определить список возвращаемых атрибутивных полей - их необходимо определить в директиве ITEMS слоя:
Код: Выделить всё
PROCESSING "ITEMS=Herbarium,NNPage_"
Код: Выделить всё
wms_include_items "all"
Код: Выделить всё
<?xml version="1.0" encoding="ISO-8859-1"?>
<msGMLOutput
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<herbary_layer>
<herbary_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:900913">
<gml:coordinates>11693488.739881,11930811.873711 11693488.739881,11930811.873711</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<Herbarium>EP</Herbarium>
<NNPage_>10-243</NNPage_>
<Cluster:FeatureCount></Cluster:FeatureCount>
</herbary_feature>
<herbary_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:900913">
<gml:coordinates>11693488.739881,11930811.873711 11693488.739881,11930811.873711</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<Herbarium>EP</Herbarium>
<NNPage_></NNPage_>
<Cluster:FeatureCount>2</Cluster:FeatureCount>
</herbary_feature>
</herbary_layer>
</msGMLOutput>
Однако видим, что внутри GML затесался левый тег <Cluster:FeatureCount>, который делает GML-документ невалидным и его становится сложно использовать в сторонних приложениях, например в OpenLayers. Чтобы убрать его отредактируем директиву wms_include_items, она должна выглядеть так:
Код: Выделить всё
wms_include_items "Herbarium,NNPage_"
Теперь пара моментов, с которыми пока не понятно как бороться:
1. В ответе сервера на запрос GetFeatureInfo - последнее поле последнего объекта в кластере всегда пустое.
2. При использовании map-файла как в примере при добавлении PROCESSING "CLUSTER_GET_ALL_SHAPES=True" - непонятно куда исчезают подписи кластеров.
3*. Может кто-нибудь поможет разобраться. Открываем changeset и видим что в документацию помимо описания опции CLUSTER_GET_ALL_SHAPES добавлено еще описание некоторой опции CLUSTER_GET_ALL_SHAPES_ON_QUERY, последнюю я пытался найти в исходниках, но так и не нашёл никакого упоминания:)