AW: AW: [Qgis-developer] Rendering single layer from mapcanvas
ashjas
ashjas at gmail.com
Sat Jul 11 10:53:04 EDT 2009
Hi Marco...
Thanks for your inputs...
Regards,
Ashish
Hugentobler Marco wrote:
>
> Hi Ashish
>
> To answer your questiones: the proposed solution was only meant for the
> display of a layer that is regularly updated. As you noted, it is only put
> on top of the map and it does not integrate with the legend and the normal
> tools. I think for this it would need support for updated layers
> implemented in the gui/app classes.
> But even with my described plugin solution you could implement your own
> tools that work on the separate updated layer also in your plugin.
>
> As updating a layer without repainting the others is a frequently asked
> question, I wrote once an (intentionally simple) example plugin that adds
> an independent layer on top of the QGIS map. You may download it from
> http://karlinapp.ethz.ch/updatelayer.tgz
> But what I described is only one possible solution, there may be many
> others.
>
> Regards,
> Marco
>
> -----Ursprüngliche Nachricht-----
> Von: qgis-developer-bounces at lists.osgeo.org im Auftrag von ashjas
> Gesendet: Do 09.07.2009 20:05
> An: qgis-developer at lists.osgeo.org
> Betreff: Re: AW: [Qgis-developer] Rendering single layer from mapcanvas
>
>
> Hi Marco,
>
> My requirement is also similar to what this post asks...
>
> There are some doubts about ur method...please see if u can find time to
> answer these..
>
> would I be able to use all the mapTools like selection,identification etc
> on
> the layer that i need to update constantly
> by using your method (apart the normal static layers..)??
>
> and can i add this live layer on to the legend and also set its symbology
> from the layer property dialog box?
>
> and i have a doubt about what u said .."In this subclass you need to
> create
> a QgsVectorLayer.." so u mean that this subclass should have a
> QgsVectorlayer object (or as many as the need may be for live layers) on
> which i keep adding the live objects...and within this subclass i call the
> paint method which will draw the objects??
> and i guess i have to keep the same reference to the only Qgsmapcanvas
> object for this subclass aswell as the objects are to be drawn only on the
> mainCanvas.. and what about maprenderer object??should it be also the same
> object as for the main layers??
> and about implementing the paint method.. in short i would be calling the
> drawFeature of the QgsVectorLayer Class(for all the features on the layer
> )
> from within the paint function that would be custom implemented.. is it?
>
> Please enlighten me..
>
> Thanks for finding time and helping us.. :)
>
> Best Regards.
>
> Ashish
>
>
> Hugentobler Marco wrote:
>>
>> Hi Bonar
>>
>> QGIS renders the map into one image canvas item (QgsMapCanvasMap).
>> Currently, it is not possible to refresh only one layer in this item.
>> However, it is possible to render the content of the three layers that
>> stay constant into a QgsMapCanvasMap (as you do now with all the four
>> layers). For the layer that changes you could create a new canvas item
>> (as
>> a new subclass of QgsMapCanvasItem). In this subclass you need to create
>> a
>> QgsVectorLayer configured with your database instance . Then you could
>> implement the paint method, there query all the features inside the view
>> extent, use the transformation methods of QgsMapCanvasItem
>> (toCanvasCoordinates()) and finally use QPainter to draw the objects as
>> you want. Important is that the new item has the same size as the
>> mapcanvas and also a transparent background such that you may see the
>> content of the other three background layers.
>>
>> If then something in the datasource changes, you update your item class
>> and only the item with one layer is repainted. The background with the
>> three other layers stays the same.
>>
>>
>> Regards,
>> Marco
>>
>>
>>
>>
>> -----Ursprüngliche Nachricht-----
>> Von: qgis-developer-bounces at lists.osgeo.org im Auftrag von bonar
>> Gesendet: Mo 25.05.2009 11:41
>> An: qgis-developer at lists.osgeo.org
>> Betreff: [Qgis-developer] Rendering single layer from mapcanvas
>>
>>
>> Hi guys, Tim & Dr.Marco
>>
>> I was tried to display real-time data in my mapcanvas. In my mapcanvas, i
>> have 4 layer, but i juz want to refresh 1 layer only(this layer retrieve
>> data from PostGis) from the mapcanvas without refreshing all layer in the
>> mapcanvas. I already searching from this forum and Google it, and the
>> result
>> is i should use QgsMapCanvasItem that have that capabilities to rendering
>> single layer without refreshing mapcanvas. But, i don't know how to
>> implement it in my application. I'm using sample application from Mr.Tim
>> Sutton, it is a great tutorial for a beginner like me, and i think its
>> better to include the code in here. This is what i already done:
>>
>>
>> //Setting my layer
>>
>> mpMapCanvas= new QgsMapCanvas(0, 0);
>> mpMapCanvas->enableAntiAliasing(true);
>> mpMapCanvas->useImageToRender(true);
>> mpMapCanvas->setCanvasColor(QColor(255, 255, 255));
>> mpMapCanvas->freeze(false);
>> mpMapCanvas->setVisible(true);
>>
>> QString myLayerPathNegeri = LAYERPATH() + "klkv_state.shp";
>> QString myLayerBaseNameNegeri = "klkv_state";
>> QString myProviderName = "ogr";
>>
>> QString myLayerPathDistrict = LAYERPATH() +
>> "klkv_district.shp";
>> QString myLayerBaseNameDistrict = "klkv_district";
>>
>> QString myLayerPathMukim = LAYERPATH() + "klkv_mukim.shp";
>> QString myLayerBaseNameMukim = "klkv_mukim";
>>
>> QString myLayerPathPoi = "location_poi";
>> QString myLayerBaseNamePoi = "location_poi";
>>
>> QgsVectorLayer * mypLayerNegeri = new QgsVectorLayer(myLayerPathNegeri,
>> myLayerBaseNameNegeri, myProviderName);
>>
>> QgsVectorLayer * mypLayerDistrict = new
>> QgsVectorLayer(myLayerPathDistrict, myLayerBaseNameDistrict,
>> myProviderName);
>>
>> QgsVectorLayer * mypLayerMukim = new QgsVectorLayer(myLayerPathMukim,
>> myLayerBaseNameMukim, myProviderName);
>>
>> QgsVectorLayer * mypLayerPoi = new
>> QgsVectorLayer(POSTGIS_LAYER_SETUP_INCIDENT_POI_FUNC(),
>> myLayerBaseNamePoi,
>> "postgres");
>>
>>
>> QgsSingleSymbolRenderer *mypRendererNegeri = new
>> QgsSingleSymbolRenderer(mypLayerNegeri->geometryType());
>> QList<QgsMapCanvasLayer> myLayerSet;
>> mypLayerNegeri->setRenderer(mypRendererNegeri);
>>
>> QgsSingleSymbolRenderer *mypRendererDistrict = new
>> QgsSingleSymbolRenderer(mypLayerDistrict->geometryType());
>> mypLayerDistrict->setRenderer(mypRendererDistrict);
>>
>> QgsSingleSymbolRenderer *mypRendererMukim = new
>> QgsSingleSymbolRenderer(mypLayerMukim->geometryType());
>> mypLayerMukim->setRenderer(mypRendererMukim);
>>
>>
>> QgsSingleSymbolRenderer *mypRendererPoi = new
>> QgsSingleSymbolRenderer(mypLayerPoi->geometryType());
>> mypLayerPoi->setRenderer(mypRendererPoi);
>>
>>
>> QgsMapLayerRegistry::instance()->addMapLayer(mypLayerNegeri, TRUE);
>> QgsMapLayerRegistry::instance()->addMapLayer(mypLayerDistrict, TRUE);
>> QgsMapLayerRegistry::instance()->addMapLayer(mypLayerMukim, TRUE);
>> QgsMapLayerRegistry::instance()->addMapLayer(mypLayerPoi, TRUE);
>>
>> myLayerSet.append(QgsMapCanvasLayer(mypLayerPoi));
>> myLayerSet.append(QgsMapCanvasLayer(mypLayerMukim));
>> myLayerSet.append(QgsMapCanvasLayer(mypLayerDistrict));
>> myLayerSet.append(QgsMapCanvasLayer(mypLayerNegeri));
>>
>> mpMapCanvas->setLayerSet(myLayerSet);
>>
>>
>> //I make a Qtimer to check if any update position for mypLayerPoi from
>> updatingLocationPoiLayer() function
>>
>> QTimer *timerPoiRenderer = new QTimer(this);
>> connect(timerPoiRenderer, SIGNAL(timeout()), this,
>> SLOT(updatingLocationPoiLayer()));
>> timerPoiRenderer->start(10 * 1000);// 10 seconds
>>
>>
>> //this is how i tried to using QgsMapCanvasItem, sorry for the code
>> because
>> i am beginner for this QGis, so i juz try to play-around with the
>> QgsMapCanvasItem code .
>>
>> void MyMain::updatingLocationPoiLayer()
>> {
>>
>> QGraphicsScene *mScene = new QGraphicsScene();
>> QgsMapCanvasMap* mMap = new QgsMapCanvasMap(mpMapCanvas);
>> mScene->addItem( mMap );
>> mScene->update();
>> QList<QGraphicsItem*> list = mScene->items();
>> QList<QGraphicsItem*>::iterator it = list.begin();
>>
>> while ( it != list.end() ){
>> QgsMapCanvasItem* item = dynamic_cast<QgsMapCanvasItem*>( *it
>> );
>>
>> if(item){
>> item->updatePosition();
>> QMessageBox::information( this, tr( "TEST" ), tr(
>> "Update
>> rendering" ) );
>> }else{
>> //it will goes here.
>> QMessageBox::information( this, tr( "TEST" ), tr( "NOT
>> Update rendering" ) );
>> }
>>
>> it++;
>> }
>> }
>>
>> from my reading,what i understand is i should use
>> QgsMapCanvasItem::updatePosition() to make my mapcanvas look like
>> real-time.
>> Is it true? And i really hope you guys can teach me about how to
>> implement
>> it in my code.
>>
>>
>> Thanks in advance,
>> Bonar
>> --
>> View this message in context:
>> http://n2.nabble.com/Rendering-single-layer-from-mapcanvas-tp2968794p2968794.html
>> Sent from the qgis-developer mailing list archive at Nabble.com.
>>
>> _______________________________________________
>> Qgis-developer mailing list
>> Qgis-developer at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/qgis-developer
>>
>> _______________________________________________
>> Qgis-developer mailing list
>> Qgis-developer at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/qgis-developer
>>
>>
>
> --
> View this message in context:
> http://n2.nabble.com/Rendering-single-layer-from-mapcanvas-tp2968794p3233143.html
> Sent from the qgis-developer mailing list archive at Nabble.com.
> _______________________________________________
> Qgis-developer mailing list
> Qgis-developer at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/qgis-developer
>
> _______________________________________________
> Qgis-developer mailing list
> Qgis-developer at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/qgis-developer
>
>
--
View this message in context: http://n2.nabble.com/Rendering-single-layer-from-mapcanvas-tp2968794p3242653.html
Sent from the qgis-developer mailing list archive at Nabble.com.
More information about the Qgis-developer
mailing list