Вы находитесь на странице: 1из 8

CUADERNOS DE GEOMTICA

DESARROLLO DE EXTENSIONES CON DESKTOP KOSMO II. CMO GENERAR UNA CAPA DE DOS LNEAS E INTERSECTARLAS?
Las extensiones KOSMO son desarrollos personalizados de tareas necesarias para un usuario concreto, de manera que sobre la plataforma estandar del desktop podamos aadir funcionalidad propietaria que complemente las capacidades del GIS dotndo a dicha herrramienta topogrfica de una verdadera personalizacin que puede llegar hasta estadios de complejsimas aplicaciones SIG. Todo depender de hasta donde queramos o ms bien debamos llegar y de si disponemos del personal adecuado para llevar a cabo el proceso bajo la supervisin de un ingeniero en geomtica. KOSMO dispone de un montn de documentacin que permitir sencillamente poder instalarse los cdigos fuentes, de manera que se generarn los proyectos saigcore, que corresponder a KOSMO y otro nuevo que podemos llamar como queramos, pero que implantar dos clases, una de extensin y otra de plugin que permitirn interactuar con KOSMO, pudiendo generar tanto botones como menes de activacin de la extensicn, cuyo cdigo siempre deber de estar en el mtodo execute() de la clase Plugin. Para realizar esta tarea, lgicamente deberemos tener disponible Eclipse o cualquier otra herramienta similar, como Websphere y tendremos que tener instalada la librera JAI (Java Advanced Imaging), descargable desde la pgina de Oracle.

Una vez configurado todo adecuadamente podremos adentrarnos en el estudio que aqu proponemos. Vamos all!

ENRIQUE DE DIOS SAN ROMN

Ingeniero en Geomtica Ingeniero Tcnico en Topografa. Master en Sistemas de Informacin Geogrfica.

PANTALLA QUE OBTENDREMOS DESPUS DEL DESARROLLO

CDIGO FUENTE DESARROLLADO

Al desarrollar extensiones sobre KOSMO, estamos usando en un 95% libreras estandar SIG como GeoTools, JTS, Jump, etc. De manera que el saber generar extensiones en KOSMO, o tambin en gvSIG supondr un paso cualitativo hacia el desarrollo de aplicaciones cartogrficas basadas en dichas libreras. Veamos el cdigo que prcticamente no necesita explicacin.
// PARTE GEOMTRIA EUCLDEA DEL PROBLEMA GEOMTICO // Genero lineas a partir de matrices de objetos Coordinate // Primera lnea Coordinate[] coordenadas_Linea01 = new Coordinate[] { new Coordinate(0, 0), new Coordinate(10, 10), new Coordinate(20, 20) }; Geometry g01 = new GeometryFactory().createLineString(coordenadas_Linea01); // Segunda lnea Coordinate[] coordenadas_Linea02 = new Coordinate[] { new Coordinate(10, 0), new Coordinate(10, 20)}; Geometry g02 = new GeometryFactory().createLineString(coordenadas_Linea02); // Realizo la interseccin Geometry g03 = g02.intersection(g01); // Obtengo datos de cortes int numero_cortes = g03.getNumPoints(); double coordenada_x_corte = g03.getCoordinate().x; double coordenada_y_corte = g03.getCoordinate().y; // Muestro la informacin en consola y en la pantalla de KOSMO System.out.println(numero_cortes); DialogFactory.showInformationDialog(context.getWorkbenchFrame(), "Nmero de cortes:"+numero_cortes+"Coordenada X:"+coordenada_x_corte+"Coordenada Y:"+coordenada_y_corte, "Cuadernos de Geomtica KOSMO II "); // PARTE DE VISUALIZACION DE ELEMENTOS LINEA // Creo la coleccin de puntos y le aado el esquema. FeatureCollection coleccion_lineas = AddNewLayerPlugIn.createBlankFeatureCollection(2); coleccion_lineas.getFeatureSchema().addAttribute("ID_LINEA_PROPIO", AttributeType.INTEGER); // Uso un feature basado en la estructura de la coleccin de lneas. // Cada feature slo puede contener un elemento por eso creo un bucle for (int i=0;i<2;i++){ Feature feature = new BasicFeature(coleccion_lineas.getFeatureSchema()); // Aado atributos del feature feature.setID(i); // Es la clave del registro feature.setAttribute("ID_LINEA_PROPIO",new Integer (1000+i));

// Aado geometra del feature // Esto no deja de ser un artificio. Las geometras es mejor llevarlas en listas if (i == 0){ feature.setGeometry(g01); } else { feature.setGeometry(g02); } coleccion_lineas.add(feature); } // Doy por vlida la coleccin, es decir consolido datos. coleccion_lineas.commit(); // Creo la layer y aado la coleccin de lneas Layer myLayer = context.getLayerManager().addLayer("LINEAS", "2 lneas", coleccion_lineas); myLayer.setProjection(context.getTask().getProjection()); myLayer.setVisible(true); return true;

COMPRENDIENDO LO QUE HAY QUE HACER GEOMETRA USANDO LA LIBRERA JTS

GENERANDO GEOMETRA SIMPLE Hemos visto como a travs de la clase GEOMETRY hemos generado dos lneas una que contiene una geometra de COORDINATE basada en 2 o tres coordenadas (una lnea puede tener n puntos, que en general definirn los quiebros de la misma). Es importante ver la diferencia entre los objetos GEOMETRY y los objetos GEOMETRYCOLLECTION. Vemos que nuestros objetos GEOMETRY son lneas, pero definimos el objeto GEOMETRYCOLLECTION como MultiLineString createBlankFeatureCollection(2). Vamos a ahondar un poco en el concepto del que hablamos en otro cuaderno de geomtica. La clase PRECISIONMODEL se puede manejar de forma sencilla de las siguiente formas:
PrecisionModel pm = null; pm = new PrecisionModel( PrecisionModel.Type.FIXED ); // fixed decimal point pm = new PrecisionModel( PrecisionModel.Type.FLOATING ); // Java double pm = new PrecisionModel( PrecisionModel.Type.FLOATING_SINGLE ); // Java flota double scale = Math.pow(10, numDecPlaces); pm = new PrecisionModel(scale); GeometryFactory gf = new GeometryFactory(pm); Geometry testPoint = gf.createPoint(new Coordinate(x, y));

Aunque la clase PRECISIONMODEL la veremos pormenorizadamente en otro cuaderno de geomtica, ahora nos es suficiente con saber que se puede definir de las cuatro maneras arriba vistas y que define la precisin de todos los objetos GEOMETRY que se generan como parte de un objeto GEOMETRYFACTORY, GeometryFactory().createLineString(coordenadas_Linea02); de manera que conseguimos una homogeneidad en la precisin de entrada de cualquier dato (homogeneizacin de precisiones decimales diferentes). NOTA: Las precisiones decimales de un objeto en un proyecto de ingeniera definen en si la precisin del elemento. Nos encontramos, no obstante con datos de procedencia desconocida o realizada por personal no cualificado que en muchas circunstancias hace que los decimales no slo no nos estn reflejando la precisin con la que se ha realizado la medida, sino que nos la enmascaran hacindonos creer que es superior/inferior a la correcta. PRECISIONMODEL unifica la precisin matemtica de la informacin para dotarla de idntico peso en funcin de su precisin, no obstante se viene a establecer que dicha precisin ser la del elemento menos preciso de la amalgama con la que se desea interoperar geomtricamente. Insistimos en la necesidad de que las tareas sobre un SIG deben de ser siempre coordinadas por un Ingeniero en Geomtica.

El resto de funciones y su interrelacin es igual que en el Cuaderno de Geomtica en el que abordamos la visualizacin de puntos, por lo que no cabe recordar aquello mismo.

INTERSECTANDO ELEMENTOS Todo tipo de operaciones geomtricas que queramos realizar en KOSMO se realizan bien interactivamente mediante SEXTANTE o bien podemos realizarlas mediante la librera JTS, en mucha de cuya funcionalidad se basa el proyecto de la Universidad de Extremadura hacindola mucho ms amigable e intuitiva. Lo principal que debemos de saber es que cualquier tipo de operacin geomtrica espacial se basar en un objeto de la clase GEOMETRY y devolver (en general) un objeto GEOMETRY tambin. Bscamente tendremos dos tipos principales de anlisis de relaciones espaciales. A saber relacin de interseccin y de superposicin, a los que le aadiremos un tercer tipo auxiliar que es el de Buffer (amortiguador o frontera neutral) , que sabemos que puede ser positivo o negativo. En nuestro caso la interseccin entre las dos rectas es un anlisis del tipo interseccin lgicamente y se resuelve de la siguiente manera:
Geometry g03 = g02.intersection(g01);

Este me parece un momento oportuno para analizar los tipos de relaciones de interseccin, como volvemos a reiterar, todos disponibles en la clase GEOMETRY (En otro Cuaderno de Geomtica veremos las relaciones de superposicin geomtrica).

RELACIONES TOPOLGICAS DE INTERSECCIN JTS

Equals Disjoint Intersects Touches Crosses Within Contains Overlaps

Significa que la topologa de ambas es idntica Significa que ambas geometras no tienen puntos en comn (Se trata a la funcin inversa de Intersect) Al menos existe un punto comn a ambas (Se trata a la funcin inversa de Disjoint) Hay al menos un borde comn a ambas geometras, pero no hay ningn punto de uno interior al otro. Las geometras comparten en parte su interior, pero dicha parte comn es inferior al tamao de al menos una de las dos geometras. La geometra A se encuentra dentor de la B (Se trata a la funcin inversa de Contains) La geometra B se encuentra dentro de la A (Se trata a la funcin inversa de Within) Ambas geometras comparten parte de la misma, pero no todos los puntos son comunes siendo la dimensin del objeto geomtrico resultante igual al de los originales.

VISUALIZANDO DATOS. CASO DEL CORTE DE INTERSECCIN En este caso lo mejor, si como es el caso estamos desarrollando en KOSMO, es utilizar la clase propietaria de SAIG (empresa desarrolladora de KOSMO) denominada DIALOGFACTORY que nos facilita la tarea de dilogos.
DialogFactory.showInformationDialog(context.getWorkbenchFrame(), "Nmero de cortes:"+numero_cortes+"Coordenada X:"+coordenada_x_corte+"Coordenada Y:"+coordenada_y_corte, "Ayuntamiento de Madrid - BDC");

Si por lo que se quiera no se desean utilizar libreras propietarias de KOSMO para dicha operacin, siempre podemos utilizar la clase JOptionPane de la librera estandar de awt, por ejemplo:
JOptionPane.showMessageDialog(null, cortes:"+numero_cortes+"Coordenada Y:"+coordenada_y_corte); "Nmero de X:"+coordenada_x_corte+"Coordenada

Lgicamente y de cara al desarrollo, a parte de los que es el debug en si mismo, muchas veces interesa ir colocando elementos visualizables en la consola con el fin de depurar o corregir cdigo geomtico. Esto es el caso de System.out.println, la funcin que nos permitir realizar dichas operaciones.

GENERANDO COLECCIONES DE GEOMETRA Este apartado se ha visto pormenorizadamente en otros cuadernos de geomtica. Slo nos referiremos a la idea de que el FEATURECOLLECTION seleccionado ha sido tipo 3, es decir Multiline.
FeatureCollection coleccion_lineas AddNewLayerPlugIn.createBlankFeatureCollection(2); =

VISUALIZANDO LAS GEOMETRAS DE LNEAS El nivel mnimo para visualizar la geometra ser LAYER, no obstante y como ya veremos en otros cuadernos de geomtica el mximo nivel de visualizacin con toda su potencia ser el obtenido por JMAPFRAME, aunque para llegar a l, lgicamente debamos saber crear nuevas LAYER. Aqu vamos a ver como se realiza dicha operacin, ya vista en otros Cuadernos de Geomtica y tambin como la LAYER guarda informacin tremendamente til para la visualuizacin, como son el Sistema de Referencia topogrfico y el SLD (estilo de visualizacin) de los elementos de la coleccin. Veamos como se hara:
Layer myLayer = context.getLayerManager().addLayer("LINEAS", "2 lneas", coleccion_lineas); myLayer.setProjection(context.getTask().getProjection()); myLayer.setVisible(true);

Y as habremos conseguido la visualizacin completa de la LAYER generada. Recordar que una vez compilado el jar deberemos de copiar el cdigo de la extensin KOSMO realizada en: C:\Documents and Settings\eds01\Configuracin local\Datos de programa\kosmo_desktop_2.0.1\bin\ext , que por defecto es el lugar del ordenador personal en el que se instala KOSMO.

Вам также может понравиться