void QgsComposerLegendWidget::updateLegend() { if ( mLegend ) { mLegend->beginCommand( tr( "Legend updated" ) ); QgisApp* app = QgisApp::instance(); if ( !app ) { return; } //get layer id list QStringList layerIdList; QgsMapCanvas* canvas = app->mapCanvas(); if ( canvas ) { QgsMapRenderer* renderer = canvas->mapRenderer(); if ( renderer ) { layerIdList = renderer->layerSet(); } } //and also group info QgsAppLegendInterface legendIface( app->legend() ); QList< GroupLayerInfo > groupInfo = legendIface.groupLayerRelationship(); mLegend->model()->setLayerSetAndGroups( layerIdList, groupInfo ); mLegend->endCommand(); } }
void QgsOsgEarthTileSource::initialize( const std::string& referenceURI, const Profile* overrideProfile ) { Q_UNUSED( referenceURI ); Q_UNUSED( overrideProfile ); setProfile( osgEarth::Registry::instance()->getGlobalGeodeticProfile() ); QgsCoordinateReferenceSystem destCRS; destCRS.createFromOgcWmsCrs( GEO_EPSG_CRS_AUTHID ); QgsMapCanvas *c = mQGisIface->mapCanvas(); if ( c->mapSettings().destinationCrs().authid().compare( GEO_EPSG_CRS_AUTHID, Qt::CaseInsensitive ) != 0 ) { // FIXME: crs from canvas or first layer? QgsCoordinateReferenceSystem srcCRS( c->mapSettings().destinationCrs() ); QgsDebugMsg( QString( "transforming from %1 to %2" ).arg( srcCRS.authid() ).arg( destCRS.authid() ) ); mCoordTransform = new QgsCoordinateTransform( srcCRS, destCRS ); } else { mCoordTransform = 0; } #ifdef USE_RENDERER mMapRenderer = new QgsMapRenderer(); mMapRenderer->setDestinationCrs( destCRS ); mMapRenderer->setProjectionsEnabled( true ); mMapRenderer->setOutputUnits( c->mapRenderer()->outputUnits() ); mMapRenderer->setMapUnits( QGis::Degrees ); #else mMapSettings.setDestinationCrs( destCRS ); mMapSettings.setCrsTransformEnabled( true ); mMapSettings.setMapUnits( QGis::Degrees ); #endif }
void GlobePlugin::syncExtent() { QgsMapCanvas* mapCanvas = mQGisIface->mapCanvas(); QgsMapRenderer* mapRenderer = mapCanvas->mapRenderer(); QgsRectangle extent = mapCanvas->extent(); osgEarth::Util::EarthManipulator* manip = dynamic_cast<osgEarth::Util::EarthManipulator*>( mOsgViewer->getCameraManipulator() ); //rotate earth to north and perpendicular to camera manip->setRotation( osg::Quat() ); QgsDistanceArea dist; dist.setSourceCrs( mapRenderer->destinationCrs().srsid() ); dist.setEllipsoidalMode( mapRenderer->hasCrsTransformEnabled() ); dist.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); QgsPoint ll = QgsPoint( extent.xMinimum(), extent.yMinimum() ); QgsPoint ul = QgsPoint( extent.xMinimum(), extent.yMaximum() ); double height = dist.measureLine( ll, ul ); //camera viewing angle double viewAngle = 30; //camera distance double distance = height / tan( viewAngle * osg::PI / 180 ); //c = b*cotan(B(rad)) OE_NOTICE << "map extent: " << height << " camera distance: " << distance << std::endl; osgEarth::Util::Viewpoint viewpoint( osg::Vec3d( extent.center().x(), extent.center().y(), 0.0 ), 0.0, -90.0, distance ); manip->setViewpoint( viewpoint, 4.0 ); }
bool QgsDecorationNorthArrow::calculateNorthDirection() { QgsMapCanvas* mapCanvas = QgisApp::instance()->mapCanvas(); bool goodDirn = false; if ( mapCanvas->layerCount() > 0 ) { QgsCoordinateReferenceSystem outputCRS = mapCanvas->mapRenderer()->destinationCrs(); if ( outputCRS.isValid() && !outputCRS.geographicFlag() ) { // Use a geographic CRS to get lat/long to work out direction QgsCoordinateReferenceSystem ourCRS; ourCRS.createFromOgcWmsCrs( GEO_EPSG_CRS_AUTHID ); assert( ourCRS.isValid() ); QgsCoordinateTransform transform( outputCRS, ourCRS ); QgsRectangle extent = mapCanvas->extent(); QgsPoint p1( extent.center() ); // A point a bit above p1. XXX assumes that y increases up!! // May need to involve the maptopixel transform if this proves // to be a problem. QgsPoint p2( p1.x(), p1.y() + extent.height() * 0.25 ); // project p1 and p2 to geographic coords try { p1 = transform.transform( p1 ); p2 = transform.transform( p2 ); } catch ( QgsCsException &e ) { Q_UNUSED( e ); // just give up QgsDebugMsg( "North Arrow: Transformation error, quitting" ); return false; } // Work out the value of the initial heading one takes to go // from point p1 to point p2. The north direction is then that // many degrees anti-clockwise or vertical. // Take some care to not divide by zero, etc, and ensure that we // get sensible results for all possible values for p1 and p2. goodDirn = true; double angle = 0.0; // convert to radians for the equations below p1.multiply( PI / 180.0 ); p2.multiply( PI / 180.0 ); double y = sin( p2.x() - p1.x() ) * cos( p2.y() ); double x = cos( p1.y() ) * sin( p2.y() ) - sin( p1.y() ) * cos( p2.y() ) * cos( p2.x() - p1.x() ); if ( y > 0.0 ) { if ( x > TOL ) angle = atan( y / x ); else if ( x < -TOL ) angle = PI - atan( -y / x ); else angle = 0.5 * PI; } else if ( y < 0.0 ) { if ( x > TOL ) angle = -atan( -y / x ); else if ( x < -TOL ) angle = atan( y / x ) - PI; else angle = 1.5 * PI; } else { if ( x > TOL ) angle = 0.0; else if ( x < -TOL ) angle = PI; else { angle = 0.0; // p1 = p2 goodDirn = false; } } // And set the angle of the north arrow. Perhaps do something // different if goodDirn = false. mRotationInt = static_cast<int>( round( fmod( 360.0 - angle * 180.0 / PI, 360.0 ) ) ); } else { // For geographic CRS and for when there are no layers, set the // direction back to the default mRotationInt = 0; } } return goodDirn; }