Страницы

Поиск по вопросам

суббота, 6 июля 2019 г.

Правила и фильтры OpenLayers (отбор по свойствам объектов)

Есть 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.

Комментариев нет:

Отправить комментарий