[Gvsig_desarrolladores] Duda acerca del tratamiento de los CRS

junquero ijunquero en uoc.edu
Sab Abr 7 22:44:07 CEST 2012


Hola

Efectivamente, gvSIG si soporta cambio de CRS, fué una confusión mía. Sin
embargo, pienso que si que confía en la base de datos espacial para realizar
la conversión, y estoy de acuerdo en que es raro, puesto que es posible que
no todas las BD espaciales lo soporten, y al menos debería haber algún
parámetro que indicara si la base de datos soporta dicha transformación o
no.

Respecto a JASPA, por concretar más, no digo que no soporte la función
ST_Transform, sino que no soporta la transformación en la sentencia que
utiliza gvSIG. Lo concreto algo más...

La sentencia que usa gvSIG para obtener los datos cuando la región a mostrar
es más pequeña que en Envelope es la siguiente (a modo de ejemplo):

Select asBinary("GEOM"), "GID" , "GID" from "PUBLIC"."CARRETERAS" where (
intersects(GeomFromText('POLYGON ((XYLIST))', 'EPSG:23030'), envelope(GEOM))
)

Si te fijas, en GeomFromText utiliza una sintaxis que tras la geometría,
especifíca el CRS. Esta sintaxis a JASPA no le gusta nada y da error de
sintaxis.

Si por el contrario, se usa otra sintaxis parecida:

Select asBinary("GEOM"), "GID" , "GID" from "PUBLIC"."rivers" where (
intersects(GeomFromText('SRID=23030;POLYGON ((4633.081699633056
5916.746136865342, 4633.081699633056 6298.454746136866, 5081.357593965176
6298.454746136866, 5081.357593965176 5916.746136865342, 4633.081699633056
5916.746136865342))'), envelope(GEOM)) )

El error que da es que los SRSID de las geometrías para la función
intersects debe ser la misma. En concreto el error es el siguiente:

Exception calling user-defined function: "ST_Intersects([B en 8f3d27,
[B en 1f7cdc7): The geometries must have the same SRID: found SRIDs 23030 and
4326"; SQL statement:
Select asBinary("GEOM"), "GID" , "GID" from "PUBLIC"."rivers" where (
intersects(GeomFromText('SRID=23030;POLYGON ((4633.081699633056
5916.746136865342, 4633.081699633056 6298.454746136866, 5081.357593965176
6298.454746136866, 5081.357593965176 5916.746136865342, 4633.081699633056
5916.746136865342))'), envelope(GEOM)) ) [90105-157] 90105/90105

Me da la sensación, ya que soy principiante en gvSIG, de que esto es porque
en gvSIG se ha confiado en la conversión de coordenadas en la BD espacial,
porque la sentencia SQL se construye en la clase
org.gvsig.fmap.mapcontext.layers.vectorial.IntersectsEnvelopeEvaluator. 

En esta clase, antes se hacía la conversión de coordenadas, pero la zona de
código que la hacía ahora está comentada. Adjunto el código fuente de la
clase donde se observa que en el constructor está comentada la parte donde
se realiza la conversión de coordenadas.

package org.gvsig.fmap.mapcontext.layers.vectorial;

import org.cresques.cts.IProjection;

import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
import org.gvsig.fmap.dal.feature.Feature;
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
import org.gvsig.fmap.dal.feature.FeatureType;
import org.gvsig.fmap.geom.Geometry;
import org.gvsig.fmap.geom.operation.GeometryOperationException;
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
import org.gvsig.fmap.geom.operation.towkt.ToWKT;
import org.gvsig.fmap.geom.primitive.Envelope;
import org.gvsig.tools.evaluator.AbstractEvaluator;
import org.gvsig.tools.evaluator.EvaluatorData;
import org.gvsig.tools.evaluator.EvaluatorException;

public class IntersectsEnvelopeEvaluator extends AbstractEvaluator {

	private Envelope envelope;
	private String geomName;
	private String envelopeWKT = null;
	private Envelope envelopeTrans;
	private boolean isDefault;
	private String srs;

	public IntersectsEnvelopeEvaluator(Envelope envelope,
			IProjection envelopeProjection, FeatureType featureType,
			String geomName) {
		FeatureAttributeDescriptor fad = (FeatureAttributeDescriptor) featureType
				.get(geomName);

		this.isDefault = featureType.getDefaultGeometryAttributeName().equals(
				geomName);
		this.envelope = envelope;
		// this.srs = envelopeProjection.getAbrev();
		// this.projection=CRSFactory.getCRS(fad.getSRS());
		// this.envelopeProjection=envelopeProjection;
//		ICoordTrans ct = null;
//		if (!this.srs.equals(fad.getSRS())) { // FIXME comparación
//			ct = envelopeProjection.getCT(fad.getSRS());
//		}
//		if (ct != null) {
//			this.envelopeTrans = envelope.convert(ct);
//		} else {
			this.envelopeTrans = envelope;
//		}
		this.geomName = geomName;

		this.srs = envelopeProjection.getAbrev();

		this.getFieldsInfo().addMatchFieldValue(geomName, envelopeTrans);

	}

	public Object evaluate(EvaluatorData data) throws EvaluatorException {
		Envelope featureEnvelope;
		if (isDefault) {
			featureEnvelope = ((Feature) data.getContextValue("feature"))
					.getDefaultEnvelope();
		} else {
			featureEnvelope = ((Geometry) data.getDataValue(geomName)).getEnvelope();
		}
		return new Boolean(envelopeTrans.intersects(featureEnvelope));

	}

	public String getName() {
		return "intersets in envelope";
	}

	public String getSQL() {


		if (envelopeWKT == null) {
			try {
				envelopeWKT = (String) envelope.getGeometry().invokeOperation(
						ToWKT.CODE, null);
			} catch (GeometryOperationNotSupportedException e) {
				throw new DataEvaluatorRuntimeException(e);
			} catch (GeometryOperationException e) {
				throw new DataEvaluatorRuntimeException(e);
			}
		}

		return " intersects(GeomFromText('" + envelopeWKT + "', '" + srs
				+ "'), envelope(" + geomName + ")) ";
	}
}





--
View this message in context: http://osgeo-org.1560.n6.nabble.com/Duda-acerca-del-tratamiento-de-los-CRS-tp4694794p4696055.html
Sent from the gvSIG desarrolladores mailing list archive at Nabble.com.


Más información sobre la lista de distribución gvSIG_desarrolladores