[udig-devel] Trouble with modifying feature attributes

Jesse Eichar jeichar at refractions.net
Thu Oct 4 11:32:46 PDT 2007


I think what you need to do is ensure that the rendering is triggered  
after the updates.  The quick way is:

Layer layer2 = (Layer)layer;
try{
	layer2.eSetDeliver(false);
	// do your stuff
	layer.refresh(areaToRefresh);
}finally{
	layer2.eSetDeliver(true);
}

As you can probably guess the eSetDeliver() turns off events for the  
layer.

Hope this helps,

Jesse



On Oct 4, 2007, at 6:01 AM, tony.roth at GMX.de wrote:

> situation:
> The features of a point layer are symbolized with external  
> graphics. All elements are presented to the user in a table and if  
> he selectes one or more in this table the items shall be  
> highlighted in the map. The SLD specification defines that a  
> graphic either contains a mark or an external graphic, therefore  
> it's not possible to surround the external graphic with a red  
> square or something like that: I need another external grahpic.
> To realize this my features have the featureattribute 'selected'  
> and I generate a bunch of sld rulez: For each category of my items  
> and for {selected;unselected} I generate a rule with a certain  
> external graphic. (The categories define the symbol like windmill  
> or tower)
>
> If the user selects one or more items of the table this happens:
>
>  public void setSelection(List<Integer> selectedItems){
>   try {
>    FeatureStore fs = layer.getResource(FeatureStore.class, null);
>    // deselect all: setting the dedictated attribute type to   
> UNSELECTED (static variable)
>    // this happens since we don't know which of the elements are  
> selected at the moment
>    fs.modifyFeatures(selectionAttributeType, UNSELECTED, Filter.NONE);
>    FilterFactory filterFactory =  
> FilterFactoryFinder.createFilterFactory();
>    // set the selected ones
>    for (Integer id:selectedItems){
>     AttributeExpression attributeExpression =  
> filterFactory.createAttributeExpression(IDAttributeName);
>     LiteralExpression literalExpression =  
> filterFactory.createLiteralExpression(id);
>     CompareFilter compareFilter = filterFactory.createCompareFilter 
> (FilterType.COMPARE_EQUALS);
>     compareFilter.addLeftValue(attributeExpression);
>     compareFilter.addRightValue(literalExpression);
>     // this sets the filtered features to SELECTED
>     fs.modifyFeatures(selectionAttributeType, SELECTED,  
> compareFilter);
>    }
>   } catch (Exception e) {
>     // ...
>   }
>  }
>
> It works... somehow .. but not the way I wanted:
> The renderer starts and on the first modifyFeatures comand (the  
> deselection) all items are rendered. This takes about 14 seconds  
> (on a pentium 4) with just four features in the layer. And only the  
> graphics / symbols are rendered, the labels below the symbols are  
> destroyed and I have to update the layer.
>
> Another way could be to check which features switch from selected  
> to not selected and just modify these in the first step but with  
> hundreds or more featuers this also takes a while.
>
> Is this approach to be doomed and / or crap?
>
> What is the best way to realize a kind of highlight features in the  
> map with external graphics?
>
> tony roth
> _______________________________________________
> User-friendly Desktop Internet GIS (uDig)
> http://udig.refractions.net
> http://lists.refractions.net/mailman/listinfo/udig-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.refractions.net/pipermail/udig-devel/attachments/20071004/67e95fe2/attachment.html


More information about the udig-devel mailing list