Есть GeoJSON вида:
{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-108.04,44.68]},"properties":{"course":184.7,"vid":1}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-111.04,45.68]},"properties":{"course":44.1,"vid":2}}]}
Являющийся источником слоя vectors (см. "Как послать JSON в теле HTTP-ответа?").
Нужен фильтр показывающий только точки с vid входящим массив, вида:
var pointShow = [1,3];
Вроде бы для этого нужно использовать правила (Rule), но я с OpenLayers не особо знаком, да и в интернете найти что-то по теме кроме описания FeatureId на сайте "OpenLayers" не получилось.
Пробовал сделать так:
var myStyle = new OpenLayers.Style();
var defRule = new OpenLayers.Rule({
filter: new OpenLayers.Filter.FeatureId({fids: ["2242"]}),
symbolizer: {
externalGraphic: "OpenLayersRotationExample_files/marker-red.png",
graphicWidth: 21,
graphicHeight: 25,
graphicXOffset: -10,
graphicYOffset: -12
}
});
myStyle.addRules([defRule]);
...
vectors = new OpenLayers.Layer.Vector(
"Simple Geometry",
{
protocol: new OpenLayers.Protocol.Script({
url: "http://localhost:8181/view",
callbackKey: "format_options",
callbackPrefix: "callback:",
filterToParams: function(filter, params) {
if (filter.type === OpenLayers.Filter.Spatial.BBOX) {
params.bbox = filter.value.toArray();
if (filter.projection) {
params.bbox.push(filter.projection.getCode());
}
}
return params;
}
}),
strategies: [
new OpenLayers.Strategy.Refresh({force: true, interval:10000}),
new OpenLayers.Strategy.BBOX({resFactor:2})
],
styleMap: new OpenLayers.StyleMap({
"default": myStyle
})
}
);
Но в итоге я ничего не вижу.
В связи с этим вопрос - как правильно писать правила и фильтры OpenLayers?
Буду признателен за полезные ссылки на примеры и примеры использования разных фиьтров, в частности FeatureId (желательно более понятных чем тут "Filtering a WFS Layer").
PS: Пока решил так:
var myStyle = new OpenLayers.Style();
var defRule = new OpenLayers.Rule({
symbolizer: {
externalGraphic: "OpenLayersRotationExample_files/marker.png",
graphicWidth: 14,
graphicHeight: 17,
graphicXOffset: -7,
graphicYOffset: -8,
graphicOpacity: 0.9,
rotation: "${course}",
display: "none"
}
});
myStyle.addRules([defRule]);
for (keyVar in arr) {
myStyle.addRules([
new OpenLayers.Rule({
filters: [new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "vid",
value: arr[keyVar]
}),
symbolizer: {
externalGraphic: "OpenLayersRotationExample_files/marker-red.png",
display: ""
}
})
])
}
//arr - список id объектов которые нужно показать
//vid, course - поля свойств объектов (properties)
Возможно не очень красиво и медленно, но работает. Кто знает как разобраться с FeatureId, прошу подскажите - все таки, я думаю, он быстрее отработает чем куча фильтров.
Ответ
У вас JSON не полный. У каждой feature должен быть некоторый "id", по которому фильтровать фильтром FeatureId.
Комментариев нет:
Отправить комментарий