Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [udig-devel] Filtering datas from a database

So I imagine you would do the work as follows:

Map map = (Map)ApplicationGIS.getActiveMap()
LayerFactory layerFactory = map.getLayerFactory()

List<Layer> layers = new ArrayList<Layer>()
 for (IGeoResouce r : service.resources(new NullProgressMonitor())) { // service.members(...) returns me the whole LOCATION_POINT table
          if (r.canResolveTo(FeatureSource.class)) {
Layer layer = layer.createLayer(r)
layer.getStyleBlackboard().put(ProjectBlackboardConstants.LAYER__DATA_QUERY, filter);
  }
}

map.getLayersInternal().addLayers(layers)


That should work if the OracleDataStore is efficiently implemented.  

Jesse



On 19-Dec-08, at 11:58 AM, Jacques LESCOT wrote:

Maybe that my problem is different :

Using the following code snippet, the "coll" variable contains indeed the only Feature with the given ID. The probem is that I do not know how to either enforce this filter to be applied to my IService or adapt teh Feature into an IGeoResource so that it could be displayed on a Layer ?

                    OracleDataStore database = service.resolve(OracleDataStore.class, new NullProgressMonitor());
                    FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = database.getFeatureSource("LOCATION_POINT"); // Filter only the LOCATION_POINT table from my database

                    FilterFactory ff = CommonFactoryFinder.getFilterFactory(GeoTools.getDefaultHints());
                    Filter franceFilter = ff.id(Collections.singleton(ff.featureId("LOCATION_POINT.681")));
                    FeatureCollection<SimpleFeatureType, SimpleFeature> coll = featureSource.getFeatures(franceFilter); // Filter only the record with ID="681"

                    List<IGeoResource> resourceList = new ArrayList<IGeoResource>();
                    for (IResolve nextElt : service.members(new NullProgressMonitor())) { // service.members(...) returns me the whole LOCATION_POINT table
                        if (nextElt instanceof IGeoResource) {
                            resourceList.add((IGeoResource) nextElt);
                        }
                    }
                    ApplicationGIS.addLayersToMap(ApplicationGIS.getActiveMap(), resourceList, 1, null, true);

I added some comments in order to help you understand what's happen with the above code.

Thus, I am here working with an OracleDataStore, and I am using uDig trunk source code.

Regards,
Jacques

Ugo Taddei a écrit :
Jesse Eichar wrote: 

On 19-Dec-08, at 11:32 AM, Jacques LESCOT wrote: 

See my comments below, 

Jesse Eichar a écrit : 

Hi, 

We need to rename the packages from internal to something less frightening.  When it comes to net.refractions.udig.project the internal packages can be used but NOT the internal.impl packages.  The idea was to make people reluctant to use the internal classes because most of the things should be done with Commands not direct.  Commands allow roll-back.  Problem was that for setting up maps and so on it is annoying to do it through commands. 
Yes, I recognized here EMF behavior :-) 

As for filtering features I would recommend trying to make use of the view work. 
In my case, I need to perform this programmatically. 
  It has a couple bugs but in general works.  The way to do it is to put a Filter on the styleblackboard with the key:  net.refractions.udig.project.ProjectBlackboardConstants.ProjectBlackboardConstants.LAYER__DATA_QUERY 
You will probably think I am fastidious but I would prefer a solution where filtering is done at a upper level : I mean instead of retrieving all the datas from the database and then filtering them in the map editor, I would like to filter things when requesting datas from the database. As I said before, the database may contains lots of records and thus it would be more judicious to limit records that are sent back by the server. I am pretty sure solution is near (from what I read from http://docs.codehaus.org/display/GEOTDOC/02+Filter) but I would really need a little more help. :-) 

Huh.  I thought it created it did something so that only those features that matched the Filter were retrieved.  I haven't personally tested this but that was my understanding.  Have you verified that all features are retrieved from the postgis?  You are using Postgis right? 

I think you're correct here, Jesse. The filtering is done at data store level. Though I haven't written the code in our app, the colleague who did told me it was so. (At least with our shapefiles. And that was udig 1.1, but I don't think that should matter.) 

Cheers, 

Ugo 



------------------------------------------------------------------------ 

_______________________________________________ 
User-friendly Desktop Internet GIS (uDig) 
http://udig.refractions.net 
http://lists.refractions.net/mailman/listinfo/udig-devel 



-- 
<Signature_AWT.jpg>
Jacques LESCOT
Project Manager
Eclipse Technical Expert
jacques.lescot@xxxxxxxxxxxxxxxx
Standard : +33(0)5 61 00 52 90
Direct : +33(0)5 61 00 06 60
Mobile : +33(0)6 74 49 23 34
Fax : +33(0)5 61 00 51 46
Anyware Technologies
Lake Park
ZAC de l'Hers - Allée du Lac
BP 87216
31672 Labège Cedex 
France
www.anyware-tech.com
This message and any attachments (the "Message") are confidential and intended solely for the addressees.
Any unauthorized modification, edition, use or dissemination is prohibited. 
Neither Anyware Technologies nor its headquarters Wavecom shall be liable for the Message if altered, changed, falsified or edited, diffused without authorization.
_______________________________________________
User-friendly Desktop Internet GIS (uDig)
http://udig.refractions.net
http://lists.refractions.net/mailman/listinfo/udig-devel


Back to the top