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?
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
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. 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?
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