0

我正在使用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( ??? ); 
4

3 回答 3

1

我不认为这是可能的。我也不认为这在标准的 OpenLayers 和标准的 AnimatedCluster 中是不可能的。

你最好的猜测是首先去https://github.com/acanimal/AnimatedCluster并在那里询问你想要什么是可能的(在标准的 openlayers 中)。

如果他们说有可能,并说如何回到这里,我可以进一步研究。如果他们说在标准 openlayers 中也不可能,那么在 gwt openlayers 中也不可能。

于 2014-02-10T13:15:39.547 回答
1

我增强了 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 属性值的总和。

我相信这可以解决您的问题?

于 2014-02-11T10:13:27.570 回答
0

在我将策略分配给 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;
}-*/;
于 2014-02-11T11:34:23.593 回答