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.

Я считаю, что это решает вашу проблему?

Другие вопросы по тегам