void QgsMeasureDialog::mouseMove( QgsPoint &point ) { QSettings settings; int decimalPlaces = settings.value( "/qgis/measure/decimalplaces", "3" ).toInt(); // Create QgsDistance Area for customization ProjectionEnabled setting QgsDistanceArea myDa; configureDistanceArea( myDa ); // show current distance/area while moving the point // by creating a temporary copy of point array // and adding moving point at the end if ( mMeasureArea && mTool->points().size() > 1 ) { QList<QgsPoint> tmpPoints = mTool->points(); tmpPoints.append( point ); double area = myDa.measurePolygon( tmpPoints ); editTotal->setText( formatArea( area, decimalPlaces ) ); } else if ( !mMeasureArea && mTool->points().size() > 0 ) { QgsPoint p1( mTool->points().last() ), p2( point ); double d = myDa.measureLine( p1, p2 ); editTotal->setText( formatDistance( mTotal + d, decimalPlaces ) ); QGis::UnitType myDisplayUnits; // Ignore units convertMeasurement( d, myDisplayUnits, false ); QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 ); item->setText( 0, QLocale::system().toString( d, 'f', decimalPlaces ) ); } }
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 ); }
double QgsComposerScaleBar::mapWidth() const { if ( !mComposerMap ) { return 0.0; } QgsRectangle composerMapRect = mComposerMap->extent(); if ( mUnits == MapUnits ) { return composerMapRect.width(); } else { QgsDistanceArea da; da.setEllipsoidalMode( mComposerMap->mapRenderer()->hasCrsTransformEnabled() ); da.setSourceCrs( mComposerMap->mapRenderer()->destinationCrs().srsid() ); da.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", "WGS84" ) ); double measure = da.measureLine( QgsPoint( composerMapRect.xMinimum(), composerMapRect.yMinimum() ), QgsPoint( composerMapRect.xMaximum(), composerMapRect.yMinimum() ) ); if ( mUnits == Feet ) { measure /= 0.3048; } return measure; } }
double QgsComposerScaleBar::mapDiagonal() const { if ( !mComposerMap ) { return 0.0; } QgsRectangle composerMapRect = mComposerMap->extent(); if ( mUnits == MapUnits ) { return sqrt( composerMapRect.width() * composerMapRect.width() + composerMapRect.height() * composerMapRect.height() ); } else { QgsDistanceArea da; da.setProjectionsEnabled( true ); da.setSourceCrs( mComposerMap->mapRenderer()->destinationCrs().srsid() ); QSettings s; da.setEllipsoid( s.value( "/qgis/measure/ellipsoid", "WGS84" ).toString() ); double measure = da.measureLine( QgsPoint( composerMapRect.xMinimum(), composerMapRect.yMaximum() ), QgsPoint( composerMapRect.xMaximum(), composerMapRect.yMinimum() ) ); if ( mUnits == Feet ) { measure /= 0.3048; } return measure; } }
void TestQgsDistanceArea::unit_conversions() { // Do some very simple test of conversion and units QgsDistanceArea myDa; myDa.setEllipsoidalMode( false ); double inputValue; QGis::UnitType inputUnit; QGis::UnitType outputUnit; inputValue = 10000.0; inputUnit = QGis::Meters; outputUnit = QGis::Feet; //outputUnit = QGis::Meters; // First, convert from sq.meter to sq.feet Q_NOWARN_DEPRECATED_PUSH myDa.convertMeasurement( inputValue, inputUnit, outputUnit, true ); Q_NOWARN_DEPRECATED_POP QVERIFY( qAbs( inputValue - 107639.1041671 ) <= 0.0000001 ); // The print a text unit. This is i18n, so we should ignore the unit // and use the locale settings for separation of digits. QString myTxt = QgsDistanceArea::textUnit( inputValue, 7, inputUnit, true, false ); QString expectedTxt = QLocale::system().toString( 2.4710538146717, 'g', 1 + 7 ); QVERIFY( myTxt.startsWith( expectedTxt ) ); // Ignore units for now. }
double QgsComposerScaleBar::mapWidth() const { if ( !mComposerMap ) { return 0.0; } QgsRectangle composerMapRect = *( mComposerMap->currentMapExtent() ); if ( mUnits == MapUnits ) { return composerMapRect.width(); } else { QgsDistanceArea da; da.setEllipsoidalMode( mComposition->mapSettings().hasCrsTransformEnabled() ); da.setSourceCrs( mComposition->mapSettings().destinationCrs().srsid() ); da.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", "WGS84" ) ); double measure = da.measureLine( QgsPoint( composerMapRect.xMinimum(), composerMapRect.yMinimum() ), QgsPoint( composerMapRect.xMaximum(), composerMapRect.yMinimum() ) ); if ( mUnits == QgsComposerScaleBar::Feet ) { measure /= QGis::fromUnitToUnitFactor( QGis::Feet, QGis::Meters ); } else if ( mUnits == QgsComposerScaleBar::NauticalMiles ) { measure /= QGis::fromUnitToUnitFactor( QGis::NauticalMiles, QGis::Meters ); } return measure; } }
void TestQgsDistanceArea::collections() { //test measuring for collections QgsDistanceArea myDa; myDa.setSourceAuthId( "EPSG:4030" ); myDa.setEllipsoidalMode( true ); myDa.setEllipsoid( "WGS84" ); //collection of lines, should be sum of line length QgsGeometry lines( QgsGeometryFactory::geomFromWkt( "GeometryCollection( LineString(0 36.53, 5.76 -48.16), LineString(0 25.54, 24.20 36.70) )" ) ); double result = myDa.measureLength( &lines ); QGSCOMPARENEAR( result, 12006159, 1 ); result = myDa.measureArea( &lines ); QVERIFY( qgsDoubleNear( result, 0 ) ); //collection of polygons QgsGeometry polys( QgsGeometryFactory::geomFromWkt( "GeometryCollection( Polygon((0 36.53, 5.76 -48.16, 0 25.54, 0 36.53)), Polygon((10 20, 15 20, 15 10, 10 20)) )" ) ); result = myDa.measureArea( &polys ); QGSCOMPARENEAR( result, 670434859475LL, 1 ); result = myDa.measureLength( &polys ); QVERIFY( qgsDoubleNear( result, 0 ) ); //mixed collection QgsGeometry mixed( QgsGeometryFactory::geomFromWkt( "GeometryCollection( LineString(0 36.53, 5.76 -48.16), LineString(0 25.54, 24.20 36.70), Polygon((0 36.53, 5.76 -48.16, 0 25.54, 0 36.53)), Polygon((10 20, 15 20, 15 10, 10 20)) )" ) ); //measure area specifically result = myDa.measureArea( &mixed ); QGSCOMPARENEAR( result, 670434859475LL, 1 ); //measure length result = myDa.measureLength( &mixed ); QGSCOMPARENEAR( result, 12006159, 1 ); }
double QgsLayoutItemScaleBar::mapWidth() const { if ( !mMap ) { return 0.0; } QgsRectangle mapExtent = mMap->extent(); if ( mSettings.units() == QgsUnitTypes::DistanceUnknownUnit ) { return mapExtent.width(); } else { QgsDistanceArea da; da.setSourceCrs( mMap->crs(), mLayout->project()->transformContext() ); da.setEllipsoid( mLayout->project()->ellipsoid() ); QgsUnitTypes::DistanceUnit units = da.lengthUnits(); double measure = da.measureLine( QgsPointXY( mapExtent.xMinimum(), mapExtent.yMinimum() ), QgsPointXY( mapExtent.xMaximum(), mapExtent.yMinimum() ) ); measure /= QgsUnitTypes::fromUnitToUnitFactor( mSettings.units(), units ); return measure; } }
QgsAttributeActionPropertiesDialog::QgsAttributeActionPropertiesDialog( QgsVectorLayer* layer, QWidget* parent ) : QDialog( parent ) , mLayer( layer ) { setupUi( this ); // display the expression builder QgsExpressionContext context; context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() << QgsExpressionContextUtils::layerScope( mLayer ); QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); mFieldExpression->setLayer( mLayer ); mFieldExpression->setGeomCalculator( myDa ); connect( mBrowseButton, SIGNAL( clicked( bool ) ), this, SLOT( browse() ) ); connect( mInsertFieldOrExpression, SIGNAL( clicked( bool ) ), this, SLOT( insertExpressionOrField() ) ); connect( mActionName, SIGNAL( textChanged( QString ) ), this, SLOT( updateButtons() ) ); connect( mActionText, SIGNAL( textChanged() ), this, SLOT( updateButtons() ) ); updateButtons(); }
void GlobePlugin::syncExtent() { osgEarth::Util::EarthManipulator* manip = dynamic_cast<osgEarth::Util::EarthManipulator*>( mOsgViewer->getCameraManipulator() ); //rotate earth to north and perpendicular to camera manip->setRotation( osg::Quat() ); //get mapCanvas->extent().height() in meters QgsRectangle extent = mQGisIface->mapCanvas()->extent(); QgsDistanceArea dist; dist.setEllipsoidalMode( true ); //dist.setProjectionsEnabled( true ); 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 ); }
void QgsAttributeActionDialog::insertExpression() { QString selText = actionAction->textCursor().selectedText(); // edit the selected expression if there's one if ( selText.startsWith( "[%" ) && selText.endsWith( "%]" ) ) selText = selText.mid( 2, selText.size() - 4 ); // display the expression builder QgsExpressionContext context; context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() << QgsExpressionContextUtils::layerScope( mActions->layer() ); QgsExpressionBuilderDialog dlg( mActions->layer(), selText, this, "generic", context ); dlg.setWindowTitle( tr( "Insert expression" ) ); QgsDistanceArea myDa; myDa.setSourceCrs( mActions->layer()->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); dlg.setGeomCalculator( myDa ); if ( dlg.exec() == QDialog::Accepted ) { QString expression = dlg.expressionBuilder()->expressionText(); //Only add the expression if the user has entered some text. if ( !expression.isEmpty() ) { actionAction->insertPlainText( "[%" + expression + "%]" ); } } }
void QgsMapToolMeasureAngle::changeProjectionEnabledState() { if ( mAnglePoints.size() != 3 ) return; if ( !mResultDisplay ) return; QgsDistanceArea myDa; configureDistanceArea( myDa ); //angle calculation double azimuthOne = myDa.bearing( mAnglePoints.at( 1 ), mAnglePoints.at( 0 ) ); double azimuthTwo = myDa.bearing( mAnglePoints.at( 1 ), mAnglePoints.at( 2 ) ); double resultAngle = azimuthTwo - azimuthOne; QgsDebugMsg( QString::number( fabs( resultAngle ) ) ); QgsDebugMsg( QString::number( M_PI ) ); if ( fabs( resultAngle ) > M_PI ) { if ( resultAngle < 0 ) { resultAngle = M_PI + ( resultAngle + M_PI ); } else { resultAngle = -M_PI + ( resultAngle - M_PI ); } } mResultDisplay->setValueInRadians( resultAngle ); }
double QgsGeometryAnalyzer::perimeterMeasure( QgsGeometry* geometry, QgsDistanceArea& measure ) { double value = 0.00; if ( geometry->isMultipart() ) { QgsMultiPolygon poly = geometry->asMultiPolygon(); QgsMultiPolygon::iterator it; QgsPolygon::iterator jt; for ( it = poly.begin(); it != poly.end(); ++it ) { for ( jt = it->begin(); jt != it->end(); ++jt ) { value = value + measure.measure( QgsGeometry::fromPolyline( *jt ) ); } } } else { QgsPolygon::iterator jt; QgsPolygon poly = geometry->asPolygon(); for ( jt = poly.begin(); jt != poly.end(); ++jt ) { value = value + measure.measure( QgsGeometry::fromPolyline( *jt ) ); } } return value; }
void QgsMapToolMeasureAngle::configureDistanceArea( QgsDistanceArea& da ) { QSettings settings; QString ellipsoidId = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString(); da.setSourceCrs( mCanvas->mapRenderer()->destinationCrs().srsid() ); da.setEllipsoid( ellipsoidId ); da.setProjectionsEnabled( mResultDisplay->projectionEnabled() ); }
void QgsMeasureDialog::configureDistanceArea( QgsDistanceArea& da ) { QSettings settings; QString ellipsoidId = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString(); da.setSourceCrs( mTool->canvas()->mapRenderer()->destinationCrs().srsid() ); da.setEllipsoid( ellipsoidId ); da.setProjectionsEnabled( mcbProjectionEnabled->isChecked() ); }
void TestQgsDistanceArea::regression13601() { //test regression #13601 QgsDistanceArea calc; calc.setEllipsoidalMode( true ); calc.setEllipsoid( "NONE" ); calc.setSourceCrs( 1108L ); QgsGeometry geom( QgsGeometryFactory::geomFromWkt( "Polygon ((252000 1389000, 265000 1389000, 265000 1385000, 252000 1385000, 252000 1389000))" ) ); QVERIFY( qgsDoubleNear( calc.measureArea( &geom ), 52000000, 0.0001 ) ); }
void TestQgsDistanceArea::emptyPolygon() { QgsDistanceArea da; da.setSourceCrs( 3452 ); da.setEllipsoidalMode( true ); da.setEllipsoid( "WGS84" ); //test that measuring an empty polygon doesn't crash da.measurePolygon( QList< QgsPoint >() ); }
void TestQgsDistanceArea::regression14675() { //test regression #14675 QgsDistanceArea calc; calc.setEllipsoidalMode( true ); calc.setEllipsoid( "GRS80" ); calc.setSourceCrs( 145L ); QgsGeometry geom( QgsGeometryFactory::geomFromWkt( "Polygon ((917593.5791854317067191 6833700.00807378999888897, 917596.43389983859378844 6833700.67099479306489229, 917599.53056440979707986 6833700.78673478215932846, 917593.5791854317067191 6833700.00807378999888897))" ) ); //lots of tolerance here - the formulas get quite unstable with small areas due to division by very small floats QGSCOMPARENEAR( calc.measureArea( &geom ), 0.83301, 0.02 ); }
QDialog* QgisAppInterface::getFeatureForm( QgsVectorLayer *l, QgsFeature &f ) { QgsDistanceArea myDa; myDa.setSourceCrs( l->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() ); myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); QgsAttributeDialog *dialog = new QgsAttributeDialog( l, &f, false, myDa ); return dialog->dialog(); }
void TestQgsDistanceArea::test_distances() { // Read the file of Geod data // Column 0 (first) is latitude point 1 // Column 1 is longitude point 1 // Column 3 is latitude point 2 // Column 4 is longitude point 3 // Column 6 is the resulting distance in meters on the WGS84 ellipsoid // Note: lat is north/south, so the QgsPoint should be ( long, lat ) // See http://geographiclib.sourceforge.net/html/geodesic.html#testgeod // Set up DA QgsDistanceArea myDa; myDa.setSourceAuthId( "EPSG:4030" ); myDa.setEllipsoidalMode( true ); myDa.setEllipsoid( "WGS84" ); QString myFileName = QString( TEST_DATA_DIR ) + "/GeodTest-nano.dat"; QFile myFile( myFileName ); if ( ! myFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) { QFAIL( "Couldn't open file" ); return; } QTextStream in( & myFile ); while ( !in.atEnd() ) { QString line = in.readLine(); // Some test points (antipodal) does not converge with the chosen algorithm! // See calcaulator at http://www.movable-type.co.uk/scripts/latlong-vincenty.html // These are commented out. if ( line[0] != '#' ) { QStringList myLineList = line.split( ' ' ); // Split fields on space. // Create points QgsPoint p1( myLineList[1].toDouble(), myLineList[0].toDouble() ); QgsPoint p2( myLineList[4].toDouble(), myLineList[3].toDouble() ); double result = myDa.measureLine( p1, p2 ); // QgsDebugMsg( QString( "Distance from %1 to %2 is %3" ).arg( p1.toString( 15 ) ).arg( p2.toString( 15 ) ).arg( result, 0, 'g', 15 ) ); // QgsDebugMsg( QString( "Distance should be %1" ).arg( myLineList[6] ) ); // Check result is less than 0.5mm from expected. QVERIFY( qAbs( result - myLineList[6].toDouble() ) < 0.0005 ); } } }
QgsAttributeDialog *QgisAppInterface::getFeatureForm( QgsVectorLayer *l, QgsFeature &feature ) { QgsDistanceArea myDa; myDa.setSourceCrs( l->crs() ); myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); QgsAttributeEditorContext context; context.setDistanceArea( myDa ); context.setVectorLayerTools( qgis->vectorLayerTools() ); QgsAttributeDialog *dialog = new QgsAttributeDialog( l, &feature, false, qgis, true, context ); if ( !feature.isValid() ) { dialog->setMode( QgsAttributeForm::AddFeatureMode ); } return dialog; }
void QgsMapToolMeasureAngle::canvasMoveEvent( QMouseEvent * e ) { if ( !mRubberBand || mAnglePoints.size() < 1 || mAnglePoints.size() > 2 || !mRubberBand ) { return; } QgsPoint point = snapPoint( e->pos() ); mRubberBand->movePoint( point ); if ( mAnglePoints.size() == 2 ) { if ( !mResultDisplay ) { mResultDisplay = new QgsDisplayAngle( mCanvas->topLevelWidget() ); QObject::connect( mResultDisplay, SIGNAL( rejected() ), this, SLOT( stopMeasuring() ) ); QObject::connect( mResultDisplay, SIGNAL( changeProjectionEnabledState() ), this, SLOT( changeProjectionEnabledState() ) ); mResultDisplay->move( e->pos() - QPoint( 100, 100 ) ); } mResultDisplay->show(); QgsDistanceArea myDa; configureDistanceArea( myDa ); //angle calculation double azimuthOne = myDa.bearing( mAnglePoints.at( 1 ), mAnglePoints.at( 0 ) ); double azimuthTwo = myDa.bearing( mAnglePoints.at( 1 ), point ); double resultAngle = azimuthTwo - azimuthOne; QgsDebugMsg( QString::number( qAbs( resultAngle ) ) ); QgsDebugMsg( QString::number( M_PI ) ); if ( qAbs( resultAngle ) > M_PI ) { if ( resultAngle < 0 ) { resultAngle = M_PI + ( resultAngle + M_PI ); } else { resultAngle = -M_PI + ( resultAngle - M_PI ); } } mResultDisplay->setValueInRadians( resultAngle ); } }
QgsAttributeDialog *QgsFeatureAction::newDialog( bool cloneFeature ) { QgsFeature *f = cloneFeature ? new QgsFeature( *mFeature ) : mFeature; QgsAttributeEditorContext context; QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); context.setDistanceArea( myDa ); context.setVectorLayerTools( QgisApp::instance()->vectorLayerTools() ); QgsAttributeDialog *dialog = new QgsAttributeDialog( mLayer, f, cloneFeature, NULL, true, context ); if ( mLayer->actions()->size() > 0 ) { dialog->setContextMenuPolicy( Qt::ActionsContextMenu ); QAction *a = new QAction( tr( "Run actions" ), dialog ); a->setEnabled( false ); dialog->addAction( a ); for ( int i = 0; i < mLayer->actions()->size(); i++ ) { const QgsAction &action = mLayer->actions()->at( i ); if ( !action.runable() ) continue; QgsFeature& feat = const_cast<QgsFeature&>( *dialog->feature() ); QgsFeatureAction *a = new QgsFeatureAction( action.name(), feat, mLayer, i, -1, dialog ); dialog->addAction( a ); connect( a, SIGNAL( triggered() ), a, SLOT( execute() ) ); QAbstractButton *pb = dialog->findChild<QAbstractButton *>( action.name() ); if ( pb ) connect( pb, SIGNAL( clicked() ), a, SLOT( execute() ) ); } } return dialog; }
void QgsMapToolIdentify::convertMeasurement( QgsDistanceArea &calc, double &measure, QGis::UnitType &u, bool isArea ) { // Helper for converting between meters and feet // The parameter &u is out only... QGis::UnitType myUnits = mCanvas->mapUnits(); if (( myUnits == QGis::Degrees || myUnits == QGis::Feet ) && calc.ellipsoid() != "NONE" && calc.hasCrsTransformEnabled() ) { // Measuring on an ellipsoid returns meters, and so does using projections??? myUnits = QGis::Meters; QgsDebugMsg( "We're measuring on an ellipsoid or using projections, the system is returning meters" ); } // Get the units for display QSettings settings; QString myDisplayUnitsTxt = settings.value( "/qgis/measure/displayunits", "meters" ).toString(); // Only convert between meters and feet if ( myUnits == QGis::Meters && myDisplayUnitsTxt == "feet" ) { QgsDebugMsg( QString( "Converting %1 meters" ).arg( QString::number( measure ) ) ); measure /= 0.3048; if ( isArea ) { measure /= 0.3048; } QgsDebugMsg( QString( "to %1 feet" ).arg( QString::number( measure ) ) ); myUnits = QGis::Feet; } if ( myUnits == QGis::Feet && myDisplayUnitsTxt == "meters" ) { QgsDebugMsg( QString( "Converting %1 feet" ).arg( QString::number( measure ) ) ); measure *= 0.3048; if ( isArea ) { measure *= 0.3048; } QgsDebugMsg( QString( "to %1 meters" ).arg( QString::number( measure ) ) ); myUnits = QGis::Meters; } u = myUnits; }
QgsAttributeDialog* QgisAppInterface::getFeatureForm( QgsVectorLayer *l, QgsFeature &feature ) { QgsDistanceArea myDa; myDa.setSourceCrs( l->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); QgsAttributeEditorContext context; context.setDistanceArea( myDa ); context.setVectorLayerTools( qgis->vectorLayerTools() ); QgsAttributeDialog *dialog = new QgsAttributeDialog( l, &feature, false, qgis, true, context ); if ( !feature.isValid() ) { dialog->setMode( QgsAttributeForm::AddFeatureMode ); } return dialog; }
QgsAttributeDialog *QgsFeatureAction::newDialog( bool cloneFeature ) { QgsFeature *f = cloneFeature ? new QgsFeature( *mFeature ) : mFeature; QgsAttributeEditorContext context; QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs() ); myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); context.setDistanceArea( myDa ); context.setVectorLayerTools( QgisApp::instance()->vectorLayerTools() ); context.setFormMode( QgsAttributeEditorContext::StandaloneDialog ); QgsAttributeDialog *dialog = new QgsAttributeDialog( mLayer, f, cloneFeature, parentWidget(), true, context ); dialog->setWindowFlags( dialog->windowFlags() | Qt::Tool ); dialog->setObjectName( QStringLiteral( "featureactiondlg:%1:%2" ).arg( mLayer->id() ).arg( f->id() ) ); QList<QgsAction> actions = mLayer->actions()->actions( QStringLiteral( "Feature" ) ); if ( !actions.isEmpty() ) { dialog->setContextMenuPolicy( Qt::ActionsContextMenu ); QAction *a = new QAction( tr( "Run actions" ), dialog ); a->setEnabled( false ); dialog->addAction( a ); Q_FOREACH ( const QgsAction &action, actions ) { if ( !action.runable() ) continue; QgsFeature &feat = const_cast<QgsFeature &>( *dialog->feature() ); QgsFeatureAction *a = new QgsFeatureAction( action.name(), feat, mLayer, action.id(), -1, dialog ); dialog->addAction( a ); connect( a, &QAction::triggered, a, &QgsFeatureAction::execute ); QAbstractButton *pb = dialog->findChild<QAbstractButton *>( action.name() ); if ( pb ) connect( pb, &QAbstractButton::clicked, a, &QgsFeatureAction::execute ); } }
void GlobePlugin::syncExtent() { QgsMapCanvas* mapCanvas = mQGisIface->mapCanvas(); const QgsMapSettings &mapSettings = mapCanvas->mapSettings(); QgsRectangle extent = mapCanvas->extent(); long epsgGlobe = 4326; QgsCoordinateReferenceSystem globeCrs; globeCrs.createFromOgcWmsCrs( QString( "EPSG:%1" ).arg( epsgGlobe ) ); // transform extent to WGS84 if ( mapSettings.destinationCrs().authid().compare( QString( "EPSG:%1" ).arg( epsgGlobe ), Qt::CaseInsensitive ) != 0 ) { QgsCoordinateReferenceSystem srcCRS( mapSettings.destinationCrs() ); QgsCoordinateTransform* coordTransform = new QgsCoordinateTransform( srcCRS, globeCrs ); extent = coordTransform->transformBoundingBox( extent ); delete coordTransform; } 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( globeCrs ); dist.setEllipsoidalMode( true ); dist.setEllipsoid( "WGS84" ); 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 ); }
double QgsComposerScaleBar::mapWidth() const { if ( !mComposerMap ) { return 0.0; } QgsRectangle composerMapRect = *( mComposerMap->currentMapExtent() ); if ( mUnits == MapUnits ) { return composerMapRect.width(); } else { QgsDistanceArea da; da.setEllipsoidalMode( mComposition->mapSettings().hasCrsTransformEnabled() ); da.setSourceCrs( mComposition->mapSettings().destinationCrs().srsid() ); da.setEllipsoid( mComposition->project()->ellipsoid() ); QgsUnitTypes::DistanceUnit units = QgsUnitTypes::DistanceMeters; double measure = da.measureLine( QgsPoint( composerMapRect.xMinimum(), composerMapRect.yMinimum() ), QgsPoint( composerMapRect.xMaximum(), composerMapRect.yMinimum() ), units ); switch ( mUnits ) { case QgsComposerScaleBar::Feet: measure /= QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::DistanceFeet, units ); break; case QgsComposerScaleBar::NauticalMiles: measure /= QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::DistanceNauticalMiles, units ); break; case QgsComposerScaleBar::Meters: measure /= QgsUnitTypes::fromUnitToUnitFactor( QgsUnitTypes::DistanceMeters, units ); break; case QgsComposerScaleBar::MapUnits: //avoid warning break; } return measure; } }
void QgsBullsEyeWidget::createLayer( QString layerName ) { if ( layerName.isEmpty() ) { layerName = QInputDialog::getText( this, tr( "Layer Name" ), tr( "Enter name of new layer:" ) ); } if ( !layerName.isEmpty() ) { QgsDistanceArea da; da.setEllipsoid( "WGS84" ); da.setEllipsoidalMode( true ); da.setSourceCrs( mCanvas->mapSettings().destinationCrs() ); QgsRectangle extent = mCanvas->extent(); double extentHeight = da.measureLine( QgsPoint( extent.center().x(), extent.yMinimum() ), QgsPoint( extent.center().x(), extent.yMaximum() ) ); double interval = 0.5 * extentHeight * QGis::fromUnitToUnitFactor( QGis::Meters, QGis::NauticalMiles ) / 6; // Half height divided by nr rings+1, in nm QgsBullsEyeLayer* bullEyeLayer = new QgsBullsEyeLayer( layerName ); bullEyeLayer->setup( mCanvas->extent().center(), mCanvas->mapSettings().destinationCrs(), 5, interval, 45 ); QgsMapLayerRegistry::instance()->addMapLayer( bullEyeLayer ); mLayerTreeView->setCurrentLayer( bullEyeLayer ); } }
QList<double> QgsGeometryAnalyzer::simpleMeasure( QgsGeometry& mpGeometry ) { QList<double> list; double perim; if ( mpGeometry.wkbType() == QgsWkbTypes::Point ) { QgsPoint pt = mpGeometry.asPoint(); list.append( pt.x() ); list.append( pt.y() ); } else { QgsDistanceArea measure; list.append( measure.measureArea( mpGeometry ) ); if ( mpGeometry.type() == QgsWkbTypes::PolygonGeometry ) { perim = perimeterMeasure( mpGeometry, measure ); list.append( perim ); } } return list; }