[Gvsig_desarrolladores] Actualizar un solo layer sin redibujar elresto

Jorge Sanz jsanz en prodevelop.es
Vie Dic 28 09:27:49 CET 2007


Hola,

 

No te puedo ayudar en cuanto al GraphicsLayer que te comenta Fran ya que nunca lo he usado, pero sí que quería comentarte acerca del driver geoRSS. Casi me da apuro que lo uses porque lo pensé como un prototipo o prueba de concepto, y me consta que en futuras versiones de gvSIG habrá un soporte "serio" de este formato.

 

Bueno, sólo un comentario, supongo que te habrás dado cuenta (lo comenté en el blog), pero cuando cargas una capa geoRSS y te acercas, los elementos desaparecen. Mirando el código que envías ese error debe de seguir ocurriéndote. El caso es que en el driver hay que sobreescribir el método getShapeBounds de la interfaz BoundedShapes. 

 

Este método con puntos y en coordenadas geográficas parece que falla a veces (no sé si se ha resuelto en la 1.1.1). Debes sobrescribirlo y devolver un Rectangle2D que se encuentre centrado en la geometría y con un ancho > 0

 

Espero sirva de ayuda.

 

Un saludo y ya nos contarás como te ha ido ¿no?

--

Jorge Gaspar Sanz Salinas

Ingeniero en Geodesia y Cartografía

Prodevelop S.L. - Valencia - España

Tlf.:  96.351.06.12 - Fax:   96.351.09.68 

jsanz[en]prodevelop[punto]es

http://www.prodevelop.es

 

De: gvsig_desarrolladores-bounces en runas.cap.gva.es [mailto:gvsig_desarrolladores-bounces en runas.cap.gva.es] En nombre de Francisco SC
Enviado el: jueves, 27 de diciembre de 2007 17:42
Para: Lista de Desarrolladores de gvSIG
Asunto: Re: [Gvsig_desarrolladores] Actualizar un solo layer sin redibujar elresto

 

Que tal Fran, muchas gracias por la ayuda y por supuesto no hay problema con el "Panchazo" ya que asì me llaman acá en el trabajo ;)

Estuve viendo la porción de código que me pasaste y lamentablemente excede lo que he aprendido de la documentación que hay dando vueltas en la red, en el sitio de gvSig y de los propios posts de esta lista de desarrolladores. Por lo que paso a comentar de manera más clara lo que hago a ver si me pueden orientar un poco más. 

Yo estoy modificando el plugin que lee feeds RSS con posicionamiento para enviarle a través de este formato la ubicación de los móviles. Entonces por un lado tengo un layer que cargo de manera manual (usando el menú del gvSig) con un mapa de argentina y por otro lado a través del plugin leo el feed en un thread y genero un GeoRSSLayer que extiende de FLyrVect (asì estaba hecho el plugin q estoy modificando). Si es la primera vez qu ese carga el layer lo agrego al conjunto de layers existentes, de lo contrario reemplazo el viejo con el nuevo. Tras hacer esto se redibuja todo y no solo el layer que estoy cambiando lo que genera un parpadeo al ponerse el mapa totalmente en blanco y luego pintarse. 

En el método excecute de la clase del plugin disparo el Thread de la siguiente manera:

iwin = PluginServices.getMDIManager().getActiveWindow();
feed = JOptionPane.showInputDialog((Component) PluginServices 
                    .getMainFrame(), PluginServices.getText(this,
                    "input_georss_layer"));

Runnable miRunnable = new DrawLayerThread(iwin,feed);
Thread thread = new Thread(miRunnable); 
thread.start();

La clase DeawLayerThread que es donde se encuentra el meollo de la cuestión es la que adjunto en el presente mail junto con la del layer y el driver rss.

Pido disculpas si la situación que planteo es muy trivial pero realmente no he podido dar en la tecla por mi mismo. 
Muchas gracias nuevamente,

Francisco
Córdoba, Argentina

El día 27/12/07, Francisco José Peñarrubia < fpenarru en gmail.com <mailto:fpenarru en gmail.com> > escribió:

Hola Panchazo (lo siento, no he podido evitarlo, no te molestes ;-). 

Mejor intenta utilizar la clase GraphicLayer.java para ese tipo de
cosas. Y usa el método drawGraphics() del mapControl para evitar el
refresco indeseado.
Un pequeño ejemplo:


            // Prueba de graficos 
            theImgObserver = new MyImageObserver(m_MapControl);

            GraphicLayer lyr =
m_MapControl.getMapContext().getGraphicsLayer();
            lyr.clearAllGraphics();
            lyr.clearSymbolsGraphics ();

            FSymbol theSymbol = new FSymbol(FConstant.SYMBOL_TYPE_POINT);
            File fIcon = new File("d:/sonic.gif");
            theSymbol.setSizeInPixels(true);

            theSymbol.setIconURI (fIcon.toURI());
            theSymbol.setSize(theSymbol.getIcon().getHeight(null));

            theSymbol.setStyle(FConstant.SYMBOL_STYLE_MARKER_IMAGEN);
            theSymbol.setImgObserver(theImgObserver); 

            int idSymbol = lyr.addSymbol(theSymbol);
            IGeometry geom = ShapeFactory.createPoint2D(500000, 4499980);
            FGraphic theGraphic = new FGraphic(geom, idSymbol);
            lyr.addGraphic (theGraphic);
            FGraphicLabel theLabel = new FGraphicLabel(geom, idSymbol,
                    "Hola colega");
            // lyr.addGraphic(theLabel);
            m_MapControl.drawGraphics(); 

Otra posible solución sería marcar la capa para que cachee la imagen
anterior a su dibujado, pero no estoy seguro de que eso te funcione
bien. De todas formas, miralo por si acaso:

FLayer.setCachingDrawnLayers (boolean bCacheDrawnLayers); (El método
viene documentado en las fuentes).

Saludos, y suerte.

Fran.
gvSIG team.


Francisco SC escribió:
> Que tal, antes que nada saludos a todos ya que soy nuevo en el 
> desarrollo de gvSig.
>
> Llendo al punto, estoy desarrollando un plugin para hacer rastreo de
> flotas que lee feeds geoRSS a partir del plugin de
> http://geomaticblog.net/gb2/es/2007-08-15-georss_gvsig_%282a_parte%29 .
>
> El punto es que cada X tiempo necesito tomar el layer donde estan los
> íconos que representan los vehìculos y actualizarlo con las nuevas 
> ubicaciones. Pero sucede que cuando tomo el layer, lo borro y vuelvo a
> agregar el actualizado TODOS los layers desaparecen una fraccion de
> segundo y se redibujan generando un parpadeo del mapa que resulta ser 
> muy molesto. De más está señalar que todo esto corre en un thread
> independiente.
>
> El còdigo que uso actualmente para eliminar el layer "viejo" y agregar
> el actualizado es: 
>
>         MapContext mapcontext = ((View)
> iwin).getMapControl().getMapContext();
>
>         FLayer lyrTemp = mapcontext.getLayers().getLayer(layer.getName());
>
>         if (lyrTemp != null) 
>             mapcontext.getLayers().removeLayer(lyrTemp);
>
>         if (!layer.isVisible())
>             layer.setVisible(true);
>
>         mapcontext.getLayers().addLayer(layer); 
>
> Desde ya muchas gracias y feliz año nuevo para todos.
>
> Francisco Sanchez Clariá
> Córdoba, Argentina.
> ------------------------------------------------------------------------
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en runas.cap.gva.es
> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>

_______________________________________________
gvSIG_desarrolladores mailing list
gvSIG_desarrolladores en runas.cap.gva.es
http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores

 

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://runas.cap.gva.es/pipermail/gvsig_desarrolladores/attachments/20071228/c929b265/attachment.htm


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