[Gvsig_desarrolladores] ERROR LEYENDA VALORES UNICOS AL MIGRAR 1.1 A 1.11

Ana Belen Garcia belen.garcia en e-sig.es
Mie Ago 17 17:49:29 CEST 2011


Hola a todos,

     Tengo una serie de leyendas aplicadas a unas capas que leo desde una
Base de Datos. Al migrar desde la version 1.1 a la 1.11 me surgen una serie
de errores.Os comento paso a paso.*

Mi código para cargar de una capa desde la BD es el siguiente:*

public FLyrVect cargarMapa_Uso(MapControl mapControl, View v,IConnection
conex,String nombreTabla,String consulta, String nombreLeyenda) {


    vistaMapas = (View) PluginServices.getMDIManager().getActiveWindow();
    mapCtrlMapas = vistaMapas.getMapControl();
    DBLayerDefinition dbLayerDef;

    Driver drv;
    try {
        drv = LayerFactory.getDM().getDriver("PostGIS JDBC Driver");

    IVectorialJDBCDriver dbDriver = (IVectorialJDBCDriver) drv;

    //voy a obener los campos de la tabla
    DatabaseMetaData metadataDB;
    Connection conexion1 = ((ConnectionJDBC) conex).getConnection();
    //metadataDB = conexion1.getMetaData();




        metadataDB = conexion1.getMetaData();
        String tipos[] = new String[1];
        tipos[0] = "TABLE";
        ResultSet tablas = metadataDB.getTables(null, null, nombreTabla,
tipos);
        tablas.next();
        String t = tablas.getString(tablas.findColumn( "TABLE_NAME" ));

        ResultSet columnas = metadataDB.getColumns(null,null,nombreTabla,
"%");
        Vector<String> vcolumnas=new Vector<String>();
        int p=0;
        while(columnas.next()) {
            if (columnas.getString("Column_Name").compareTo("the_geom") != 0
)
                if (!columnas.getString("Column_Name").equals("the_geom"))
                    vcolumnas.addElement(columnas.getString("Column_Name"));

        }


        /*creamos la definicion para la capa*/
        dbLayerDef = new DBLayerDefinition();
        dbLayerDef.setCatalogName(nombreBD); //Nombre de la base de datos
        dbLayerDef.setSchema(esquema); //Nombre del esquema
        dbLayerDef.setTableName(nombreTabla); //Nombre de la tabla
        dbLayerDef.setWhereClause("where "+consulta);

        dbLayerDef.setConnection(conex);
        String[] fields=new String[vcolumnas.size()];
        for(int i=0; i<vcolumnas.size(); i++){
            fields[i]= vcolumnas.get(i);
        }
        dbLayerDef.setFieldNames(fields);
        dbLayerDef.setFieldGeometry("the_geom");
        dbLayerDef.setFieldID("gid");


        Statement st2;


            st2 =
((ConnectionJDBC)conex).getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
            ResultSet rsGood2 = st2.executeQuery("SELECT * FROM " +
nombreTabla);
            dbDriver.setData(conex, dbLayerDef);


                try {
                    if (dbDriver.getShapeCount()==0){
                        JOptionPane.showMessageDialog(null, "No hay
resultados para esta consulta", "Información OleoSIG",
JOptionPane.WARNING_MESSAGE);
                        return null;
                    }
                    else{



                            IProjection proj = null;


                            proj = CRSFactory.getCRS("EPSG:23030");
                            FLayer lyr =
LayerFactory.createDBLayer(dbDriver, nombreLeyenda, proj);


                            /*asignamos proyección a la capa y al
ViewPort*/

vistaMapas.getMapControl().getViewPort().setProjection(proj);
                            dbLayerDef.setSRID_EPSG(proj.getAbrev());

                            st2.close();


                           if (lyr != null) {
                               lyr.setVisible(true);


vistaMapas.getMapControl().getMapContext().beginAtomicEvent();
                               // Comprobamos si es necesario reproyectar
                               checkProjection(lyr,
vistaMapas.getMapControl());


vistaMapas.getMapControl().getMapContext().getLayers().addLayer(lyr);

vistaMapas.getMapControl().getMapContext().endAtomicEvent();
                           }


                           return (FLyrVect) lyr;

          }
                } catch (HeadlessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    return null;
                } catch (ReadDriverException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    return null;
                }

            } catch (DBException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
            catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        } catch (DriverLoadException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return null;
        }



}

*Código donde aplico la leyenda:*
public void leyenda_Uso(FLyrVect capa,String nombreCampo, String
nombreMostrar,int r1, int g1, int b1, int r2, int g2, int b2) {

    int k, j;

                String filterName=nombreCampo;

                SelectableDataSource dsCaminos;
                int numSymbols = 0;
                int value;
                SymbolTable m_symbolTable=null;

                int maxValue=3, minValue=1;

                try {
                      m_symbolTable = new
SymbolTable(null,"values",capa.getShapeType());
                  } catch (ReadDriverException e1) {
                      // TODO Auto-generated catch block
                      e1.printStackTrace();
                  }

                int campo;
                int campoMostrar;


                try {
                     dsCaminos = ((FLyrVect) capa).getRecordset();
                     //campo es el numero de columnas de la tabla 20
                     campo = dsCaminos.getFieldIndexByName(filterName);
                     // nombreMostrar es el nombre de la columna
                     // campoMostrar es 7 el numero de la columna

                     campoMostrar =
dsCaminos.getFieldIndexByName(nombreMostrar);


                     FSymbol myDefaultSymbol=null;

                      // Creamos el primer y último color.


                     Color startColor = new Color(r1,g1,b1);
                     Color endColor = new Color(r2,g2,b2);


                      VectorialUniqueValueLegend legend = null;

                      legend =
LegendFactory.createVectorialUniqueValueLegend(FShape.POLYGON);
                     // legend.setFieldName(nombreMostrar);



                      for (int d = 0; d < dsCaminos.getRowCount(); d++) {

                         StringValue clave =
(StringValue)dsCaminos.getFieldValue((long)d, (int)campoMostrar);


                          ////Comprobar que no está repetido y no hace falta
introducir en el hashtable el campo junto con el simbolo.
                         if (legend.getSymbolByValue(clave) == null) {
                              //si no esta creado el simbolo se crea

                              myDefaultSymbol = new FSymbol(FShape.POLYGON);


myDefaultSymbol.setDescription(clave.toString());
                              legend.addSymbol(clave,  myDefaultSymbol);

                              numSymbols++;
                             //
System.out.println("------------aquiii54554");
                              if (numSymbols == 100) {
                                  int resp =
JOptionPane.showConfirmDialog(null,PluginServices.getText(this,
"mas_de_100_simbolos"),
                                          PluginServices.getText(this,
"quiere_continuar"),
                                          JOptionPane.YES_NO_OPTION,
                                          JOptionPane.WARNING_MESSAGE);

                                  if ((resp == JOptionPane.NO_OPTION) ||
                                          (resp ==
JOptionPane.DEFAULT_OPTION)) {
                                      return;
                                  }
                              }
                          }
                      } // for


m_symbolTable.fillTableFromSymbolList(legend.getSymbols(),legend.getValues(),
legend.getDescriptions());
                      dsCaminos.stop();
                      capa.setLegend(legend);


                }catch(NullPointerException e){
                    e.printStackTrace();
                }catch (ReadDriverException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }catch (LegendLayerException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }




          }

 Bueno, pues este código me funcionaba perfectamente en la 1.1 pero al
migrar de una version a otra, no me pinta la capa, pero si que me la muestra
en el TOC y  si puedo acceder a su tabla asociada. Pero cuando intento
acceder a las propiedades de la capa, salta el siguiente *error*:

SqlAux getFeatureIterator = SELECT AsEWKB("the_geom", 'XDR'), gid FROM
"public"."jaen_torredelcampo_oleocampo_aux" where (uso ILIKE 'Corrientes y
superficies de agua' OR uso ILIKE 'Viales' OR uso ILIKE 'Cítricos-Frutal' OR
uso ILIKE 'Cítricos' OR uso ILIKE 'Cítricos-Frutal de cáscara' OR uso ILIKE
'Cítricos-Viñedo' OR uso ILIKE 'Edificaciones' OR uso ILIKE 'Frutal de
cáscara-Olivar' OR uso ILIKE 'Forestal' OR uso ILIKE 'Frutal de cáscara' OR
uso ILIKE 'Frutal de cáscara-Viñedo' OR uso ILIKE 'Frutal' OR uso ILIKE
'Improductivo' OR uso ILIKE 'Isla de Olivar' OR uso ILIKE 'Invernaderos y
cultivos bajo plástico' OR uso ILIKE 'Olivar-Cítricos' OR uso ILIKE
'Olivar-Frutal' OR uso ILIKE 'Olivar' OR uso ILIKE 'Pasto arbolado' OR uso
ILIKE 'Pasto arbustivo' OR uso ILIKE 'Pastizal' OR uso ILIKE 'Frutal de
cáscara-Frutal' OR uso ILIKE 'Tierra arable' OR uso ILIKE 'Huerta' OR uso
ILIKE 'Frutal-Viñedo' OR uso ILIKE 'Viñedo' OR uso ILIKE 'Olivar-Viñedo' OR
uso ILIKE 'Zona concentrada' OR uso ILIKE 'Zona urbana' OR uso ILIKE 'Zona
censurada') AND municipio ILIKE 'ARJONA' AND "the_geom" &&
GeometryFromText('LINESTRING(407704.3835591719 4194304.98763638,
413743.07155497797 4194304.98763638, 413743.07155497797 4198636.971734181,
407704.3835591719 4198636.971734181)', 23030)
 INFO [Thread-10] (VectorialUniqueValueLegend.java:737) -* Cannot compare
the values: 5900 - Olivar*
com.hardcode.gdbms.engine.instruction.IncompatibleTypesException
    at
com.hardcode.gdbms.engine.values.NumericValue.equals(NumericValue.java:123)
    at
com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByKey(VectorialUniqueValueLegend.java:733)
    at
com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByValue(VectorialUniqueValueLegend.java:708)
    at
com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByFeature(VectorialUniqueValueLegend.java:326)
    at com.iver.cit.gvsig.fmap.layers.FLyrVect._draw(FLyrVect.java:459)
    at com.iver.cit.gvsig.fmap.layers.FLyrVect.draw(FLyrVect.java:636)
    at
com.iver.cit.gvsig.fmap.DefaultMapContextDrawer.draw(DefaultMapContextDrawer.java:209)
    at
com.iver.cit.gvsig.fmap.DefaultMapContextDrawer.draw(DefaultMapContextDrawer.java:175)
    at com.iver.cit.gvsig.fmap.MapContext.draw(MapContext.java:1097)
    at
com.iver.cit.gvsig.fmap.MapControl$PaintingRequest.paint(MapControl.java:1043)
    at
com.iver.cit.gvsig.fmap.MapControl$Drawer2$Worker.run(MapControl.java:1234)
    at java.lang.Thread.run(Thread.java:619)
 INFO [Thread-10] (VectorialUniqueValueLegend.java:737) - Cannot compare the
values: 5906 - Olivar
com.hardcode.gdbms.engine.instruction.IncompatibleTypesException
    at
com.hardcode.gdbms.engine.values.NumericValue.equals(NumericValue.java:123)
    at
com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByKey(VectorialUniqueValueLegend.java:733)
    at
com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByValue(VectorialUniqueValueLegend.java:708)
    at
com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByFeature(VectorialUniqueValueLegend.java:326)
    at com.iver.cit.gvsig.fmap.layers.FLyrVect._draw(FLyrVect.java:459)
    at com.iver.cit.gvsig.fmap.layers.FLyrVect.draw(FLyrVect.java:636)
    at
com.iver.cit.gvsig.fmap.DefaultMapContextDrawer.draw(DefaultMapContextDrawer.java:209)
    at
com.iver.cit.gvsig.fmap.DefaultMapContextDrawer.draw(DefaultMapContextDrawer.java:175)
    at com.iver.cit.gvsig.fmap.MapContext.draw(MapContext.java:1097)
    at
com.iver.cit.gvsig.fmap.MapControl$PaintingRequest.paint(MapControl.java:1043)
    at
com.iver.cit.gvsig.fmap.MapControl$Drawer2$Worker.run(MapControl.java:1234)
    at java.lang.Thread.run(Thread.java:619)

*Concretamente da el error en la función private ISymbol
getSymbolByKey(Value key), de la clase VectorialUniqueValueLegend
concretamente salta a la excepcion:
 catch (IncompatibleTypesException e) {
                log.info("Cannot compare the values: "+key.toString()+" -
"+entry.getKey().toString(), e);
  }
*
Esto es que no hace bien la comparación. Pues esta comparando un número con
una cadena y por eso da el error también en la clase* NumericValue*,
concretamente en:

public Value equals(Value value) throws IncompatibleTypesException {
        if (value instanceof NullValue) {
            return ValueFactory.createValue(false);
        }

        if (!(value instanceof NumericValue)) {
            throw new IncompatibleTypesException();
        }

        return ValueFactory.createValue(this.doubleValue() ==
((NumericValue) value).doubleValue());
    }

*Tras indagar decidi cambiar mi consulta y cambiar el
dbLayerDef.setFieldID("gid"); por dbLayerDef.setFieldID("uso");, que es el
campo por el cual quiero realizar la leyenda, pero tampoco funciona, me da
error. Esta vez si me pinta la capa tanto en el TOC, como en el mapa, además
puedo ver su tabla asociada, pero al acceder a sus propiedades me da el
siguiente error:*

DEBUG [AWT-EventQueue-1] (NotificationManager.java:104) -
java.lang.NullPointerException
java.lang.NullPointerException
    at
com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getXMLEntity(VectorialUniqueValueLegend.java:348)
    at
com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.cloneLegend(VectorialUniqueValueLegend.java:681)
    at
com.iver.cit.gvsig.project.documents.view.legend.gui.VectorialUniqueValue.setData(VectorialUniqueValue.java:484)
    at
com.iver.cit.gvsig.project.documents.view.legend.gui.LegendManager.setActivePage(LegendManager.java:640)
    at
com.iver.cit.gvsig.project.documents.view.legend.gui.LegendManager.applyLegend(LegendManager.java:823)
    at
com.iver.cit.gvsig.project.documents.view.legend.gui.LegendManager.setModel(LegendManager.java:808)
    at
com.iver.cit.gvsig.project.documents.view.legend.gui.ThemeManagerWindow.initialize(ThemeManagerWindow.java:106)
    at
com.iver.cit.gvsig.project.documents.view.legend.gui.ThemeManagerWindow.<init>(ThemeManagerWindow.java:95)
    at
com.iver.cit.gvsig.project.documents.view.toc.actions.FLyrVectEditPropertiesTocMenuEntry.execute(FLyrVectEditPropertiesTocMenuEntry.java:152)
    at
com.iver.cit.gvsig.project.documents.view.toc.AbstractTocContextMenuAction.execute(AbstractTocContextMenuAction.java:39)
    at
com.iver.cit.gvsig.project.documents.view.toc.gui.FPopupMenu$MenuItem.actionPerformed(FPopupMenu.java:322)
    at
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at
javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at
javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at
javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
    at
javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1170)
    at
javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1211)
    at java.awt.Component.processMouseEvent(Component.java:6038)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
    at java.awt.Component.processEvent(Component.java:5803)
    at java.awt.Container.processEvent(Container.java:2058)
    at java.awt.Component.dispatchEventImpl(Component.java:4410)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
    at java.awt.Container.dispatchEventImpl(Container.java:2102)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at
com.iver.andami.ui.AndamiEventQueue.dispatchEvent(AndamiEventQueue.java:58)
    at
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
 WARN [AWT-EventQueue-1] (PluginServices.java:136) - Plugin com.iver.core --
No se encontró la traducción para Consola de información
 WARN [AWT-EventQueue-1] (PluginServices.java:136) - Plugin com.iver.core --
No se encontró la traducción para Activa la ventana
DEBUG [AWT-EventQueue-1] (NewSkin.java:413) - Activando Consola de
información
DEBUG [AWT-EventQueue-1] (MDIFrame.java:1224) - Memoria usada 78540 KB

*Este error proviene de la clase VectorialUniqueValueLegend concretamente de
la función:
public XMLEntity getXMLEntity() y en concreto en la línea:
xml.putProperty("fieldNames", getClassifyingFieldNames()[0]);
*

Con lo cual pienso que esta modificación mia no es la correcta, la correcta
sería la primera.
Por favor me podrían ayudar. ¿ Por qué el código me funciona en la 1.1 y en
la 1.11, no? ¿Qué ha cambiado?

Un Saludo. Gracias a todos de antemano.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20110817/e96e2ff4/attachment.htm 


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