GWT OpenLayers устанавливает сумму значений базовых VectorFeatures в точке кластера
Я использую gwt-openlayers-1.0
, в настоящее время изучает этот пример (стратегия анимированных кластеров).
В моем проекте каждый VectoreFeature
имеет числовую метку, и я хочу отображать суммы значений меток базовых точек в каждой точке кластера. Есть способ сделать это?
UPD:
Согласно этой статье (часть "Самая важная" стратегия) в JS это будет выглядеть так:
// for each feature:
feature.attributes = { result_count: 10 };
...
var style = new OpenLayers.Style({
...
} , context: {
label: function(feature) {
if (feature.cluster) {
var result_count = 0;
for (var i = 0; i < feature.cluster.length; i++) {
result_count += feature.cluster[i].attributes.result_count;
}
features.attributes.label = result_count.toString();
} else {
features.attributes.label = features.attributes.result_count.toString();
}
}
}
Но я не могу найти способ реализовать это в gwt-openlayers:
org.gwtopenmaps.openlayers.client.Style style = new org.gwtopenmaps.openlayers.client.Style();
style.setLabel( ??? );
3 ответа
В методе, где я назначаю стратегию для VectorLayer:
{
org.gwtopenmaps.openlayers.client.Style style = new org.gwtopenmaps.openlayers.client.Style();
style.setJSObject(getOpenLayersStyle());
}
И где волшебство сделано:
private native JSObject getOpenLayersStyle() /*-{
var style = new $wnd.OpenLayers.Style({
fontColor: "#FFFFFF",
fontSize: "12px",
label: "${countLabel}"
}, { context: {
countLabel: function(feature) {
var countLabel;
if (feature.cluster) {
var result_count = 0;
for (var i = 0; i < feature.cluster.length; i++) {
result_count += feature.cluster[i].attributes.result_count;
}
countLabel = result_count.toString();
} else {
countLabel = feature.attributes.result_count.toString();
}
feature.attributes.label = countLabel;
return countLabel;
}
}
});
return style;
}-*/;
Я не думаю, что это возможно. Я также не думаю, что это возможно в стандартных OpenLayers со стандартным AnimatedCluster.
Лучше всего сначала зайти на https://github.com/acanimal/AnimatedCluster и спросить там, возможно ли то, что вы хотите (в стандартных openlayers).
Если они говорят, что это возможно, и говорят, как вернуться сюда, и я могу посмотреть дальше. Если они говорят, что это также невозможно в стандартных openlayers, то это также невозможно в gwt openlayers.
Я улучшил пример Animated Cluster With Popup, чтобы сделать то, что вы просите. Потребуется некоторое время, прежде чем это онлайн, хотя.
Изменения, которые я сделал:
Сначала я добавил атрибут для каждого объекта, добавленного на карту. Эта функция представляет собой случайное число, которое мы хотим отобразить суммой при нажатии на кластерную функцию:
for (int i = 0; i < points.size(); i++)
{
features[i] = new VectorFeature(points.get(i));
Attributes attributes = new Attributes();
attributes.setAttribute("examplenumber", Random.nextInt(10));
features[i].setAttributes(attributes);
}
Второе изменение в публичном void onFeatureSelected(FeatureSelectedEvent eventObject)
int totalNumber = 0;
VectorFeature[] clusters = eventObject.getVectorFeature().getCluster();
for (int i = 0; i < clusters.length; i++)
{
GWT.log("examplenumber = " + clusters[i].getAttributes().getAttributeAsInt("examplenumber"));
totalNumber += clusters[i].getAttributes().getAttributeAsInt("examplenumber");
}
Теперь totalnumber содержит сумму всех значений атрибута examplenumber.
Я считаю, что это решает вашу проблему?