On 21/06/2010, at 5:13 AM, Adnila wrote:

> hey guys,
> 
> I have a problem. I want to intersect two geometries. Afterwards I want to
> add to the attribute values from both "old" geometries to the new feature.
> How am I supposed to do that?

Think this is called an "overlay" in GIS speak; or a join for us poor 
programmers :-)

There is an example in the user guide:
- 
http://docs.codehaus.org/display/GEOTDOC/12+Using+a+Loop+to+Join+FeatureCollections

In your example I could not see you performing a match to see if the geometries 
actually interact?

> For example:
> 1. feature: name=Elbe, watertemperature=16, depth=5
> 2. feature: adminUnit=Dresden, nationalLevel=4, NUTSCode=DED21
> 
> new feature: name=Elbe,  watertemperature=16, depth=5, adminUnit=Dresden,
> nationalLevel=4, NUTSCode=DED21

You will need to create a new FeatureType (based on the two feature types you 
start with); the CSV2SHP tutorial shows how to use SimpleFeatureTypeBuilder to 
accomplish this.

Once you have your feature type you can use SimpleFeatureBuilder to create new 
features using the attribute values; they must be provided in the same order 
you define in your feature type.

> in the code snippet I tried to solve it. The values are in the SimpleFeature
> copy. But I do not know how to get them. Has anybody an idea how to solve
> this? I tried already various loops.

You can ask for the values by name, or by index; or as a list (in the order 
they are defined by the feature type).

> But the matter is the
> copy.setValue(Object) or copy.setValue(collection). I do not know what they
> are doing. I looks like they always only set the first entry of the copy
> values section.
> 
> Can somebody help?

Have a read over the two tutorial mentioned above (the section on simple 
feature type builder is near the end). If you need further information there is 
http://docs.codehaus.org/display/GEOTDOC/Feature+Model+Guide

Jody

> 
> package controller;
> 
> import java.io.File;
> import java.io.FileInputStream;
> import java.io.FileOutputStream;
> import java.io.IOException;
> import java.io.InputStream;
> import java.io.OutputStream;
> import java.io.Serializable;
> import java.util.ArrayList;
> import java.util.HashMap;
> import java.util.Iterator;
> import java.util.Map;
> import java.util.List;
> import javax.swing.JOptionPane;
> import org.geotools.data.DataStore;
> import org.geotools.data.DataStoreFactorySpi;
> import org.geotools.data.DefaultTransaction;
> import org.geotools.data.FeatureSource;
> import org.geotools.data.FeatureWriter;
> import org.geotools.data.FileDataStore;
> import org.geotools.data.FileDataStoreFinder;
> import org.geotools.data.Transaction;
> import org.geotools.data.shapefile.ShapefileDataStoreFactory;
> import org.geotools.feature.FeatureCollection;
> import org.geotools.feature.FeatureIterator;
> import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
> import org.opengis.feature.Property;
> import org.opengis.feature.simple.SimpleFeature;
> import org.opengis.feature.simple.SimpleFeatureType;
> import org.opengis.feature.type.AttributeDescriptor;
> import com.vividsolutions.jts.geom.LineString;
> import com.vividsolutions.jts.geom.MultiLineString;
> import com.vividsolutions.jts.geom.MultiPoint;
> import com.vividsolutions.jts.geom.MultiPolygon;
> import com.vividsolutions.jts.geom.Point;
> import com.vividsolutions.jts.geom.Polygon;
> 
> import view.GISViewer;
> 
> public class Test_Sicherung {
> 
>       private FeatureCollection<SimpleFeatureType, SimpleFeature> 
> featColl_input;
>       private FeatureIterator<SimpleFeature> iterator_adminUnit;
>       private FeatureIterator<SimpleFeature> iterator_input;
>       private CoordReferSyst crs_INSPIRE;
>       private SimpleFeature feature_adminUnit;
>       private FeatureCollection<SimpleFeatureType, SimpleFeature>
> featColl_adminUnit;
>       private Transaction transaction;
>       private Shapefile shapefile;
>       private File file;
>       private FileDataStore store;
>       private FeatureSource<SimpleFeatureType, SimpleFeature> 
> featSource_input;
>       private SimpleFeature feature;
>       private DataStoreFactorySpi factory;
>       private Map<String, Serializable> create;
>       private DataStore newDataStore;
>       private SimpleFeatureType featureType;
>       private SimpleFeatureType schema;
>       private FeatureWriter<SimpleFeatureType, SimpleFeature> writer;
>       private SimpleFeature copy;
>       private com.vividsolutions.jts.geom.Geometry geometry3;
>       private File fileNew;
>       private MultiPolygon multiPolygon;
>       private MultiPolygon multiPolygon_adminUnit;
>       private Object geometry;
>       private MultiLineString multiLineString;
>       private com.vividsolutions.jts.geom.Geometry geometry4;
>       private MultiPoint multiPoint;
>       private com.vividsolutions.jts.geom.Geometry geometry5;
>       private Polygon polygon;
>       private com.vividsolutions.jts.geom.Geometry geometry6;
>       private LineString lineString;
>       private com.vividsolutions.jts.geom.Geometry geometry7;
>       private Point point;
>       private com.vividsolutions.jts.geom.Geometry geometry8;
>       private SimpleFeatureType schema_new;
>       private Iterator<? extends Property> test;
>       private Property test1;
> 
>       /**
>        * default constructor
>        */
>       public Test_Sicherung() {
>               // auto-generated constructor stub
>       }
> 
>       // methods
> 
>       /**
>        * method to intersect two layer with each other and write it into a 
> shape
> file
>        * @return 
>        * @throws Exception 
>        */
>       public File intersect(GISViewer viewer, FeatureSource<SimpleFeatureType,
> SimpleFeature> featureSource) throws Exception {
> 
>               // initialize feature collection 
>               featColl_adminUnit = featureSource.getFeatures(); 
>               shapefile = new Shapefile();
>               crs_INSPIRE = new CoordReferSyst();
> 
>               // create new shape file and reproject old one
>               file = shapefile.reprojectToShapefile(viewer);
>               store = FileDataStoreFinder.getDataStore(file);
>               featSource_input = store.getFeatureSource();
>               featColl_input = featSource_input.getFeatures();
> 
>               // create a new shape file with a slight modified schema
>               fileNew = new File("TempFile.shp");
>               factory = new ShapefileDataStoreFactory();
>               create = new HashMap<String, Serializable>();
>               create.put("url", fileNew.toURI().toURL());
>               create.put("create spatial index", Boolean.TRUE);        
>               newDataStore = factory.createNewDataStore(create);
>               schema = featSource_input.getSchema();
> 
>               SimpleFeatureTypeBuilder sftb = new SimpleFeatureTypeBuilder();
>               sftb.init(schema);              
> 
>               List<AttributeDescriptor> attributeList = new
> ArrayList<AttributeDescriptor>();
>               attributeList = 
> featColl_adminUnit.getSchema().getAttributeDescriptors();
>               sftb.addAll(attributeList);
> 
>               schema_new = sftb.buildFeatureType();
> 
>               featureType = SimpleFeatureTypeBuilder.retype(schema_new,
> crs_INSPIRE.crs_ETRS89_LAEA());
>               newDataStore.createSchema(featureType);
> 
>               // carefully open an iterator and writer to process the results
>               transaction = new DefaultTransaction("Convert");
>               writer = 
> newDataStore.getFeatureWriterAppend(featureType.getTypeName(),
> transaction);
> 
>               // initialize feature iterator
>               iterator_adminUnit = featColl_adminUnit.features();
>               iterator_input = featColl_input.features();
> 
>               try {
>                       while(iterator_adminUnit.hasNext()){
>                               feature_adminUnit = iterator_adminUnit.next();
> 
>                               while(iterator_input.hasNext()) {
> 
>                                       feature = iterator_input.next();
>                                       copy = writer.next();
> 
>                                       multiPolygon_adminUnit = (MultiPolygon)
> feature_adminUnit.getDefaultGeometry();
> 
>                                       geometry = feature.getDefaultGeometry();
> 
>                                       if (geometry instanceof MultiPolygon) {
>                                               multiPolygon = (MultiPolygon) 
> feature.getDefaultGeometry();
>                                               geometry3 = 
> multiPolygon_adminUnit.intersection(multiPolygon);
>                                               
> copy.setDefaultGeometry(geometry3);
>                                       }
> 
>                                       if (geometry instanceof 
> MultiLineString) {
>                                               multiLineString = 
> (MultiLineString) feature.getDefaultGeometry();
>                                               geometry4 = 
> multiPolygon_adminUnit.intersection(multiLineString);
>                                               
> copy.setDefaultGeometry(geometry4);
>                                               test = 
> feature_adminUnit.getValue().iterator();
> 
>                                               while (test.hasNext()) {
>                                                       test1 = test.next();
>                                                       copy.setValue(test1);
>                                               }
>                                       }
> 
>                                       if (geometry instanceof MultiPoint) {
>                                               multiPoint = (MultiPoint) 
> feature.getDefaultGeometry();
>                                               geometry5 = 
> multiPolygon_adminUnit.intersection(multiPoint);
>                                               
> copy.setDefaultGeometry(geometry5);
>                                       }
> 
>                                       if (geometry instanceof Polygon) {
>                                               polygon = (Polygon) 
> feature.getDefaultGeometry();
>                                               geometry6 = 
> multiPolygon_adminUnit.intersection(polygon);
>                                               
> copy.setDefaultGeometry(geometry6);
>                                       }
> 
>                                       if (geometry instanceof LineString) {
>                                               lineString = (LineString) 
> feature.getDefaultGeometry();
>                                               geometry7 = 
> multiPolygon_adminUnit.intersection(lineString);
>                                               
> copy.setDefaultGeometry(geometry7);
>                                       }
> 
>                                       if (geometry instanceof Point) {
>                                               point = (Point) 
> feature.getDefaultGeometry();
>                                               geometry8 = 
> multiPolygon_adminUnit.intersection(point);
>                                               
> copy.setDefaultGeometry(geometry8);
>                                       }
> 
>                                       writer.write();
>                               }
>                       }
> 
>                       transaction.commit();
>                       JOptionPane.showMessageDialog(null, "Convert to 
> Administrative Unit
> complete");
>               } catch (Exception problem) {
>                       problem.printStackTrace();
>                       transaction.rollback();
>                       JOptionPane.showMessageDialog(null, "Convert to 
> Administrative Unit
> failed");
>               } finally {
>                       writer.close();
>                       iterator_adminUnit.close();
>                       iterator_input.close();
>                       transaction.close();
>                       copy(fileNew, file);
>                       fileNew.delete();
>               }
>               return file;
>       }
> 
>       /**
>        * copies source file to destiny file, if destiny file does not exist, 
> it
> is created
>        */
>       public void copy(File src, File dst) throws IOException {
>               InputStream in = new FileInputStream(src); 
>               OutputStream out = new FileOutputStream(dst); 
> 
>               // transfer bytes from in to out 
>               byte[] buf = new byte[1024]; 
>               int len; 
>               while ((len = in.read(buf)) > 0) { 
>                       out.write(buf, 0, len);
>               } 
>               in.close();
>               out.close(); 
>       } 
> }
> 
> 
> -- 
> View this message in context: 
> http://osgeo-org.1803224.n2.nabble.com/Intersect-two-features-and-modelling-new-one-including-attributes-tp5201837p5201837.html
> Sent from the geotools-gt2-users mailing list archive at Nabble.com.
> 
> ------------------------------------------------------------------------------
> ThinkGeek and WIRED's GeekDad team up for the Ultimate 
> GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
> lucky parental unit.  See the prize list and enter to win: 
> http://p.sf.net/sfu/thinkgeek-promo
> _______________________________________________
> Geotools-gt2-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users


------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Geotools-gt2-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to