Simplified Filter Builder using workflow (use Check Group to filter layer by attributes)
Hello,
I have been working to create worfklow that has similar ability as the out-of-the-box Filter Builder in VertiGIS Studio Web. However I am aiming for a simplify version that will enable users to select features by an attribute (the selection is from a single layer only as opposed to default Filter Builder in Studio that gives user many query options from different data sources and attribute values).
The workflow currently displays this filter panel when triggered:
I got stuck on what to do next to display on the map only selected features.
My idea is to use Create Value activity that will hold all the selected features where the values will be added using Add Item activity. Then I use the Run Command to display the selected features.
I think I am missing something but could not figure out what. Any suggestions is much appreciated. Thank you!
-
Hi Amanda,
If the layer is already on the map, first ensure that the layer is visible (Set Layer Visibility). Then, create a definition query based on the user's selection and apply the definition expression to the layer (Set Layer Definition Expression). There's no need to query the layer at all.1 -
{"_properties":{"isServerWorkflow":false},"components":[{"id":2,"steps":[{"id":3,"inputs":{},"position":"0,-130","purpose":"start","title":"Start","transitions":[{"id":15,"position":"90,-70 90,0","sourceConnector":"bottom","target":{"id":14}}]},{"action":"gcx:wf:forms:form:DisplayForm","id":4,"inputs":{"form":{"accessors":[],"code":"resources.forms[values.id]","values":{"id":5}}},"name":"form1","position":"-30,110","title":"Display Form","transitions":[{"id":11,"position":"90,230 90,280","sourceConnector":"bottom","target":{"id":7}}]},{"action":"gcx:wf:core:loop:ForEach","id":7,"inputs":{"items":{"accessors":["$form1"],"annotations":[{"count":6,"index":0,"kind":"idref"}],"code":"$form1.state.checkGroup1.value.items","source":"$form1.state.checkGroup1.value.items"}},"name":"forEach1","position":"-30,280","title":"For Each","transitions":[{"id":21,"position":"90,400 90,450","sourceConnector":"bottom","target":{"id":20}}]},{"action":"gcx:wf:core::CreateValue","id":14,"inputs":{"expression":{"accessors":[],"annotations":[],"code":"[]","source":"[]"}},"name":"checked_values","position":"-30,0","title":"Create Value","transitions":[{"id":16,"position":"90,60 90,110","target":{"id":4}}]},{"action":"gcx:wf:core::CreateValue","id":20,"inputs":{"expression":{"accessors":["$checked_values"],"annotations":[{"count":15,"index":18,"kind":"idref"}],"code":"\"MARK_TYPE IN ('\".concat($checked_values.result.join(\"','\"), \"')\")","source":"`MARK_TYPE IN ('${$checked_values.result.join(\"','\")}')`"}},"name":"SqlQuery","position":"-30,450","title":"Create Value","transitions":[{"id":23,"position":"90,510 90,560","sourceConnector":"bottom","target":{"id":22}}]},{"action":"gcx:wf:arcgis::SetLayerDefinitionExpression","id":22,"inputs":{"expression":{"accessors":["$SqlQuery"],"annotations":[{"count":9,"index":0,"kind":"idref"}],"code":"$SqlQuery.result","source":"$SqlQuery.result"},"layerId":"Your Layer Name"},"name":"layerDef1","position":"-30,560","title":"Set Layer Definition Expression"}]},{"id":8,"steps":[{"id":9,"inputs":{},"position":"0,0","purpose":"start","title":"For Each","transitions":[{"id":13,"position":"90,60 90,110","sourceConnector":"bottom","target":{"id":12}}]},{"action":"gcx:wf:core::If","id":12,"inputs":{"condition":{"accessors":["$forEach1"],"annotations":[{"count":9,"index":0,"kind":"idref"}],"code":"$forEach1.item.checked","source":"$forEach1.item.checked"}},"position":"30,110","title":"If","transitions":[{"branch":"true","id":19,"position":"30,140 -70,140 -70,240","sourceConnector":"left","target":{"id":18},"targetConnector":"top"}]},{"action":"gcx:wf:core::AddItem","id":18,"inputs":{"collection":{"accessors":["$checked_values"],"annotations":[{"count":15,"index":0,"kind":"idref"}],"code":"$checked_values.result","source":"$checked_values.result"},"item":{"accessors":["$forEach1"],"annotations":[{"count":9,"index":0,"kind":"idref"}],"code":"$forEach1.item.value","source":"$forEach1.item.value"}},"position":"-190,240","title":"Add Item"}]}],"deploymentConfig":{"supportedApps":{"VSW":true}},"designerVersion":"5.39.0+33","forms":[{"defaults":{},"elements":{"checkGroup1":{"enabled":true,"index":0,"items":{"0":{"index":0,"label":{"markdown":"CheckBox1"},"value":"c1"},"1":{"index":1,"label":{"markdown":"CheckBox2"},"value":"c2"},"2":{"index":2,"label":{"markdown":"CheckBox3"},"value":"c3"}},"rowIndex":0,"rowNumber":0,"type":"CheckGroup"},"footer":{"enabled":true,"items":{"0":{"default":true,"index":0,"label":{"markdown":"Submit"},"validates":true,"value":"submit"},"1":{"index":1,"label":{"markdown":"Cancel"},"validates":false,"value":"cancel"}},"section":"footer","type":"ButtonBar"},"header":{"section":"header","title":{"markdown":"Form Title"},"type":"Header"}},"id":5}],"licenseInfo":{"licenseUrl":"https://gis-prod.cimic.com.au/vertigisstudio/workflow/service/auth/license"},"start":{"id":3},"transitions":[{"branch":"loop","id":10,"source":{"id":7},"target":{"id":9}}]}
1 -
Hi Niluka Munasinghe your response is much appreciated!
So the layer is already visible for now, I scrapped the 3 activities I used previously and replace it with the Set Layer Definition Expression as you suggested. It looks like this now:
Using this expression
=`MARK_TYPE= '${$GDA2020filter.state.checkGroup1.value.items}'`
but it still won't filter out the features. The developer tool shows this error message but I am not sure I understand what that means.
0 -
Import the above JSON to workflow designer and build accordingly
0 -
Hi Niluka Munasinghe , thanks so much for pointing me into that workflow. With a bit of modification, it works really well!
I was wondering if there is any way to clear all the ‘Set Layer Definition’ expression that users have submitted, i.e. to show all the mark types on the map? I searched the community posts but could not find anything so far.
I was thinking to include a ‘Reset’ button that will reset the layer definition and clear the filtering that users do in their previous selection.
Your help is much appreciated!
0 -
If you want to remove a layer definition, you could try a Set Layer Definition activity with an .expression =null or ='1=1'. Throw that thing in a ForEach which iterates your layers (or service-layer combinations) and you should be good to go.
0 -
Hi Zack, thanks for the tips! I ended up using Create Value to define all the survey marks types then use it in another Set Layer Definition. Yours however looks more sophisticated and simpler, will try and see how it goes.
0
Please sign in to leave a comment.
Comments
7 comments