[Gvsig_english] Work with geometry

Fran Peñarrubia fpenarru at iver.es
Sun Mar 12 20:53:52 CET 2006


Hi Erwan.

I've been watching your tests. Keep going on, they are good and simple
examples.

About using OpenJump, there are several ways to do that. And it's a good
exercise to do a bridge between both projects.

Anyway, gvSIG will have a good geoprocessing set of tools in one month or
so, we hope. Until then, here you are how can be done:

You can do a driver around a FeatureDataSet (wrap it) and operate with
this FeatureDataSet. gvSIG will work with this new layer like the other
ones (I didn't try it, but with some little modifications, it should do).

I attach the JumpDriver class, and this is how you can test it:

	JumpDriver jumpDriver = new JumpDriver();
	FeatureSchema featureSchema = new FeatureSchema();
	featureSchema.addAttribute("GEOMETRY", AttributeType.GEOMETRY);

	FeatureDataset fc = new FeatureDataset(featureSchema);
			
	jumpDriver.setFeatureDataSet(fc);
	FLayer lJump = LayerFactory.createLayer("JumpLayer", 
		jumpDriver,ProjectionPool.get("EPSG:23030"));
	mapContext.getLayers().addLayer(lJump);

You will need to do some mapping to avoid return the geometry field.

About SQL language and/or scripting in gvSIG, we can talk in detail in a
few days :-).

Have fun, and let me know if you can "connect" Jump and gvSIG.

PS: I paste the JumpDriver.java here to avoid problems with antivirus and
so on:

package jumpBridge;

import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.sql.Types;
import java.util.Date;

import com.hardcode.gdbms.engine.data.DataSourceFactory;
import com.hardcode.gdbms.engine.data.driver.DriverException;
import com.hardcode.gdbms.engine.data.driver.ObjectDriver;
import com.hardcode.gdbms.engine.data.edition.DataWare;
import com.hardcode.gdbms.engine.values.Value;
import com.hardcode.gdbms.engine.values.ValueFactory;
import com.iver.cit.gvsig.fmap.core.FShape;
import com.iver.cit.gvsig.fmap.core.IGeometry;
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
import com.iver.cit.gvsig.fmap.drivers.DriverAttributes;
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
import com.vividsolutions.jump.feature.AttributeType;
import com.vividsolutions.jump.feature.Feature;
import com.vividsolutions.jump.feature.FeatureDataset;

public class JumpDriver implements VectorialDriver, ObjectDriver {

	private FeatureDataset featDataSet = null;
	public int getShapeType() {
		return FShape.MULTI;
	}

	public int getShapeCount() throws IOException {
		return featDataSet.size();
	}

	public DriverAttributes getDriverAttributes() {
		return null;
	}

	public Rectangle2D getFullExtent() throws IOException {
		return FConverter.convertEnvelopeToRectangle2D(featDataSet.getEnvelope());
	}

	public IGeometry getShape(int index) throws IOException {
		Feature feat = featDataSet.getFeature(index);
		return FConverter.jts_to_igeometry(feat.getGeometry());
	}

	public void reLoad() throws IOException {
		// TODO Auto-generated method stub
		
	}

	public String getName() {
		return "JUMP Driver to gvSIG";
	}

	public int[] getPrimaryKeys() throws DriverException {
		// TODO Auto-generated method stub
		return null;
	}

	public void write(DataWare dataWare) throws DriverException {
		// TODO Auto-generated method stub
		
	}

	public void setDataSourceFactory(DataSourceFactory dsf) {
		// TODO Auto-generated method stub
		
	}

	public Value getFieldValue(long rowIndex, int fieldId) throws
DriverException {
		Feature feat = featDataSet.getFeature((int) rowIndex);
		Object att = feat.getAttribute(fieldId);
		Value val = ValueFactory.createNullValue();
		if (att instanceof Integer)
			val = ValueFactory.createValue(((Integer)att).intValue());
		if (att instanceof Double)
			val = ValueFactory.createValue(((Double)att).doubleValue());
		if (att instanceof Date)
			val = ValueFactory.createValue((Date)att);
		if (att instanceof String)
			val = ValueFactory.createValue((String)att);
		
		return val;
	}

	public int getFieldCount() throws DriverException {
		return featDataSet.getFeatureSchema().getAttributeCount();
	}

	public String getFieldName(int fieldId) throws DriverException {
		//TODO: Un mapping entre los campos reales y otros excluyendo el de tipo
Geometry
		// para que no aparezca en la tabla
		return featDataSet.getFeatureSchema().getAttributeName(fieldId);
	}

	public long getRowCount() throws DriverException {
		return featDataSet.size();
	}

	public int getFieldType(int i) throws DriverException {
		AttributeType attType = featDataSet.getFeatureSchema().getAttributeType(i);
		if (attType.toString().equals("INTEGER"))
			return Types.INTEGER;
		if (attType.toString().equals("DOUBLE"))
			return Types.DOUBLE;
		if (attType.toString().equals("DATE"))
			return Types.DATE;
		if (attType.toString().equals("STRING"))
			return Types.VARCHAR;


		return 0;
	}

	public FeatureDataset getFeatureDataSet() {
		return featDataSet;
	}

	public void setFeatureDataSet(FeatureDataset featDataSet) {
		this.featDataSet = featDataSet;
	}

}


-----Original Message-----
From: "erwan bocher" <erwan.bocher at gmail.com>
To: gvsig_internacional at runas.cap.gva.es
Date: Sun, 12 Mar 2006 14:50:50 +0100
Subject: [Gvsig_english] Work with geometry

>  Hola,
> 
> I tried to integrate OpenJUMP -Viatoris- geoprocessing menu in gvSIG.
> First
> I have create small examples functionalities :
> list layers
> list fields layer
> add shape layer...
> 
> Now, I'd like to work with geometry. Based on example send by Francisco
> José
> Peñarrubia I used JTS library for spatial processing but I don't know
> how to
> transform my geometries in a Flayer in gvSIG.
> To compare in OpenJUMP. My geometry is stored in a feature storing in a
> featurecollection.
> 
> If I want to convert a polygon layer to a linearRing layer I use this
> method
> :
> 
> FeatureCollection fc = layer.getFeatureCollectionWrapper(); //layer is
> the
> layer selected in OJ
> FeatureSchema fs = fc.getFeatureSchema(); // Pienso que es el modelo en
> Fmap
> ?
> FeatureCollection resultfc = new FeatureDataset(fc.getFeatureSchema());
> //The new featureCollection
> 
> Feature feat;
> 
> for (Iterator it = fc.iterator(); it.hasNext();){
> feat = (Feature)it.next(); //feat of layer selected in OJ
> Geometry geom = feat.getGeometry(); //geometry of feat
> 
> for (int i = 0; i < feat.getGeometry().getNumGeometries(); i++) { //If
> they
> are more than two object in feat
> Feature newFeat = new BasicFeature(fs);//The new feature
> FeatureUtil.copyAttributes(feat, newFeat);//Mapping attributes
> newFeat.setGeometry(geom.getBoundary());//New geometry creation
> resultfc.add(newFeat);// add new feature in the new featureCollection
> 
> }
> }
> context.getLayerManager().addLayer("Convert",layer.getName()
> +"_LinearRing"
> , resultfc);
> // Add the new featureCollection as a layer in OpenJUMP. The name of
> the new
> layer = source layer name + _LinearRing
> 
> 
> So my questions is:
> 
> Is it possible to present a method to realise identic work with FMap ?
> 
> 
> Moreover I'm interested to use GDBMS to create a spatial SQL language
> as
> existing in PostGIS but using layers load in gvSIG. However gvSIG works
> with
> GDBMS-0.8-SNAPSHOT. Is it planned to integrate the last  GDBMS (GDBMS
> 1.0) ?
> 
> In attached file you can find my gvSIG examples.
> 
> Best regards
> 
> R1.
> 




More information about the Gvsig_internacional mailing list