Клуб API Карт

Кластеризация, XML

Пост в архиве.

Помогите разобраться с тем, как собрать метки в кластеры при выводе из файла XML

Если выводим элементы из базы данных в карту обычным методом (не XML), то метки в кластеры собираются без проблем http://glebe.la/

Вывод тех же элементов из предварительно сгенерированного файла XML тоже не вызывает затруднений http://glebe.la/solo/

Но, при попытке собрать их в кластеры выводится просто пустая карта http://glebe.la/solo/xmlplusclasster.html

Прежде, чем написать изучил темы здесь, по рекомендациям в одной из них http://clubs.ya.ru/mapsapi/replies.xml?item_no=34514 набран этот код:

<!DOCTYPE html>
<html>
<head>
<title>XML</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://api-maps.yandex.ru/2.0.21/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>

<script type="text/javascript">
ymaps.ready(init);

function init() {
var myMap = new ymaps.Map('map', {
center: [55.76, 37.64],
zoom: 2
}),
ymapsmlButton = $('.load-ymapsml');
ymapsmlButton.get(0).disabled = false;
myMap.controls.add('smallZoomControl');

clusterer = new ymaps.Clusterer();
clusterer.options.set({
gridSize: 100,
disableClickZoom: true,
minClusterSize:2,
synchAdd:true
});

var result = [];
url = "http://maps.yandex.ru/export/usermaps/93jfWjoXws37exPmKH-OFIuj3IQduHal/";
ymaps.geoXml.load(url)
.then(function (res) {
res.geoObjects.each(function (geoObject) {
result.push(geoObject);
});
});
clusterer.add(result);
myMap.geoObjects.add(clusterer);
}
</script>
</head>
<body>
<div id="map" style="width:600px; height:400px"></div>
<input type="button" value="YMapsML" class="load-ymapsml" />
</body>
</html>

 

10 комментариев

Обратите внимание на момент

 

ymaps.geoXml.load(url)
.then(function (res) {
res.geoObjects.each(function (geoObject) {
result.push(geoObject);
});
});
clusterer.add(result);
myMap.geoObjects.add(clusterer);

Так как загрузка файла происходит асинхронно - вы в начале добавляете на карту "ничего" а потом что-то загружаете.

 

Перенесите момент добавления точек в кластер поближе к сборку results. Те на одну строчку наверх

Владимир Б.
28 января 2016, 02:35
Спасибо. 
Еще хотелось бы понять, как задавать ссылки слева в балуне кластера?
Я пробовал в самом файле xml прописывать clusterCaption, но не получилось.
Решил, что это возможно сделать в коде в том месте, где я поставил комментарий.
Это возможно?

ymaps.geoXml.load(url)
.then(function (res) {
res.geoObjects.each(function (geoObject) {
//тут я хотел бы добавить объекту clusterCaption
result.push(geoObject);
});
clusterer.add(result);
});
myMap.geoObjects.add(clusterer);

можно положить в это поле значение другого поля, например:

geoObject.properties.set('clusterCaption', geoObject.properties.get('name'));

Владимир Б.
28 января 2016, 02:35

спасибо! так работает

Владимир Б.
28 января 2016, 02:35

заголовок сейчас в балуне выводится в h3. Как сделать свой шаблон описано тут http://ymapsapi.ya.ru/replies.xml?item_no=1091, но очень много непонятного кода.

Задача - выводить заголовок не в h3, а в , может быть есть простое решение этой задачи?

в балунах метки это реализовано через шаблоны в xml, а вот балуны кластеров сложнее.

Кстати посмотреть в действии можно тут http://dril.eu/solo/

При клике на заголовок открывается подробное описание слева

Владимир Б.
28 января 2016, 02:35

Вопрос о том, как получить мета данные из xml

как получить мета данные, которые записаны в xml внутри AnyMetaData по аналогии с geoObject.properties.get('name') ?

может для мета вместо properties нужно что-то другое?

 

ymaps.geoXml.load(url)
.then(function (res) {
res.geoObjects.each(function (geoObject) {
//geoObject.properties.get('name')

result.push(geoObject);
});
clusterer.add(result);
});
myMap.geoObjects.add(clusterer);

console.log(geoObject.properties.getAll())

Владимир Б.
28 января 2016, 02:35

спасибо. теперь буду пользоваться консолью.

из полученой информации смог сконструировать только это

geoObject.properties.metaDataProperty.AnyMetaData.get(stat);

и это

geoObject.properties.get(metaDataProperty.AnyMetaData.stat);

но не работает ни один вариант

может подскажете как надо сделать или где прочитать на понятном языке?

//понял, кавычки нужны были

geoObject.properties.get('metaDataProperty.AnyMetaData.stat');

В поле properties у всех геообъектов лежит менеджер данных