[Qgis-developer] Rendering single layer from mapcanvas
bonar
bonar_reddevil at yahoo.com
Mon May 25 05:41:45 EDT 2009
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.
More information about the Qgis-developer
mailing list