Hi Oliver:

Andrea sent me over to say hi; I was looking at 
http://jira.codehaus.org/browse/GEOT-3051 today (trying to make a few less 
casts and generics for those using GeoTools - especially when learning) and he 
sent me in your direction.

I am one of the developer enthusiastic about providing a selection of 
implementation for datastore implementors; and GeoTools users to work from. And 
would be keen to gather up implementations like this for the code base.

Could I ask you to submit this as a patch?

I am also really keen to see an implementation backed onto a JTS Spatial index 
:-)

As for DefaultFeatureColleciton it originally had a HashMap which was faster; 
but it was changed to a TreeMap (sorted by feature id) to better match 
shapefile which also keeps its features in order.  What can I say we were 
defining an API at a time; and now that it is works we should encourage a range 
of implementations to suite different tasks.

Jody
 
On 21/04/2010, at 7:49 AM, Oliver Gottwald wrote:

> Andrea thanks again for your help.  A colleague and I cranked this out a 
> little while ago.
> 
> The following is a Lean(Low Processing) Solution to population of a 
> FeatureCollection:
> Minimal Testing.....
> 
> Below is the following: LeanFeatureCollection.java, LeanFeatureSource.java, 
> and a snipped from a Test Cast: 
> 
> //LeanFeatureCollection
> 
> package org.geotools.demo;
> 
> 
> import java.util.ArrayList;
> import java.util.Iterator;
> import java.util.List;
> import java.util.NoSuchElementException;
> 
> import org.geotools.feature.FeatureIterator;
> import org.geotools.feature.collection.AbstractFeatureCollection;
> import org.geotools.geometry.jts.ReferencedEnvelope;
> import org.opengis.feature.simple.SimpleFeature;
> import org.opengis.feature.simple.SimpleFeatureType;
> import org.opengis.geometry.BoundingBox;
> 
> 
> 
> @SuppressWarnings("unchecked")
> public class LeanFeatureCollection extends AbstractFeatureCollection  {
> 
>      private List<SimpleFeature> features = new ArrayList<SimpleFeature>();
>      private ReferencedEnvelope bounds = null;
>      
>      protected LeanFeatureCollection(SimpleFeatureType schema) {
>          super(schema);
>      }
>      
>      
>      @Override
>      public int size() {
>          return features.size();
>      }
>      
>      @Override
>      protected Iterator openIterator() {
>          Iterator it = features.iterator();
>          return it;
>      }
>      
>      @Override
>      protected void closeIterator(Iterator close) {
>          // nothing to do there
>      }
> 
> 
>     @Override
>     public boolean add(SimpleFeature f) {
>         
>          //maintain the bounds
>           BoundingBox boundingBox = f.getBounds();
>           if (bounds == null){
>               bounds = new ReferencedEnvelope(
>                       boundingBox.getMinX(), boundingBox.getMaxX(), 
>                       boundingBox.getMinY(), boundingBox.getMaxY(),
>                       schema.getCoordinateReferenceSystem());
>           } else {
>               bounds.expandToInclude(boundingBox.getMinX(), 
> boundingBox.getMinY());    
>               bounds.expandToInclude(boundingBox.getMaxX(), 
> boundingBox.getMaxY());    
>           }
>           
>         return features.add(f);
>     }
> 
>     @Override
>     public void clear() {
>         // maintain the bounds
>         bounds = null;
>         super.clear();
>     }
> 
>     @Override
>     public FeatureIterator<SimpleFeature> features() {
>         return new LeanFeatureCollectionIterator(features);
>     }
> 
>     @Override
>     public ReferencedEnvelope getBounds() {
>         return bounds;
>     }
> 
>     @Override
>     public boolean isEmpty() {
>         return features.isEmpty();
>     }
>          
>     private class LeanFeatureCollectionIterator implements 
> FeatureIterator<SimpleFeature> {
>         private Iterator<SimpleFeature> iter;
>         
>         public LeanFeatureCollectionIterator(List<SimpleFeature> features) {
>             iter = features.iterator();
>         }
>         
>         public void close() {
>             // do nothing
>         }
> 
>         public boolean hasNext() {
>             return iter.hasNext();
>         }
> 
>         public SimpleFeature next() throws NoSuchElementException {
>             return iter.next();
>         }
>     }
>  }
> 
> 
> //LeanFeatureSource.java
> package org.geotools.demo;
> 
> import java.awt.RenderingHints.Key;
> import java.io.IOException;
> import java.util.HashSet;
> import java.util.Set;
> 
> import org.geotools.data.DataAccess;
> import org.geotools.data.FeatureListener;
> import org.geotools.data.FeatureSource;
> import org.geotools.data.Query;
> import org.geotools.data.QueryCapabilities;
> import org.geotools.data.ResourceInfo;
> import org.geotools.feature.CollectionListener;
> import org.geotools.feature.FeatureCollection;
> import org.geotools.geometry.jts.ReferencedEnvelope;
> import org.opengis.feature.simple.SimpleFeature;
> import org.opengis.feature.simple.SimpleFeatureType;
> import org.opengis.feature.type.Name;
> import org.opengis.filter.Filter;
> 
> 
> public class LeanFeatureSource implements FeatureSource<SimpleFeatureType, 
> SimpleFeature> {
> 
>     private LeanFeatureCollection features;
> 
>     public LeanFeatureSource(LeanFeatureCollection featureCollection) {
>         this.features = featureCollection;
>     }
>     
>     
>     public void addFeatureListener(FeatureListener listener) {
> //        throw new UnsupportedOperationException();
>     }
> 
>     public ReferencedEnvelope getBounds() throws IOException {
>         return features.getBounds();
>     }
> 
>     public ReferencedEnvelope getBounds(Query query) throws IOException {
>         return features.getBounds();
>     }
> 
>     public int getCount(Query query) throws IOException {
>         return features.size();
>     }
> 
>     public DataAccess<SimpleFeatureType, SimpleFeature> getDataStore() {
>         return null;
>     }
> 
>     public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatures()
>             throws IOException {
>         return features;
>     }
> 
>     public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatures(
>             Query query) throws IOException {
>         return features;
>     }
> 
>     public FeatureCollection<SimpleFeatureType, SimpleFeature> getFeatures(
>             Filter filter) throws IOException {
>         return features;
>     }
> 
>     public ResourceInfo getInfo() {
>         return null;
>     }
> 
>     public Name getName() {
>         return null;
>     }
> 
>     public QueryCapabilities getQueryCapabilities() {
>         return null;
>     }
> 
>     public SimpleFeatureType getSchema() {
>         return features.getSchema();
>     }
> 
>     public Set<Key> getSupportedHints() {
>         return new HashSet<Key>();
>     }
> 
>     public void removeFeatureListener(FeatureListener listener) {
> //        throw new UnsupportedOperationException();
>     }
> }
> 
> 
> //Test Case Snipped
> //let IDE define imports
> //getPointStyle set to null
> public class DisplayPoint {
>     static StyleFactory styleFactory = 
> CommonFactoryFinder.getStyleFactory(null);
>     static FilterFactory filterFactory = 
> CommonFactoryFinder.getFilterFactory(null);
>     
>     static final CoordinateReferenceSystem crs = DefaultGeographicCRS.WGS84;
>     static final int MAX_NAME_LENGTH = 20;
> 
> public static void main(String[] args) throws Exception {
>         DisplayPoint displayPoint = new DisplayPoint();
>         //TreeMapHandler - Object I have internally for TreeMap Handling
>         TreeMapHandler tmHandler = new TreeMapHandler();
>         //data.csv file of xyz points
>         //allPoints is a TreeMap of XyzPoint Objects
>         TreeMap allPoints = tmHandler.getTreeMap("/data.csv");
> 
>         LeanFeatureCollection collection = 
> displayPoint.getPointFeature(allPoints);
>         
>         LeanFeatureSource featureSource = new LeanFeatureSource(collection);
>         Style pointStyle = displayPoint.createPointStyle();
>         MapLayer m = new DefaultMapLayer(featureSource, pointStyle);
>         
>         MapContext map = new DefaultMapContext();
>         map.setTitle("The Point");
>         map.addLayer(featureSource, pointStyle);
>         
>         JMapFrame.showMap(map);
> }
> 
> 
> public LeanFeatureCollection getPointFeature(TreeMap allPoints) throws 
> Exception {
>     SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
>     typeBuilder.setName("mytype");
>     typeBuilder.setCRS(crs);
>     typeBuilder.add("route", Point.class);
>     typeBuilder.length(MAX_NAME_LENGTH).add("name", String.class);
>     final SimpleFeatureType TYPE = typeBuilder.buildFeatureType();
> 
>     GeometryFactory factory = JTSFactoryFinder.getGeometryFactory(null);    
>     SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
> 
>     LeanFeatureCollection collection = new LeanFeatureCollection(TYPE);
> 
>       Collection cl = allPoints.values();
>       Iterator it = cl.iterator();
>       while (it.hasNext()){
>           XyzPoint xyz = (XyzPoint)it.next();
>           Point point = factory.createPoint( new 
> Coordinate(xyz.getX(),xyz.getY()));
> 
>           featureBuilder.set("name",xyz.getName());
>           featureBuilder.add(point);
>           
>           SimpleFeature f = featureBuilder.buildFeature(null);
>           
>   
>           
>           collection.add(f);
>       }
>       return collection;
> }
> 
> private Style createPointStyle() {
>     return null;
> }
> }
> ------------------------------------------------------------------------------
> _______________________________________________
> Geotools-gt2-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

------------------------------------------------------------------------------
_______________________________________________
Geotools-gt2-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to