void QgsProjectionSelectionWidget::addRecentCrs()
{
  QStringList recentProjections = QgsCoordinateReferenceSystem::recentProjections();
  int i = 0;
  Q_FOREACH ( const QString& projection, recentProjections )
  {
    long srsid = projection.toLong();

    //check if already shown
    if ( crsIsShown( srsid ) )
    {
      continue;
    }

    i++;
    QgsCoordinateReferenceSystem crs;
    crs.createFromSrsId( srsid );
    if ( crs.isValid() )
    {
      mCrsComboBox->addItem( tr( "%1 - %2" ).arg( crs.authid(), crs.description() ), QgsProjectionSelectionWidget::RecentCrs );
      mCrsComboBox->setItemData( mCrsComboBox->count() - 1, QVariant(( long long )srsid ), Qt::UserRole + 1 );
    }
    if ( i >= 4 )
    {
      //limit to 4 recent projections to avoid clutter
      break;
    }
  }
void QgsProjectionSelectionWidget::comboIndexChanged( int idx )
{
  switch (( CrsOption )mCrsComboBox->itemData( idx ).toInt() )
  {
    case QgsProjectionSelectionWidget::LayerCrs:
      emit crsChanged( mLayerCrs );
      return;
    case QgsProjectionSelectionWidget::ProjectCrs:
      emit crsChanged( mProjectCrs );
      return;
    case QgsProjectionSelectionWidget::CurrentCrs:
      emit crsChanged( mCrs );
      return;
    case QgsProjectionSelectionWidget::DefaultCrs:
      emit crsChanged( mDefaultCrs );
      return;
    case QgsProjectionSelectionWidget::RecentCrs:
    {
      long srsid = mCrsComboBox->itemData( idx, Qt::UserRole + 1 ).toLongLong();
      QgsCoordinateReferenceSystem crs;
      crs.createFromSrsId( srsid );
      emit crsChanged( crs );
      return;
    }
  }
}
QgsCoordinateReferenceSystem QgsProjectionSelectionWidget::crs() const
{
  switch (( CrsOption )mCrsComboBox->itemData( mCrsComboBox->currentIndex() ).toInt() )
  {
    case QgsProjectionSelectionWidget::LayerCrs:
      return mLayerCrs;
    case QgsProjectionSelectionWidget::ProjectCrs:
      return mProjectCrs ;
    case QgsProjectionSelectionWidget::DefaultCrs:
      return mDefaultCrs ;
    case QgsProjectionSelectionWidget::CurrentCrs:
      return mCrs;
    case QgsProjectionSelectionWidget::RecentCrs:
    {
      long srsid = mCrsComboBox->itemData( mCrsComboBox->currentIndex(), Qt::UserRole + 1 ).toLongLong();
      QgsCoordinateReferenceSystem crs;
      crs.createFromSrsId( srsid );
      return crs;
    }
  }
  return mCrs;
}
예제 #4
0
/**************************** REGION ********************************/
void QgsGrassNewMapset::setRegionPage()
{
    QgsDebugMsg( "entered." );

    // Set defaults
    if ( !mRegionModified )
    {
        setGrassRegionDefaults();
    }

    // Create new projection
    QgsCoordinateReferenceSystem newSrs;
    if ( mProjRadioButton->isChecked() )
    {
        QgsDebugMsg( QString( "selectedCrsId() = %1" ).arg( mProjectionSelector->selectedCrsId() ) );

        if ( mProjectionSelector->selectedCrsId() > 0 )
        {
            newSrs.createFromSrsId( mProjectionSelector->selectedCrsId() );
            if ( ! newSrs.isValid() )
            {
                QMessageBox::warning( 0, tr( "Warning" ), tr( "Cannot create projection." ) );
            }
        }
    }

    // Reproject previous region if it was modified
    // and if previous and current projection is valid
    if ( mRegionModified && newSrs.isValid() && mSrs.isValid()
            && newSrs.srsid() != mSrs.srsid() )
    {
        QgsCoordinateTransform trans( mSrs, newSrs );

        double n = mNorthLineEdit->text().toDouble();
        double s = mSouthLineEdit->text().toDouble();
        double e = mEastLineEdit->text().toDouble();
        double w = mWestLineEdit->text().toDouble();

        std::vector<QgsPoint> points;

        // TODO: this is not perfect
        points.push_back( QgsPoint( w, s ) );
        points.push_back( QgsPoint( e, n ) );

        bool ok = true;
        for ( int i = 0; i < 2; i++ )
        {
            try
            {
                points[i] = trans.transform( points[i] );
            }
            catch ( QgsCsException &cse )
            {
                Q_UNUSED( cse );
                QgsDebugMsg( "Cannot transform point" );
                ok = false;
                break;
            }
        }

        if ( ok )
        {
            mNorthLineEdit->setText( QString::number( points[1].y() ) );
            mSouthLineEdit->setText( QString::number( points[0].y() ) );
            mEastLineEdit->setText( QString::number( points[1].x() ) );
            mWestLineEdit->setText( QString::number( points[0].x() ) );
        }
        else
        {
            QMessageBox::warning( 0, tr( "Warning" ), tr( "Cannot reproject previously set region, default region set." ) );

            setGrassRegionDefaults();
        }
    }

    // Set current region projection
    mSrs = newSrs;

    // Enable / disable region selection widgets
    if ( mNoProjRadioButton->isChecked() )
    {
        mRegionMap->hide();
        mCurrentRegionButton->hide();
        mRegionsComboBox->hide();
        mRegionButton->hide();
        mSetRegionFrame->hide();
    }
    else
    {
        mRegionMap->show();
        mCurrentRegionButton->show();
        mRegionsComboBox->show();
        mRegionButton->show();
        mSetRegionFrame->show();

        QgsRectangle ext = mIface->mapCanvas()->extent();

        if ( ext.xMinimum() >= ext.xMaximum() || ext.yMinimum() >= ext.yMaximum() )
        {
            mCurrentRegionButton->setEnabled( false );
        }
    }

    checkRegion();

    if ( !mNoProjRadioButton->isChecked() )
    {
        drawRegion();
    }
}
예제 #5
0
void QgsDistanceArea::setSourceCrs( long srsid )
{
  QgsCoordinateReferenceSystem srcCRS;
  srcCRS.createFromSrsId( srsid );
  mCoordTransform->setSourceCrs( srcCRS );
}
예제 #6
0
void TestQgsDistanceArea::measureAreaAndUnits()
{
  QgsDistanceArea da;
  da.setSourceCrs( 3452 );
  da.setEllipsoidalMode( false );
  da.setEllipsoid( "NONE" );
  QgsCoordinateReferenceSystem daCRS;
  daCRS.createFromSrsId( da.sourceCrsId() );
  QgsPolyline ring;
  ring << QgsPoint( 0, 0 )
  << QgsPoint( 1, 0 )
  << QgsPoint( 1, 1 )
  << QgsPoint( 2, 1 )
  << QgsPoint( 2, 2 )
  << QgsPoint( 0, 2 )
  << QgsPoint( 0, 0 );
  QgsPolygon poly;
  poly << ring;

  QgsGeometry polygon( QgsGeometry::fromPolygon( poly ) );

  // We check both the measured area AND the units, in case the logic regarding
  // ellipsoids and units changes in future
  double area = da.measureArea( &polygon );
  QgsUnitTypes::AreaUnit units = da.areaUnits();

  QgsDebugMsg( QString( "measured %1 in %2" ).arg( area ).arg( QgsUnitTypes::toString( units ) ) );

  QVERIFY(( qgsDoubleNear( area, 3.0, 0.00000001 ) && units == QgsUnitTypes::AreaSquareDegrees )
          || ( qgsDoubleNear( area, 37176087091.5, 0.1 ) && units == QgsUnitTypes::AreaSquareMeters ) );

  da.setEllipsoid( "WGS84" );
  area = da.measureArea( &polygon );
  units = da.areaUnits();

  QgsDebugMsg( QString( "measured %1 in %2" ).arg( area ).arg( QgsUnitTypes::toString( units ) ) );
  QVERIFY(( qgsDoubleNear( area, 3.0, 0.00000001 ) && units == QgsUnitTypes::AreaSquareDegrees )
          || ( qgsDoubleNear( area, 37176087091.5, 0.1 ) && units == QgsUnitTypes::AreaSquareMeters ) );

  da.setEllipsoidalMode( true );
  area = da.measureArea( &polygon );
  units = da.areaUnits();

  QgsDebugMsg( QString( "measured %1 in %2" ).arg( area ).arg( QgsUnitTypes::toString( units ) ) );
  // should always be in Meters Squared
  QGSCOMPARENEAR( area, 37416879192.9, 0.1 );
  QCOMPARE( units, QgsUnitTypes::AreaSquareMeters );

  // test converting the resultant area
  area = da.convertAreaMeasurement( area, QgsUnitTypes::AreaSquareMiles );
  QGSCOMPARENEAR( area, 14446.7378, 0.001 );

  // now try with a source CRS which is in feet
  ring.clear();
  ring << QgsPoint( 1850000, 4423000 )
  << QgsPoint( 1851000, 4423000 )
  << QgsPoint( 1851000, 4424000 )
  << QgsPoint( 1852000, 4424000 )
  << QgsPoint( 1852000, 4425000 )
  << QgsPoint( 1851000, 4425000 )
  << QgsPoint( 1850000, 4423000 );
  poly.clear();
  poly << ring;
  polygon = QgsGeometry::fromPolygon( poly );

  da.setSourceCrs( 27469 );
  da.setEllipsoidalMode( false );
  // measurement should be in square feet
  area = da.measureArea( &polygon );
  units = da.areaUnits();
  QgsDebugMsg( QString( "measured %1 in %2" ).arg( area ).arg( QgsUnitTypes::toString( units ) ) );
  QGSCOMPARENEAR( area, 2000000, 0.001 );
  QCOMPARE( units, QgsUnitTypes::AreaSquareFeet );

  // test converting the resultant area
  area = da.convertAreaMeasurement( area, QgsUnitTypes::AreaSquareYards );
  QGSCOMPARENEAR( area, 222222.2222, 0.001 );

  da.setEllipsoidalMode( true );
  // now should be in Square Meters again
  area = da.measureArea( &polygon );
  units = da.areaUnits();
  QgsDebugMsg( QString( "measured %1 in %2" ).arg( area ).arg( QgsUnitTypes::toString( units ) ) );
  QGSCOMPARENEAR( area, 184149.37, 1.0 );
  QCOMPARE( units, QgsUnitTypes::AreaSquareMeters );

  // test converting the resultant area
  area = da.convertAreaMeasurement( area, QgsUnitTypes::AreaSquareYards );
  QgsDebugMsg( QString( "measured %1 in sq yrds" ).arg( area ) );
  QGSCOMPARENEAR( area, 220240.8172549, 0.00001 );
}