[Gvsig_desarrolladores] Interfaz IGeometry

Alvaro Zabala azabala en gmail.com
Jue Mayo 31 19:43:58 CEST 2007


Hola Angel,

El modelo de geometrías de gvSIG está a un nivel muy próximo a Java2D, para
primar el rendimiento en la operación más frecuente de un SIG (el
renderizado de mapas).

El código que envías trabaja a este nivel, utilizando el método append() de
GeneralPathX (que hereda de GeneralPath). Java2D también te ofrece la clase
java.awt.geom.Area, que te permite realizar operaciones de geometría
constructiva (union, diferencia, intersección, etc.)

Yo en su día hice unas pruebas con estas clases para realizar operaciones de
este tipo, y me dí cuenta de dos cosas: son poco robustas topológicamente
hablando (aparecen errores groseros, ten en cuenta además que en el javadoc
de append() se dice que conecta los dos Shapes representados con una línea
recta) y son lentos.

Frente a esto, JTS pretende ser robusto, y es bastante más rápido. Por eso,
lo más simple es pasar las geometrías de renderizado gvSIG a geometrías JTS,
realizar tus operaciones con esta API, y luego volver a pasar a IGeometry:

Geometry geometriaJts1 = igeometry.toJtsGeometry();
Geometry geometriaJts2 = igeometry.toJtsGeometry();
Geometry union = EnhancedPrecisionOp.union(geometriaJts1 , geometriaJts2 );
IGeometry unionGvSig = FConverter.jts_to_igeometry(union);

EnhancedPrecisionOp es una clase de JTS, y FConverter una clase de libFMap.

Un saludo.



El día 30/05/07, Angel Rodriguez Fernandez <anxelin en hotmail.com> escribió:
>
>  Hola,
>
> Tengo una clase propia que se llama Geometria que contiene un IGeometry.
> Estaba intentando hacer un metodo para unir geometrias, osea que si tengo g1
> con un circulo y g2 con un cuadrado obtener un g3 con un circulo y un
> cuadrado.
>
> Os cuento el único camino que encontre, que creo que es "muy enrevesado"
> tal vez porque no comprendo muy bien las primitivas del gvSIG.
>
> public IGeometry unir(IGeometry ig1, IGeometry ig2, boolean conectar){
>     Shape shape = ig1.getInternalShape();
>         GeneralPath gPath = new GeneralPath(shape);
>         gPath.append(ig2.getInternalShape(), conectar);
>         shape = (Shape) gPath;
>         GeneralPathX gPX = new GeneralPathX(shape);
>         FShape fShape = new FPolygon2D(gPX);
>         ConcreteMemoryDriver driver = new ConcreteMemoryDriver();
>         driver.addShape(fShape, null);
>
>         return driver.getShape(0);
> }
>
>
> Se que es muy raro, pero le he dado mil vueltas y no veo la manera de
> hacerlo. ¿Seria correcto?, ¿hay otro camino?
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en runas.cap.gva.es
> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>
>


-- 
Alvaro Zabala Ordóñez
Tlf: 657235082
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://runas.cap.gva.es/pipermail/gvsig_desarrolladores/attachments/20070531/a6eb0a80/attachment.htm


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