Страница 1 из 1

OpenLayers.Strategy.Cluster

Добавлено: 16 мар 2012, 20:19
valeria
Пытаюсь реализовать стратегию кластера. Пример с openlayers работает отлично. Когда в качестве слоя для кластерезации подставляю векторный слой wfs, кластер работает. Но проблема в том что не могу получить feature объекта. Как создать openlayers.feature.vector на слой wfs?

Re: OpenLayers.Strategy.Cluster

Добавлено: 16 мар 2012, 20:48
Denis Rykov
Не понятно, что такое feature объекта, объясните что вы хотите сделать.

Re: OpenLayers.Strategy.Cluster

Добавлено: 19 мар 2012, 12:14
valeria
Я создаю векторный слой использую стратегию кластер опенлаерс.

Код: Выделить всё

var firms_final = new OpenLayers.Layer.Vector("firms_final", {
    strategies: [
        new OpenLayers.Strategy.BBOX(),
        new OpenLayers.Strategy.Cluster({distance: 100, threshold: 3})
        
    ],
    protocol: new OpenLayers.Protocol.WFS({
        version: "1.1.0",
        url: "http://xxx.ru/geoserver/wfs",
        featureType: "xxx",
        featureNS: "http://geomap.by:8080/geoserver/web/",
        srsName: "EPSG:900913"
    }),

 styleMap: new OpenLayers.StyleMap({

                    pointRadius: "${radius}",
                    fillColor: "#ffcc66",
                    fillOpacity: 0.1,
                    label:"${label}",
                    fontSize:10,
                    strokeColor: "#cc6633",
                    strokeWidth: "${width}",
                    strokeOpacity: 0.8
                }, {
                    context: {
                         label: function(feature) {
                            return ((firms_final.feature).attributes.count) ;
                        },
                        width: function(feature) {
                            return ((firms_final.feature).cluster) ? 2 : 1;
                        },
                        radius: function(feature) {
                            var pix = 2;
                            if((firms_final.feature).cluster) {
                                pix = Math.min((firms_final.feature).attributes.count, 7) + 2;
                            }
                            return pix;
                        }
                    }



                })});


не могу получить значения объекта feature , хотя кластер сам работает отлично.

Re: OpenLayers.Strategy.Cluster

Добавлено: 19 мар 2012, 13:20
Denis Rykov
А зачем вы пишите:

Код: Выделить всё

return ((firms_final.feature).attributes.count)
нужно же так:

Код: Выделить всё

return (feature.attributes.count)
?

Re: OpenLayers.Strategy.Cluster

Добавлено: 19 мар 2012, 14:56
valeria
Ну просто я много разных вариантов пробовала , поставила так

Код: Выделить всё

return (feature.attributes.count)
всё равно undefined.

Re: OpenLayers.Strategy.Cluster

Добавлено: 20 мар 2012, 06:41
Denis Rykov
Много разных вариантов - это конечно хорошо, но лучше читать документацию и делать сразу правильно. Ваш пример не работает, потому что у объекта StyleMap нет свойства context, а есть оно у объекта Style. Вот вам полностью работоспособный пример, который я протестировал на своих данных:

Код: Выделить всё


vector = new OpenLayers.Layer.Vector("vector", {
strategies: [
new OpenLayers.Strategy.BBOX(),
new OpenLayers.Strategy.Cluster({distance: 100, threshold: 3})
],
protocol: new OpenLayers.Protocol.WFS({
url: "***",
featureType: "church18",
featureNS: "http://nextgis.org/sf",
geometryName: "wkb_geometry",
projection: new OpenLayers.Projection("EPSG:4326")
}),
styleMap: new OpenLayers.StyleMap(
{
"default": new OpenLayers.Style({
pointRadius: 20,
fillColor: "#ffcc66",
fillOpacity: 0.1,
label:"${label}",
fontSize:10,
strokeColor: "#cc6633",
strokeWidth: "${width}",
strokeOpacity: 0.8
}, {
context: {
label: function(feature) {
var name = feature.attributes.name;
return name ? name: "This is CLUSTER!";
},
width: function(feature) {
return feature.cluster ? 2 : 1;
}
}
})
})
});

name - имя атрибута в моём слое, замените на имя поля, присутствующее в ваших данных. Вот пример результата:

Re: OpenLayers.Strategy.Cluster

Добавлено: 22 мар 2012, 14:38
valeria
Спасибо большое теперь буду более внимательно читать документацию!

Re: OpenLayers.Strategy.Cluster

Добавлено: 22 мар 2012, 20:17
Denis Rykov
У Вас заработало?

[Сообщение с мобильного устройства] Изображение

Re: OpenLayers.Strategy.Cluster

Добавлено: 05 апр 2012, 13:25
valeria
Да получилось. Привожу код :

Код: Выделить всё


    firms_layer = new OpenLayers.Layer.Vector("firms_final", {
    strategies:  [
        new OpenLayers.Strategy.BBOX(),
        new OpenLayers.Strategy.Cluster({distance: 20, threshold: 2})
        
    ],
    protocol: new OpenLayers.Protocol.WFS({
        version: "1.1.0",
        url: "http://infomap.by/geoserver/wfs",
        featureType: "final_firms_2",
        featureNS: "http://geomap.by:8080/geoserver/web/",
        srsName: "EPSG:900913",
       defaultFilter: filt
    }),

    styleMap: new OpenLayers.StyleMap({      
         "default": mystyle
    })
    });
var mystyle = new OpenLayers.Style({
             pointRadius: 15,
                     externalGraphic: "${externalGraphic}",
                    label:"${label}",
                    fontSize:10,
                    strokeColor: "#cc6633",
                    strokeWidth: "${widths}",
                    strokeOpacity: 0.8
                }, {
                    context: {
                         label: function(feature) {
                            var ret=(feature).attributes.count;
                            return ret ? ret: ""; ;
                        },


                    externalGraphic: function(feature) {
                            var ret1=(feature).attributes.count;
                            if (ret1==null) {return "index.jpg"}
                            else {return "cluster.png"}
                        },

                        width: function(feature) {
                            return ((feature).cluster) ? 2 : 1;
                        },
                        radius: function(feature) {
                            var pix = 2;
                            if((feature).cluster) {
                                pix = Math.min((feature).attributes.count, 7) + 2;
                            }
                            return pix;
                        }

                    }
                    });