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, последнюю я пытался найти в исходниках, но так и не нашёл никакого упоминания:)
