Hola a todos,<br><br>     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.<b> <br><br>Mi código para cargar de una capa desde la BD es el siguiente:</b><br>
<br>public FLyrVect cargarMapa_Uso(MapControl mapControl, View v,IConnection conex,String nombreTabla,String consulta, String nombreLeyenda) {<br>    <br><br>    vistaMapas = (View) PluginServices.getMDIManager().getActiveWindow();<br>
    mapCtrlMapas = vistaMapas.getMapControl();<br>    DBLayerDefinition dbLayerDef;<br>    <br>    Driver drv;<br>    try {<br>        drv = LayerFactory.getDM().getDriver(&quot;PostGIS JDBC Driver&quot;);<br>    <br>    IVectorialJDBCDriver dbDriver = (IVectorialJDBCDriver) drv;<br>
    <br>    //voy a obener los campos de la tabla<br>    DatabaseMetaData metadataDB;<br>    Connection conexion1 = ((ConnectionJDBC) conex).getConnection();    <br>    //metadataDB = conexion1.getMetaData();<br>                    <br>
     <br>    <br>    <br>        metadataDB = conexion1.getMetaData();<br>        String tipos[] = new String[1];<br>        tipos[0] = &quot;TABLE&quot;;<br>        ResultSet tablas = metadataDB.getTables(null, null, nombreTabla, tipos);<br>
        tablas.next();<br>        String t = tablas.getString(tablas.findColumn( &quot;TABLE_NAME&quot; ));<br>                    <br>        ResultSet columnas = metadataDB.getColumns(null,null,nombreTabla, &quot;%&quot;);<br>
        Vector&lt;String&gt; vcolumnas=new Vector&lt;String&gt;();<br>        int p=0;<br>        while(columnas.next()) {<br>            if (columnas.getString(&quot;Column_Name&quot;).compareTo(&quot;the_geom&quot;) != 0 )<br>
                if (!columnas.getString(&quot;Column_Name&quot;).equals(&quot;the_geom&quot;)) <br>                    vcolumnas.addElement(columnas.getString(&quot;Column_Name&quot;));<br>        <br>        }<br>       <br>
    <br>        /*creamos la definicion para la capa*/<br>        dbLayerDef = new DBLayerDefinition();<br>        dbLayerDef.setCatalogName(nombreBD); //Nombre de la base de datos<br>        dbLayerDef.setSchema(esquema); //Nombre del esquema<br>
        dbLayerDef.setTableName(nombreTabla); //Nombre de la tabla<br>        dbLayerDef.setWhereClause(&quot;where &quot;+consulta);<br><br>        dbLayerDef.setConnection(conex);<br>        String[] fields=new String[vcolumnas.size()];<br>
        for(int i=0; i&lt;vcolumnas.size(); i++){<br>            fields[i]= vcolumnas.get(i);<br>        }<br>        dbLayerDef.setFieldNames(fields);<br>        dbLayerDef.setFieldGeometry(&quot;the_geom&quot;);<br>        dbLayerDef.setFieldID(&quot;gid&quot;);                <br>
    <br><br>        Statement st2;<br>        <br>        <br>            st2 = ((ConnectionJDBC)conex).getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);<br>            ResultSet rsGood2 = st2.executeQuery(&quot;SELECT * FROM &quot; + nombreTabla);                    <br>
            dbDriver.setData(conex, dbLayerDef); <br>            <br>           <br>                try {<br>                    if (dbDriver.getShapeCount()==0){<br>                        JOptionPane.showMessageDialog(null, &quot;No hay resultados para esta consulta&quot;, &quot;Información OleoSIG&quot;, JOptionPane.WARNING_MESSAGE);<br>
                        return null;<br>                    }<br>                    else{<br>                        <br>                    <br>         <br>                            IProjection proj = null;<br>                            <br>
                            <br>                            proj = CRSFactory.getCRS(&quot;EPSG:23030&quot;);        <br>                            FLayer lyr =  LayerFactory.createDBLayer(dbDriver, nombreLeyenda, proj);<br>
                            <br>                            <br>                            /*asignamos proyección a la capa y al ViewPort*/            <br>                            vistaMapas.getMapControl().getViewPort().setProjection(proj);<br>
                            dbLayerDef.setSRID_EPSG(proj.getAbrev());<br>                                                        <br>                            st2.close();<br>      <br>      <br>                           if (lyr != null) {<br>
                               lyr.setVisible(true);<br>                             <br>                               vistaMapas.getMapControl().getMapContext().beginAtomicEvent();<br>                               // Comprobamos si es necesario reproyectar<br>
                               checkProjection(lyr, vistaMapas.getMapControl());<br><br>                               vistaMapas.getMapControl().getMapContext().getLayers().addLayer(lyr);<br>                               vistaMapas.getMapControl().getMapContext().endAtomicEvent();<br>
                           }<br>                           <br>                          <br>                           return (FLyrVect) lyr;<br>   <br>          }<br>                } catch (HeadlessException e) {<br>                    // TODO Auto-generated catch block<br>
                    e.printStackTrace();<br>                    return null;<br>                } catch (ReadDriverException e) {<br>                    // TODO Auto-generated catch block<br>                    e.printStackTrace();<br>
                    return null;<br>                }<br>                    <br>            } catch (DBException e) {<br>                // TODO Auto-generated catch block<br>                e.printStackTrace();<br>                return null;<br>
            }<br>            catch (SQLException e) {<br>            // TODO Auto-generated catch block<br>            e.printStackTrace();<br>            return null;<br>        } catch (DriverLoadException e1) {<br>            // TODO Auto-generated catch block<br>
            e1.printStackTrace();<br>            return null;<br>        }<br>        <br>        <br><br>}              <br><br clear="all"><b>Código donde aplico la leyenda:</b><br>public void leyenda_Uso(FLyrVect capa,String nombreCampo, String nombreMostrar,int r1, int g1, int b1, int r2, int g2, int b2) {<br>
<br>    int k, j;<br><br>                String filterName=nombreCampo;<br><br>                SelectableDataSource dsCaminos;<br>                int numSymbols = 0;<br>                int value;<br>                SymbolTable m_symbolTable=null;<br>
                <br>                int maxValue=3, minValue=1;<br>                 <br>                try {<br>                      m_symbolTable = new SymbolTable(null,&quot;values&quot;,capa.getShapeType());<br>                  } catch (ReadDriverException e1) {<br>
                      // TODO Auto-generated catch block<br>                      e1.printStackTrace();<br>                  }<br><br>                int campo;<br>                int campoMostrar;<br>                <br>
               <br>                try {<br>                     dsCaminos = ((FLyrVect) capa).getRecordset();<br>                     //campo es el numero de columnas de la tabla 20<br>                     campo = dsCaminos.getFieldIndexByName(filterName);<br>
                     // nombreMostrar es el nombre de la columna<br>                     // campoMostrar es 7 el numero de la columna<br>                     <br>                     campoMostrar = dsCaminos.getFieldIndexByName(nombreMostrar); <br>
                <br>                    <br>                     FSymbol myDefaultSymbol=null;<br><br>                      // Creamos el primer y último color.<br>                  <br><br>                     Color startColor = new Color(r1,g1,b1);<br>
                     Color endColor = new Color(r2,g2,b2);<br>                  <br><br>                      VectorialUniqueValueLegend legend = null;<br><br>                      legend = LegendFactory.createVectorialUniqueValueLegend(FShape.POLYGON);<br>
                     // legend.setFieldName(nombreMostrar);<br>                     <br>                      <br>                      <br>                      for (int d = 0; d &lt; dsCaminos.getRowCount(); d++) {<br>                                                        <br>
                         StringValue clave =  (StringValue)dsCaminos.getFieldValue((long)d, (int)campoMostrar);<br>                        <br>                         <br>                          ////Comprobar que no está repetido y no hace falta introducir en el hashtable el campo junto con el simbolo.<br>
                         if (legend.getSymbolByValue(clave) == null) {<br>                              //si no esta creado el simbolo se crea<br>                             <br>                              myDefaultSymbol = new FSymbol(FShape.POLYGON);<br>
                              <br>                              myDefaultSymbol.setDescription(clave.toString());<br>                              legend.addSymbol(clave,  myDefaultSymbol);<br>                                <br>
                              numSymbols++;<br>                             // System.out.println(&quot;------------aquiii54554&quot;);         <br>                              if (numSymbols == 100) {<br>                                  int resp = JOptionPane.showConfirmDialog(null,PluginServices.getText(this, &quot;mas_de_100_simbolos&quot;),<br>
                                          PluginServices.getText(this, &quot;quiere_continuar&quot;),<br>                                          JOptionPane.YES_NO_OPTION,<br>                                          JOptionPane.WARNING_MESSAGE);<br>
<br>                                  if ((resp == JOptionPane.NO_OPTION) ||<br>                                          (resp == JOptionPane.DEFAULT_OPTION)) {<br>                                      return;<br>                                  }<br>
                              }<br>                          }<br>                      } // for<br><br>                      m_symbolTable.fillTableFromSymbolList(legend.getSymbols(),legend.getValues(), legend.getDescriptions());<br>
                      dsCaminos.stop();<br>                      capa.setLegend(legend);<br>                    <br>                    <br>                }catch(NullPointerException e){<br>                    e.printStackTrace();<br>
                }catch (ReadDriverException e) {<br>                    // TODO Auto-generated catch block<br>                    e.printStackTrace();<br>                }catch (LegendLayerException e) {<br>                    // TODO Auto-generated catch block<br>
                    e.printStackTrace();<br>                }<br>                                            <br><br>          <br><br>          }        <br><br> 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 <b>error</b>:<br>
<br>SqlAux getFeatureIterator = SELECT AsEWKB(&quot;the_geom&quot;, &#39;XDR&#39;), gid FROM &quot;public&quot;.&quot;jaen_torredelcampo_oleocampo_aux&quot; where (uso ILIKE &#39;Corrientes y superficies de agua&#39; OR uso ILIKE &#39;Viales&#39; OR uso ILIKE &#39;Cítricos-Frutal&#39; OR uso ILIKE &#39;Cítricos&#39; OR uso ILIKE &#39;Cítricos-Frutal de cáscara&#39; OR uso ILIKE &#39;Cítricos-Viñedo&#39; OR uso ILIKE &#39;Edificaciones&#39; OR uso ILIKE &#39;Frutal de cáscara-Olivar&#39; OR uso ILIKE &#39;Forestal&#39; OR uso ILIKE &#39;Frutal de cáscara&#39; OR uso ILIKE &#39;Frutal de cáscara-Viñedo&#39; OR uso ILIKE &#39;Frutal&#39; OR uso ILIKE &#39;Improductivo&#39; OR uso ILIKE &#39;Isla de Olivar&#39; OR uso ILIKE &#39;Invernaderos y cultivos bajo plástico&#39; OR uso ILIKE &#39;Olivar-Cítricos&#39; OR uso ILIKE &#39;Olivar-Frutal&#39; OR uso ILIKE &#39;Olivar&#39; OR uso ILIKE &#39;Pasto arbolado&#39; OR uso ILIKE &#39;Pasto arbustivo&#39; OR uso ILIKE &#39;Pastizal&#39; OR uso ILIKE &#39;Frutal de cáscara-Frutal&#39; OR uso ILIKE &#39;Tierra arable&#39; OR uso ILIKE &#39;Huerta&#39; OR uso ILIKE &#39;Frutal-Viñedo&#39; OR uso ILIKE &#39;Viñedo&#39; OR uso ILIKE &#39;Olivar-Viñedo&#39; OR uso ILIKE &#39;Zona concentrada&#39; OR uso ILIKE &#39;Zona urbana&#39; OR uso ILIKE &#39;Zona censurada&#39;) AND municipio ILIKE &#39;ARJONA&#39; AND &quot;the_geom&quot; &amp;&amp; GeometryFromText(&#39;LINESTRING(407704.3835591719 4194304.98763638, 413743.07155497797 4194304.98763638, 413743.07155497797 4198636.971734181, 407704.3835591719 4198636.971734181)&#39;, 23030)<br>
 INFO [Thread-10] (VectorialUniqueValueLegend.java:737) -<b> Cannot compare the values: 5900 - Olivar</b><br>com.hardcode.gdbms.engine.instruction.IncompatibleTypesException<br>    at com.hardcode.gdbms.engine.values.NumericValue.equals(NumericValue.java:123)<br>
    at com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByKey(VectorialUniqueValueLegend.java:733)<br>    at com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByValue(VectorialUniqueValueLegend.java:708)<br>
    at com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByFeature(VectorialUniqueValueLegend.java:326)<br>    at com.iver.cit.gvsig.fmap.layers.FLyrVect._draw(FLyrVect.java:459)<br>    at com.iver.cit.gvsig.fmap.layers.FLyrVect.draw(FLyrVect.java:636)<br>
    at com.iver.cit.gvsig.fmap.DefaultMapContextDrawer.draw(DefaultMapContextDrawer.java:209)<br>    at com.iver.cit.gvsig.fmap.DefaultMapContextDrawer.draw(DefaultMapContextDrawer.java:175)<br>    at com.iver.cit.gvsig.fmap.MapContext.draw(MapContext.java:1097)<br>
    at com.iver.cit.gvsig.fmap.MapControl$PaintingRequest.paint(MapControl.java:1043)<br>    at com.iver.cit.gvsig.fmap.MapControl$Drawer2$Worker.run(MapControl.java:1234)<br>    at java.lang.Thread.run(Thread.java:619)<br>
 INFO [Thread-10] (VectorialUniqueValueLegend.java:737) - Cannot compare the values: 5906 - Olivar<br>com.hardcode.gdbms.engine.instruction.IncompatibleTypesException<br>    at com.hardcode.gdbms.engine.values.NumericValue.equals(NumericValue.java:123)<br>
    at com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByKey(VectorialUniqueValueLegend.java:733)<br>    at com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByValue(VectorialUniqueValueLegend.java:708)<br>
    at com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getSymbolByFeature(VectorialUniqueValueLegend.java:326)<br>    at com.iver.cit.gvsig.fmap.layers.FLyrVect._draw(FLyrVect.java:459)<br>    at com.iver.cit.gvsig.fmap.layers.FLyrVect.draw(FLyrVect.java:636)<br>
    at com.iver.cit.gvsig.fmap.DefaultMapContextDrawer.draw(DefaultMapContextDrawer.java:209)<br>    at com.iver.cit.gvsig.fmap.DefaultMapContextDrawer.draw(DefaultMapContextDrawer.java:175)<br>    at com.iver.cit.gvsig.fmap.MapContext.draw(MapContext.java:1097)<br>
    at com.iver.cit.gvsig.fmap.MapControl$PaintingRequest.paint(MapControl.java:1043)<br>    at com.iver.cit.gvsig.fmap.MapControl$Drawer2$Worker.run(MapControl.java:1234)<br>    at java.lang.Thread.run(Thread.java:619)<br>
<br><b>Concretamente da el error en la función private ISymbol getSymbolByKey(Value key), de la clase VectorialUniqueValueLegend  concretamente salta a la excepcion:<br> catch (IncompatibleTypesException e) {<br>                <a href="http://log.info">log.info</a>(&quot;Cannot compare the values: &quot;+key.toString()+&quot; - &quot;+entry.getKey().toString(), e);<br>
  }<br></b><br>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<b> NumericValue</b>, concretamente en:<br><br>public Value equals(Value value) throws IncompatibleTypesException {<br>
        if (value instanceof NullValue) {<br>            return ValueFactory.createValue(false);<br>        }<br><br>        if (!(value instanceof NumericValue)) {<br>            throw new IncompatibleTypesException();<br>
        }<br><br>        return ValueFactory.createValue(this.doubleValue() == ((NumericValue) value).doubleValue());<br>    }<br><br><b>Tras indagar decidi cambiar mi consulta y cambiar el dbLayerDef.setFieldID(&quot;gid&quot;); por dbLayerDef.setFieldID(&quot;uso&quot;);, 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:</b><br>
<br>DEBUG [AWT-EventQueue-1] (NotificationManager.java:104) - java.lang.NullPointerException<br>java.lang.NullPointerException<br>    at com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.getXMLEntity(VectorialUniqueValueLegend.java:348)<br>
    at com.iver.cit.gvsig.fmap.rendering.VectorialUniqueValueLegend.cloneLegend(VectorialUniqueValueLegend.java:681)<br>    at com.iver.cit.gvsig.project.documents.view.legend.gui.VectorialUniqueValue.setData(VectorialUniqueValue.java:484)<br>
    at com.iver.cit.gvsig.project.documents.view.legend.gui.LegendManager.setActivePage(LegendManager.java:640)<br>    at com.iver.cit.gvsig.project.documents.view.legend.gui.LegendManager.applyLegend(LegendManager.java:823)<br>
    at com.iver.cit.gvsig.project.documents.view.legend.gui.LegendManager.setModel(LegendManager.java:808)<br>    at com.iver.cit.gvsig.project.documents.view.legend.gui.ThemeManagerWindow.initialize(ThemeManagerWindow.java:106)<br>
    at com.iver.cit.gvsig.project.documents.view.legend.gui.ThemeManagerWindow.&lt;init&gt;(ThemeManagerWindow.java:95)<br>    at com.iver.cit.gvsig.project.documents.view.toc.actions.FLyrVectEditPropertiesTocMenuEntry.execute(FLyrVectEditPropertiesTocMenuEntry.java:152)<br>
    at com.iver.cit.gvsig.project.documents.view.toc.AbstractTocContextMenuAction.execute(AbstractTocContextMenuAction.java:39)<br>    at com.iver.cit.gvsig.project.documents.view.toc.gui.FPopupMenu$MenuItem.actionPerformed(FPopupMenu.java:322)<br>
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)<br>    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)<br>    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)<br>
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)<br>    at javax.swing.AbstractButton.doClick(AbstractButton.java:357)<br>    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1170)<br>
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1211)<br>    at java.awt.Component.processMouseEvent(Component.java:6038)<br>    at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)<br>
    at java.awt.Component.processEvent(Component.java:5803)<br>    at java.awt.Container.processEvent(Container.java:2058)<br>    at java.awt.Component.dispatchEventImpl(Component.java:4410)<br>    at java.awt.Container.dispatchEventImpl(Container.java:2116)<br>
    at java.awt.Component.dispatchEvent(Component.java:4240)<br>    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)<br>    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)<br>
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)<br>    at java.awt.Container.dispatchEventImpl(Container.java:2102)<br>    at java.awt.Component.dispatchEvent(Component.java:4240)<br>    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)<br>
    at com.iver.andami.ui.AndamiEventQueue.dispatchEvent(AndamiEventQueue.java:58)<br>    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)<br>    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)<br>
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)<br>    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)<br>    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)<br>
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)<br> WARN [AWT-EventQueue-1] (PluginServices.java:136) - Plugin com.iver.core -- No se encontró la traducción para Consola de información<br> WARN [AWT-EventQueue-1] (PluginServices.java:136) - Plugin com.iver.core -- No se encontró la traducción para Activa la ventana<br>
DEBUG [AWT-EventQueue-1] (NewSkin.java:413) - Activando Consola de información<br>DEBUG [AWT-EventQueue-1] (MDIFrame.java:1224) - Memoria usada 78540 KB<br><br><b>Este error proviene de la clase VectorialUniqueValueLegend concretamente de la función:<br>
public XMLEntity getXMLEntity() y en concreto en la línea:         xml.putProperty(&quot;fieldNames&quot;, getClassifyingFieldNames()[0]);<br></b><br><br>Con lo cual pienso que esta modificación mia no es la correcta, la correcta sería la primera.<br>
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?<br><br>Un Saludo. Gracias a todos de antemano.<br>