código" /> código" />
Mais

OpenLayers: Combine vários filtros OGC

OpenLayers: Combine vários filtros OGC


Eu tenho dois OGC filtra o lado do cliente:

  código segredo   geom  1298543.0367787,7107400.531374 1299312.4070614,7203464.9016567

Eu tenho os dois filtros representados como strings e quero combiná-los em um filtro. Eu posso ver na documentação que o OpenLayers pode criar um Objeto de Filtro de uma corda, mas não parece funcionar para mim.

Estou fazendo algo errado e / ou como devo fazer?


Para ler um filtro de uma string deve ser algo como:

var my_filter_xml, parser, xml; analisador = novo OpenLayers.Format.Filter.v1_1_0 (); xml = new OpenLayers.Format.XML (); my_filter_xml = 'códigosegredo'; // sua string de filtro var x = xml.read (my_filter_xml) .documentElement var filter1 = parser.read (x); console.log (filtro1);

Isso deve retornar um objeto OpenLayers.Filter. Faça isso para ambos os filtros para que você tenha dois objetos de filtro.

Por fim, crie um novo filtro "pai" (que pode ser AND, OR etc.) que combina os dois:

var parent_filter = new OpenLayers.Filter.Logical ({type: OpenLayers.Filter.Logical.AND, filtros: [filter1, filter2]});

Experimente isto:

    código segredo   geom  1298543.0367787,7107400.531374 1299312.4070614,7203464.9016567

EDITAR # 1: Este é meu código, caso ajude em:

MyApp.Search.GetWFSSpatialFilters = function () {function getOtherAttributesFilter () {var _filters = []; // Se txtMyAppID tiver um valor, adicione-o. var MyAppIDs = $ .trim ($ ("# txtMyAppID"). val ()). split (","); if (MyAppIDs! = "") {for (r in MyAppIDs) {_filters.push (new OpenLayers.Filter.Comparison ({type: OpenLayers.Filter.Comparison.EQUAL_TO, propriedade: "id", valor: MyAppIDs [r] })); }} return _filters; } função getDateFilter () {var _filters = []; // Se startTime OR endTime caem entre os tempos de pesquisa, é uma correspondência. _filters.push (new OpenLayers.Filter.Comparison ({type: OpenLayers.Filter.Comparison.BETWEEN, property: "startDate", lowerBoundary: MyApp.Util.ISODateString (MyApp.UI.ControlPanel.DateRange.getDateFromary ()), upper : MyApp.Util.ISODateString (MyApp.UI.ControlPanel.DateRange.getDateTo ())})); _filters.push (new OpenLayers.Filter.Comparison ({type: OpenLayers.Filter.Comparison.BETWEEN, property: "endDate", lowerBoundary: MyApp.Util.ISODateString (MyApp.UI.ControlPanel.DateRange.getDateFromary ()), upper : MyApp.Util.ISODateString (MyApp.UI.ControlPanel.DateRange.getDateTo ())})); return _filters; } função getSatFilter () {var _filters = []; // reúne todos os satélites $ .each (MyApp.Satellites.Items, function (index, satellite) {if (satellite.checked) {//console.log ("(" + satellite.name.toString () + ")" ); _filters.push (new OpenLayers.Filter.Comparison ({type: OpenLayers.Filter.Comparison.EQUAL_TO, propriedade: "platformName", valor: satellite.name.toString ()}));}}); return _filters; } função getSpatialFilter () {var _filters = []; //console.log(MyApp.Region.Items); // se não houver nenhuma região definida, use a janela de visualização. if (MyApp.Region.Items.length> 0) {// reunir todas as regiões $ .each (MyApp.Region.Items, function (index, region) {_filters.push (new OpenLayers.Filter.Spatial ({// propriedade : "boundsText", digite: OpenLayers.Filter.Spatial.INTERSECTS, valor: region.feature [0] .geometry.clone (). transform (MyApp.UI.Map.Projections.Mercator, MyApp.UI.Map.Projections. Geográfico), projeção: "EPSG: 4326"}));}); } else {// use a janela de visualização para não ultrapassar maxExtent. var boundsViewport = MyApp.UI.Map.getMap (). getExtent (). toGeometry (). clone (). transform (MyApp.UI.Map.Projections.Mercator, MyApp.UI.Map.Projections.Geographic) .getBounds ( ); var maxExtent = MyApp.UI.Map.getMap (). maxExtent.toGeometry (). clone (). transform (MyApp.UI.Map.Projections.Mercator, MyApp.UI.Map.Projections.Geographic) .getBounds (); var geometryToUse; if (maxExtent.containsBounds (boundsViewport, false, true)) {geometryToUse = MyApp.UI.Map.getMap (). getExtent (). toGeometry (). clone (). transform (MyApp.UI.Map.Projections.Mercator, MyApp.UI.Map.Projections.Geographic); } else {geometryToUse = MyApp.UI.Map.getMap (). maxExtent.toGeometry (). clone (). transform (MyApp.UI.Map.Projections.Mercator, MyApp.UI.Map.Projections.Geographic); } _filters.push (new OpenLayers.Filter.Spatial ({// propriedade: "boundsText", digite: OpenLayers.Filter.Spatial.INTERSECTS, value: geometryToUse, projection: "EPSG: 4326"})); } return _filters; } var _filters = []; // cria filtro de satélite. _filters.push (new OpenLayers.Filter.Logical ({type: OpenLayers.Filter.Logical.OR, filters: getSatFilter ()})); // criar filtro de data. _filters.push (new OpenLayers.Filter.Logical ({type: OpenLayers.Filter.Logical.OR, filters: getDateFilter ()})); // cria filtro espacial. _filters.push (new OpenLayers.Filter.Logical ({type: OpenLayers.Filter.Logical.OR, filters: getSpatialFilter ()})); // cria outro filtro de atributos. var atributefilter = getOtherAttributesFilter (); if (atributefilter.length> 0) {_filters.push (novo OpenLayers.Filter.Logical ({type: OpenLayers.Filter.Logical.OR, filtros: atributefilter})); } return _filters; }; var searchFilter = new OpenLayers.Filter.Logical ({type: OpenLayers.Filter.Logical.AND, filters: MyApp.Search.GetWFSSpatialFilters ()}) //console.log(myFilters); var protocol = new OpenLayers.Protocol.WFS ({version: "1.1.0", url: MyApp.MapBase.Configuration.GeoServer.WFS_Service.EndPointURL, featurePrefix: MyApp.MapBase.Configuration.GeoServer.WFS_Service.featurePrefix, featureType: , .Projections.Mercator}); var response = protocol.read ({maxFeatures: MyApp.Search.Properties.maxResults, callback: MyApp.Search.SearchComplete_CallBack});

Assista o vídeo: Style Web Map Vector Layers with OpenLayers