'reload' a layer

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

'reload' a layer

Carson Farmer
Hi list, does anyone know of a clever way to (programmatically) reload
a layer without actually removing it and re-adding it to the layer
list. Some context: I have a layer that sometimes gets updated by an
external application, and I want to be able to 'refresh' the layer
from the Python console to reflect these changes (new features,
deleted features, new attributes, etc.). I *could* simply load the
layer again, but I'm hoping there is a more efficient way to do this
(also I want to keep the current styling, layer order, unique layer
id, etc).

Any thoughts/ideas? Note: assume we are working with a spatialite layer for now.

Carson

--
Dr. Carson J. Q. Farmer
Centre for GeoInformatics (CGI)
School of Geography and Geosciences
Irvine Building, University of St Andrews
St Andrews, Fife, KY16 9AL
Scotland, UK
_______________________________________________
Qgis-developer mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/qgis-developer
Reply | Threaded
Open this post in threaded view
|

Re: 'reload' a layer

giohappy
Do you mean refresh the rendering or synchronizing the layer with the data source?
I usually use QgsMapLayer::reload() for the latter, and QgsMapCanvas::refresh() for the first.

giovanni

2012/5/16 Carson Farmer <[hidden email]>
Hi list, does anyone know of a clever way to (programmatically) reload
a layer without actually removing it and re-adding it to the layer
list. Some context: I have a layer that sometimes gets updated by an
external application, and I want to be able to 'refresh' the layer
from the Python console to reflect these changes (new features,
deleted features, new attributes, etc.). I *could* simply load the
layer again, but I'm hoping there is a more efficient way to do this
(also I want to keep the current styling, layer order, unique layer
id, etc).

Any thoughts/ideas? Note: assume we are working with a spatialite layer for now.

Carson

--
Dr. Carson J. Q. Farmer
Centre for GeoInformatics (CGI)
School of Geography and Geosciences
Irvine Building, University of St Andrews
St Andrews, Fife, KY16 9AL
Scotland, UK
_______________________________________________
Qgis-developer mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/qgis-developer


_______________________________________________
Qgis-developer mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/qgis-developer
Reply | Threaded
Open this post in threaded view
|

Re: 'reload' a layer

Carson Farmer
Hi Giovanni,

Thanks for the tip. To answer your question: I am trying to
synchronise the layer with the datasource. Having said that, I don't
seem to be able to get 'reload' to work. It looks like reload is
reimplemented in QgsVectorLayer, which in turns calls the
dataProvider's reloadData method, so this may vary by provider type? I
tried it with a shapefile and a spatialite layer, and it did not seem
to do anything: I deleted several fields from the shapefile and added
a field to the spatialite layer in an external program, and these
changes were not reflected when I 'reloaded' the layers. Am I missing
something here? Perhaps there is something else needed to get the
changes to 'show up'?

Cheers,

Carson

On Wed, May 16, 2012 at 4:36 PM, G. Allegri <[hidden email]> wrote:

> Do you mean refresh the rendering or synchronizing the layer with the data
> source?
> I usually use QgsMapLayer::reload() for the latter, and
> QgsMapCanvas::refresh() for the first.
>
> giovanni
>
> 2012/5/16 Carson Farmer <[hidden email]>
>>
>> Hi list, does anyone know of a clever way to (programmatically) reload
>> a layer without actually removing it and re-adding it to the layer
>> list. Some context: I have a layer that sometimes gets updated by an
>> external application, and I want to be able to 'refresh' the layer
>> from the Python console to reflect these changes (new features,
>> deleted features, new attributes, etc.). I *could* simply load the
>> layer again, but I'm hoping there is a more efficient way to do this
>> (also I want to keep the current styling, layer order, unique layer
>> id, etc).
>>
>> Any thoughts/ideas? Note: assume we are working with a spatialite layer
>> for now.
>>
>> Carson
>>
>> --
>> Dr. Carson J. Q. Farmer
>> Centre for GeoInformatics (CGI)
>> School of Geography and Geosciences
>> Irvine Building, University of St Andrews
>> St Andrews, Fife, KY16 9AL
>> Scotland, UK
>> _______________________________________________
>> Qgis-developer mailing list
>> [hidden email]
>> http://lists.osgeo.org/mailman/listinfo/qgis-developer
>
>



--
Dr. Carson J. Q. Farmer
Centre for GeoInformatics (CGI)
School of Geography and Geosciences
Irvine Building, University of St Andrews
St Andrews, Fife, KY16 9AL
Scotland, UK
_______________________________________________
Qgis-developer mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/qgis-developer
Reply | Threaded
Open this post in threaded view
|

Re: 'reload' a layer

giohappy
You're right Carson. I used it only with a WFS layer, and in fact I see that WFS is the only providers that implements it.
There would be the setDataProvider method on the vector layer but it's private...

You've raised an important point, that I took for granted :(
I fear that in this moment the only solution is remove it and reload it. 
giovanni


2012/5/17 Carson Farmer <[hidden email]>
Hi Giovanni,

Thanks for the tip. To answer your question: I am trying to
synchronise the layer with the datasource. Having said that, I don't
seem to be able to get 'reload' to work. It looks like reload is
reimplemented in QgsVectorLayer, which in turns calls the
dataProvider's reloadData method, so this may vary by provider type? I
tried it with a shapefile and a spatialite layer, and it did not seem
to do anything: I deleted several fields from the shapefile and added
a field to the spatialite layer in an external program, and these
changes were not reflected when I 'reloaded' the layers. Am I missing
something here? Perhaps there is something else needed to get the
changes to 'show up'?

Cheers,

Carson

On Wed, May 16, 2012 at 4:36 PM, G. Allegri <[hidden email]> wrote:
> Do you mean refresh the rendering or synchronizing the layer with the data
> source?
> I usually use QgsMapLayer::reload() for the latter, and
> QgsMapCanvas::refresh() for the first.
>
> giovanni
>
> 2012/5/16 Carson Farmer <[hidden email]>
>>
>> Hi list, does anyone know of a clever way to (programmatically) reload
>> a layer without actually removing it and re-adding it to the layer
>> list. Some context: I have a layer that sometimes gets updated by an
>> external application, and I want to be able to 'refresh' the layer
>> from the Python console to reflect these changes (new features,
>> deleted features, new attributes, etc.). I *could* simply load the
>> layer again, but I'm hoping there is a more efficient way to do this
>> (also I want to keep the current styling, layer order, unique layer
>> id, etc).
>>
>> Any thoughts/ideas? Note: assume we are working with a spatialite layer
>> for now.
>>
>> Carson
>>
>> --
>> Dr. Carson J. Q. Farmer
>> Centre for GeoInformatics (CGI)
>> School of Geography and Geosciences
>> Irvine Building, University of St Andrews
>> St Andrews, Fife, KY16 9AL
>> Scotland, UK
>> _______________________________________________
>> Qgis-developer mailing list
>> [hidden email]
>> http://lists.osgeo.org/mailman/listinfo/qgis-developer
>
>



--
Dr. Carson J. Q. Farmer
Centre for GeoInformatics (CGI)
School of Geography and Geosciences
Irvine Building, University of St Andrews
St Andrews, Fife, KY16 9AL
Scotland, UK


_______________________________________________
Qgis-developer mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/qgis-developer
Reply | Threaded
Open this post in threaded view
|

Re: 'reload' a layer

Germán Carrillo-2
Hi Carson,

have you tried updateFieldMap() from QgsVectorLayer? I've just had a similar problem with memory layers and it turned out to do the trick.

Regards,

Germán
-----------------------------
[1] http://qgis.org/api/classQgsVectorLayer.html#ae7777703a20367b66ef0200e972f83d1

2012/5/17 G. Allegri <[hidden email]>
You're right Carson. I used it only with a WFS layer, and in fact I see that WFS is the only providers that implements it.
There would be the setDataProvider method on the vector layer but it's private...

You've raised an important point, that I took for granted :(
I fear that in this moment the only solution is remove it and reload it. 
giovanni



2012/5/17 Carson Farmer <[hidden email]>
Hi Giovanni,

Thanks for the tip. To answer your question: I am trying to
synchronise the layer with the datasource. Having said that, I don't
seem to be able to get 'reload' to work. It looks like reload is
reimplemented in QgsVectorLayer, which in turns calls the
dataProvider's reloadData method, so this may vary by provider type? I
tried it with a shapefile and a spatialite layer, and it did not seem
to do anything: I deleted several fields from the shapefile and added
a field to the spatialite layer in an external program, and these
changes were not reflected when I 'reloaded' the layers. Am I missing
something here? Perhaps there is something else needed to get the
changes to 'show up'?

Cheers,

Carson

On Wed, May 16, 2012 at 4:36 PM, G. Allegri <[hidden email]> wrote:
> Do you mean refresh the rendering or synchronizing the layer with the data
> source?
> I usually use QgsMapLayer::reload() for the latter, and
> QgsMapCanvas::refresh() for the first.
>
> giovanni
>
> 2012/5/16 Carson Farmer <[hidden email]>
>>
>> Hi list, does anyone know of a clever way to (programmatically) reload
>> a layer without actually removing it and re-adding it to the layer
>> list. Some context: I have a layer that sometimes gets updated by an
>> external application, and I want to be able to 'refresh' the layer
>> from the Python console to reflect these changes (new features,
>> deleted features, new attributes, etc.). I *could* simply load the
>> layer again, but I'm hoping there is a more efficient way to do this
>> (also I want to keep the current styling, layer order, unique layer
>> id, etc).
>>
>> Any thoughts/ideas? Note: assume we are working with a spatialite layer
>> for now.
>>
>> Carson
>>
>> --
>> Dr. Carson J. Q. Farmer
>> Centre for GeoInformatics (CGI)
>> School of Geography and Geosciences
>> Irvine Building, University of St Andrews
>> St Andrews, Fife, KY16 9AL
>> Scotland, UK
>> _______________________________________________
>> Qgis-developer mailing list
>> [hidden email]
>> http://lists.osgeo.org/mailman/listinfo/qgis-developer
>
>



--
Dr. Carson J. Q. Farmer
Centre for GeoInformatics (CGI)
School of Geography and Geosciences
Irvine Building, University of St Andrews
St Andrews, Fife, KY16 9AL
Scotland, UK


_______________________________________________
Qgis-developer mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/qgis-developer




--
-----------
   |\__ 
(:>__)(
   |/   

Soluciones Geoinformáticas Libres                           
http://geotux.tuxfamily.org/
http://twitter.com/GeoTux2


_______________________________________________
Qgis-developer mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/qgis-developer
Reply | Threaded
Open this post in threaded view
|

Re: 'reload' a layer

Germán Carrillo-2
Hi QGIS devs,


same question here but regarding rasters. I load a GDAL virtual raster that is being overwritten every time a new raster is available in a raster repository. Is there any way of reflecting the layer source updates (changes in the vrt file) in the map?

In a more generic way, I'm attempting to visualize a tile-based raster, from which I cannot get all tiles at once. Do you think it could be possible in QGIS? 

P.S. Loading each tile as a separate layer wouldn't be possible because of performance.


Thanks in advance,

Germán Carrillo


2012/5/21 Germán Carrillo <[hidden email]>
Hi Carson,

have you tried updateFieldMap() from QgsVectorLayer? I've just had a similar problem with memory layers and it turned out to do the trick.

Regards,

Germán
-----------------------------
[1] http://qgis.org/api/classQgsVectorLayer.html#ae7777703a20367b66ef0200e972f83d1

2012/5/17 G. Allegri <[hidden email]>

You're right Carson. I used it only with a WFS layer, and in fact I see that WFS is the only providers that implements it.
There would be the setDataProvider method on the vector layer but it's private...

You've raised an important point, that I took for granted :(
I fear that in this moment the only solution is remove it and reload it. 
giovanni



2012/5/17 Carson Farmer <[hidden email]>
Hi Giovanni,

Thanks for the tip. To answer your question: I am trying to
synchronise the layer with the datasource. Having said that, I don't
seem to be able to get 'reload' to work. It looks like reload is
reimplemented in QgsVectorLayer, which in turns calls the
dataProvider's reloadData method, so this may vary by provider type? I
tried it with a shapefile and a spatialite layer, and it did not seem
to do anything: I deleted several fields from the shapefile and added
a field to the spatialite layer in an external program, and these
changes were not reflected when I 'reloaded' the layers. Am I missing
something here? Perhaps there is something else needed to get the
changes to 'show up'?

Cheers,

Carson

On Wed, May 16, 2012 at 4:36 PM, G. Allegri <[hidden email]> wrote:
> Do you mean refresh the rendering or synchronizing the layer with the data
> source?
> I usually use QgsMapLayer::reload() for the latter, and
> QgsMapCanvas::refresh() for the first.
>
> giovanni
>
> 2012/5/16 Carson Farmer <[hidden email]>
>>
>> Hi list, does anyone know of a clever way to (programmatically) reload
>> a layer without actually removing it and re-adding it to the layer
>> list. Some context: I have a layer that sometimes gets updated by an
>> external application, and I want to be able to 'refresh' the layer
>> from the Python console to reflect these changes (new features,
>> deleted features, new attributes, etc.). I *could* simply load the
>> layer again, but I'm hoping there is a more efficient way to do this
>> (also I want to keep the current styling, layer order, unique layer
>> id, etc).
>>
>> Any thoughts/ideas? Note: assume we are working with a spatialite layer
>> for now.
>>
>> Carson
>>
>> --
>> Dr. Carson J. Q. Farmer
>> Centre for GeoInformatics (CGI)
>> School of Geography and Geosciences
>> Irvine Building, University of St Andrews
>> St Andrews, Fife, KY16 9AL
>> Scotland, UK
>> _______________________________________________
>> Qgis-developer mailing list
>> [hidden email]
>> http://lists.osgeo.org/mailman/listinfo/qgis-developer
>
>



--
Dr. Carson J. Q. Farmer
Centre for GeoInformatics (CGI)
School of Geography and Geosciences
Irvine Building, University of St Andrews
St Andrews, Fife, KY16 9AL
Scotland, UK


_______________________________________________
Qgis-developer mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/qgis-developer




--
-----------
   |\__ 
(:>__)(
   |/   

Soluciones Geoinformáticas Libres                           
http://geotux.tuxfamily.org/
http://twitter.com/GeoTux2


--
-----------
   |\__ 
(:>__)(
   |/   

Soluciones Geoinformáticas Libres                           
http://geotux.tuxfamily.org/
http://twitter.com/GeoTux2


_______________________________________________
Qgis-developer mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/qgis-developer