[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