[Gvsig_desarrolladores] Utilización de geoprocesos

Ana Calle nico200307 en gmail.com
Jue Sep 1 08:10:18 CEST 2016


Adjunto te envío un ficherito con el ejemplo. Si hay alguna cosa que
quieras aclarar ya me vas diciendo.
Ojalá te sirva!!!

Saludos

El 31 de agosto de 2016, 19:13, Santiago Moreno <santimoren en gmail.com>
escribió:

> Ana,
> Muchas gracias por la respuesta.
> La verdad que si estoy interesado en los ejemplos que puedas tener!
> Hace tiempo que estoy luchando con esto y ya no descarto ninguna
> alternativa!!
> Muchas gracias!!
>
> El 31 de agosto de 2016, 2:37, Ana Calle <nico200307 en gmail.com> escribió:
>
>> Yo estuve haciendo intersecciones desde java, y como tampoco vi mucha
>> viabilidad con los geoprocesos, al final me decanté por hacer las
>> intersecciones a bajo nivel, entre geometrías, por medio de la
>> librería com.vividsolutions.jts.geom.Geometry. Si te interesara te
>> podría mandar ejemplo.
>>
>> Saludos
>>
>>
>>
>> El 30 de agosto de 2016, 23:35, Santiago Moreno <santimoren en gmail.com>
>> escribió:
>>
>>> Buenas!
>>> Muchas gracias por las respuestas.
>>> Lamentablemente SI estoy desarrollando en JAVA por lo cual las dos
>>> soluciones que me enviaron no son de mucha ayuda.
>>>
>>> Estuve investigando también para poder ejecutar Scripts desde JAVA y no
>>> tuve mucha suerte :(
>>>
>>> Espero que alguien tenga algún ejemplo en JAVA y que me pueda ayudar.
>>> Saludos!!
>>>
>>> El 29 de agosto de 2016, 7:39, Óscar Martínez <masquesig en gmail.com>
>>> escribió:
>>>
>>>> Buenas,
>>>>
>>>> No se si desarrollas para Java o para Jython con el Módulo de
>>>> scripting. Te comento lo que conozco por mi parte  más cercana a scripting:
>>>>
>>>> Si es para scripting está la librería gvpy:
>>>> https://github.com/oscar9/gvpy/blob/master/gvpy_guia_de_uso.md
>>>>
>>>> Se importaría como from gvsig.libs import gvpy
>>>>
>>>> La documentación falta añadirle un par de funcionalidades nuevas, pero
>>>> esa es la esencia.
>>>>
>>>>
>>>> Si desarrollas para Java, le puedes echar un ojo al código de la
>>>> librería:
>>>>
>>>> En tu instalación \gvSIG-desktop-2.3.0-2441-RC2-
>>>> win-x86_64\gvSIG\extensiones\org.gvsig.scripting.app.mainplu
>>>> gin\scripting\lib\gvsig\libs\gvpy.py
>>>>
>>>> Podrás ver las importaciones que realiza de librerías java y poco a
>>>> poco podrás ir convirtiendo el código en java con lo necesario para
>>>> ejecutar un geoproceso.
>>>>
>>>> No tengo ejemplos en Java, a ver si alguien tiene.
>>>>
>>>>
>>>> Ya nos comentas como va
>>>>
>>>> Un saludo,
>>>>
>>>> Óscar
>>>>
>>>>
>>>>
>>>> On 26/08/2016 1:07, Santiago Moreno wrote:
>>>>
>>>> Buenas,
>>>> Como estan?
>>>> Estoy desarrollando un Plugin para la versión 2.X y tengo que utilizar
>>>> herramientas de geoprocesamiento para trabajar intersecciones entre
>>>> distintas capas.
>>>>
>>>> Mi primer pregunta es :
>>>> Qué librerías debería importar para poder utilizar las funcionalidades
>>>> de geoprocesamiento?
>>>> Investigando encontré del grupo "es.une" la librería "sextante" y estoy
>>>> usando la versión 0.6.0.
>>>>
>>>> Con la misma no he logrado ejecutar ningun algoritmo y los ejemplos que
>>>> encuentro utilizan librerías (viejas?) que no puedo utilizar.
>>>>
>>>> Alguna recomendacion?
>>>>
>>>> En la lista de distribución casi no se ha hablado de geoprocesos.
>>>> Alguno ya cuenta con algún ejemplo al que se pueda acceder?
>>>>
>>>> Aguardo sus comentarios.
>>>> Saludos,
>>>> Santi
>>>>
>>>>
>>>> _______________________________________________
>>>> gvSIG_desarrolladores mailing listgvSIG_desarrolladores en listserv.gva.es
>>>> Para ver histórico de mensajes, editar sus preferencias de usuario o darse de baja en esta lista, acuda a la siguiente dirección: https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> gvSIG_desarrolladores mailing list
>>>> gvSIG_desarrolladores en listserv.gva.es
>>>> Para ver histórico de mensajes, editar sus preferencias de usuario o
>>>> darse de baja en esta lista, acuda a la siguiente dirección:
>>>> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>>>>
>>>>
>>>
>>> _______________________________________________
>>> gvSIG_desarrolladores mailing list
>>> gvSIG_desarrolladores en listserv.gva.es
>>> Para ver histórico de mensajes, editar sus preferencias de usuario o
>>> darse de baja en esta lista, acuda a la siguiente dirección:
>>> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>>>
>>>
>>
>> _______________________________________________
>> gvSIG_desarrolladores mailing list
>> gvSIG_desarrolladores en listserv.gva.es
>> Para ver histórico de mensajes, editar sus preferencias de usuario o
>> darse de baja en esta lista, acuda a la siguiente dirección:
>> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>>
>>
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en listserv.gva.es
> Para ver histórico de mensajes, editar sus preferencias de usuario o darse
> de baja en esta lista, acuda a la siguiente dirección:
> https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20160901/d5dcbcca/attachment.html>
------------ próxima parte ------------
try {
			
			manager = DALLocator.getDataManager();
			//aqui se valida el sFichero1 que sería el 1º shape a intersectar
			params = manager.createStoreParameters("Shape");
			params.setDynValue("shpFile",sRuta + sFichero1+".shp");			
			params.setDynValue("CRS", CRSFactory.getCRS("EPSG:25830"));			
			params.setDynValue("useNullGeometry",false);
			params.setDynValue("allowInconsistenciesInGeometryType",false);			
			store1=(FeatureStore)manager.openStore(params.getDataStoreName(), params);
			
      //aqui se valida el sFichero2 que sería el 2º shape a intersectar
			params = manager.createStoreParameters("Shape");
			params.setDynValue("shpFile",sRuta + sFichero2+".shp");			
			params.setDynValue("CRS", CRSFactory.getCRS("EPSG:25830"));			
			params.setDynValue("useNullGeometry",false);
			params.setDynValue("allowInconsistenciesInGeometryType",false);			
			store2=(FeatureStore)manager.openStore(params.getDataStoreName(), params);
			
      //el resultado de la interseción va en un shape ya definido en su estrcutura, con unos campos concretos
      
			//si el shape resultado esta cargado en la vista,hay que descargarlo
			FLayer layerResultado = fGenerales.buscaLayer(mapa, sResultado);
			if (layerResultado!=null){
				mapa.getLayers().removeLayer(layerResultado);
				mapa.invalidate();
			}
			
			params = manager.createStoreParameters("Shape");
			params.setDynValue("shpFile",sRuta + sResultado+".shp");			
			params.setDynValue("CRS", CRSFactory.getCRS("EPSG:25830"));			
			params.setDynValue("useNullGeometry",false);
			params.setDynValue("allowInconsistenciesInGeometryType",false);			
			storeResultado=(FeatureStore)manager.openStore(params.getDataStoreName(), params);			
			
			
		} catch (InitializeException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		} catch (ProviderNotRegisteredException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		} catch (ValidateDataParametersException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//ArrayList con los nombres de los campos
		//aqui se valida la estructura de las capas, se cogen los campos de cada shape que nos van a interesar para llevar a la interseccion
		ArrayList<String> lstOperando2=null;
		ArrayList<String> lstOperando1=null;
		lstOperando1=getCampos(sResultado,sFichero1);
		lstOperando2=getCampos(sResultado,sFichero2);

		
		double dArea = 0;
		int iContador = 0;
		try {
			
			FeatureType typeResultado = storeResultado.getDefaultFeatureType();
			FeatureAttributeDescriptor[] attributeDescriptorsResultado = typeResultado.getAttributeDescriptors();
			storeResultado.edit();			

      //elimina cualquier contenido que hubiera en la capa 'resultado'  
			eliminaRegistros(storeResultado);
			
			set1 = store1.getFeatureSet();
			set2 = store2.getFeatureSet();
						
			DisposableIterator disposableIterator = set1.fastIterator();
			while (disposableIterator.hasNext()) { 
				Feature feature1 = (Feature) disposableIterator.next();
				Geometry geo1 = feature1.getDefaultGeometry();
				com.vividsolutions.jts.geom.Geometry jtsGeo1=null;
				try {
					jtsGeo1 = (com.vividsolutions.jts.geom.Geometry)geo1.invokeOperation("toJTS", null);
				} catch (GeometryOperationNotSupportedException e) {
				    throw new GeometryOperationException(e);
				} catch (Exception e1) {
					PluginServices.getMDIManager().restoreCursor();		
					e1.printStackTrace();
				}	
				DisposableIterator disposableIterator2 = set2.fastIterator();					
				while (disposableIterator2.hasNext()) {
					Feature feature2 = (Feature) disposableIterator2.next();
					Geometry geo2 = feature2.getDefaultGeometry();
					com.vividsolutions.jts.geom.Geometry jtsGeo2=null;
					try {
						jtsGeo2 = (com.vividsolutions.jts.geom.Geometry) geo2.invokeOperation("toJTS", null);
					} catch (GeometryOperationNotSupportedException e) {
					    throw new GeometryOperationException(e);
					} catch (Exception e1) {
						PluginServices.getMDIManager().restoreCursor();		
						e1.printStackTrace();
					}
					
					
					com.vividsolutions.jts.geom.Geometry geomResultadoJTS =null;
					Geometry geomResultado=null;
					dArea = 0;					
					//hay que descomponer la geometria en sus partes minimas si tuviera
					if (jtsGeo1 != null){
						int iGeometries1 = jtsGeo1.getNumGeometries();
						for ( int jts1 = 0; jts1 < iGeometries1; jts1++ ) {
							com.vividsolutions.jts.geom.Geometry geo11 = jtsGeo1.getGeometryN(jts1);
							
							if (geo11.getNumGeometries()>1){
								int ggg=0;
							}
							geomResultadoJTS =null;
							geomResultado=null;
							dArea=0;
							if (jtsGeo2!=null){
								int iGeometries2 = jtsGeo2.getNumGeometries();
								for ( int jts2 = 0; jts2 < iGeometries2; jts2++ ) {
									com.vividsolutions.jts.geom.Geometry geo22 = jtsGeo2.getGeometryN(jts2);
									if (geo22.getNumGeometries()>1){
										int ggg=0;								
									}
									
									geomResultadoJTS =null;
									geomResultado=null;
									
                  //sTipo se refiere a si la interseccion es entre capas poligono (I:intersecta) o entre capa poligono y capa puntos(C:contiene)
                  
									try {
										if ((sTipo.equals("I")) && (geo11.intersects(geo22))){							
											geomResultadoJTS = geo11.intersection(geo22);									
											
											//geomResultado= geo1.intersection(geo2);
											if (geomResultadoJTS!=null){
												
												//aqui tratar la geometria porque puede ser una colección		
												geomResultadoJTS = tratarGeometriaResultadoInterseccion(geomResultadoJTS);
												dArea = (int)geomResultadoJTS.getArea();
											}
										}
										if ((sTipo.equals("C")) && (geo11.contains(geo22))){
											geomResultadoJTS = geo22;
											dArea = 0;
										}
									} catch (Exception e) {
										// TODO Auto-generated catch block								
										sError = sError + "\n" + "Problemas en la topología para " + sResultado + " " + e.getMessage();
										//e.printStackTrace();
										
										//vamos a simplificar las geometria porque parece que nos da problemas
										PrecisionModel pm = new PrecisionModel(1000000);
						                GeometryPrecisionReducer gpr = new GeometryPrecisionReducer(pm);
						                geo11 = gpr.reduce(geo11);
						                geo22 = gpr.reduce(geo22);
						                
						                geomResultadoJTS = geo11.intersection(geo22);
										if (geomResultadoJTS!=null){									
											//aqui tratar la geometria porque puede ser una colección		
											geomResultadoJTS = tratarGeometriaResultadoInterseccion(geomResultadoJTS);
											dArea = (int)geomResultadoJTS.getArea();
										}
									}
														
									if ((geomResultadoJTS!=null) ){  //aqui se exluyen ya los recintos menores de 2 metros!!!, porque son residuos de una mala topología								
										GeometryManager managerG = GeometryLocator.getGeometryManager();
						                GeometryOperationContext paramsG = new GeometryOperationContext();
						                paramsG.setAttribute("JTSGeometry", geomResultadoJTS);
						                geomResultado = (Geometry) managerG.invokeOperation("fromJTS", paramsG);
						                
						                
										double dAreaResul=0;
										try {
											dAreaResul = geomResultado.area();
											if (dAreaResul != dArea){
												int ojo = 1;
											}
											
										} catch (Exception e1) {
											// TODO Auto-generated catch block
											sError = sError + "\n" + "Problemas en la topología para " + sResultado + " " + e1.getMessage();
											logger.error(e1.getMessage());
											e1.printStackTrace();									
										}					
										
										
										if ((dAreaResul > 2) &&(sTipo.equals("I")) || (sTipo.equals("C"))){
										
											//esta geometría de intersección debe pasar al feature resultado
											EditableFeature eFeature = storeResultado.createNewFeature(true).getEditable();
											eFeature.setDefaultGeometry(geomResultado);							
											eFeature.setGeometry(typeResultado.getDefaultGeometryAttributeName(), geomResultado);
											
											if (sTipo.equals("I")){
												eFeature.setDouble("N_AREA", dAreaResul);
											}
											////////////////////////////////////////////////
											//pasando según los nombres de los campos, solo se pasa a la geometria resultado los atributos que se hayan detallado al principio
											String sNombreCampo = "";
											String sValor="";
											Iterator it = lstOperando1.iterator();
											while (it.hasNext()){								
												sNombreCampo =(String)it.next();
												if ((!sNombreCampo.toUpperCase().equals("GEOMETRY")) && (!sNombreCampo.toUpperCase().equals("N_AREA"))){									
													try {
														sValor = feature1.get(sNombreCampo).toString();
														eFeature.set(sNombreCampo, sValor);
													} catch (Exception e) {
														// TODO Auto-generated catch block
														logger.error(e.getMessage());
														e.printStackTrace();
													}
												}
											}
											it = lstOperando2.iterator();
											while (it.hasNext()){								
												sNombreCampo =(String)it.next();
												if ((!sNombreCampo.toUpperCase().equals("GEOMETRY")) && (!sNombreCampo.toUpperCase().equals("N_AREA"))){
													try {
														sValor = feature2.get(sNombreCampo).toString();
														
														if ((sNombreCampo.toUpperCase().equals("PROVINCIA")) || (sNombreCampo.toUpperCase().equals("MUNICIPIO")) || (sNombreCampo.toUpperCase().equals("AGREGADO")) ||
																(sNombreCampo.toUpperCase().equals("ZONA")) || (sNombreCampo.toUpperCase().equals("POLIGONO")) || (sNombreCampo.toUpperCase().equals("PARCELA")) || (sNombreCampo.toUpperCase().equals("RECINTO"))
														){
															int iValor = (int)Double.parseDouble(sValor) ;
															sValor = Integer.toString(iValor);
														}
														eFeature.set(sNombreCampo, sValor);
													} catch (Exception e) {
														// TODO Auto-generated catch block
														logger.error(e.getMessage());
														e.printStackTrace();
													}
												}
											}
											///hasta aqui pasando los valores de los campos
											
											storeResultado.insert(eFeature);
											iContador++;
										}//cumple la condicion de area > 2
											
									}//if intersecta y cumple condiciones!!!!
								}//eof getNumGeometries de geom2
							}//eof del jtsGeo2 <>null
						}//eof getNumGeometries de geom1
					} //eof del jtsGeo1 <>null
					
				}//bucle features2				
				disposableIterator2.dispose();
				
			}//bucle features1
			
			storeResultado.finishEditing();
			disposableIterator.dispose();			
			
			set1.dispose();
			set2.dispose();
			
			store1.dispose();
			store2.dispose();
			storeResultado.dispose();		
		
			
		} catch (DataException e1) {
			// TODO Auto-generated catch block
			PluginServices.getMDIManager().restoreCursor();		
			e1.printStackTrace();
		} catch (GeometryOperationNotSupportedException e1) {
			// TODO Auto-generated catch block
			PluginServices.getMDIManager().restoreCursor();		
			e1.printStackTrace();
		} catch (GeometryOperationException e1) {
			// TODO Auto-generated catch block
			PluginServices.getMDIManager().restoreCursor();		
			e1.printStackTrace();
		//} catch (Exception e1) {
		//	PluginServices.getMDIManager().restoreCursor();		
		//	e1.printStackTrace();
		}
				
		
	return sError;


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