⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qgsgrassnewmapset.cpp

📁 一个非常好的GIS开源新版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  }  if ( mProjInfo && mProjUnits )  {    setNextEnabled ( page(PROJECTION), true );  }   else  {    setNextEnabled ( page(PROJECTION), false );  } }/**************************** REGION ********************************/void QgsGrassNewMapset::setRegionPage(){#ifdef QGISDEBUG  std::cerr << "QgsGrassNewMapset::setRegionPage()" << std::endl;#endif  // Set defaults  if ( !mRegionModified )   {		    setGrassRegionDefaults();  }  // Create new projection  QgsSpatialRefSys newSrs;  if ( mProjRadioButton->isChecked() )   { #ifdef QGISDEBUG    std::cerr << "getCurrentSRSID() = " << mProjectionSelector->getCurrentSRSID() << std::endl;#endif    if ( mProjectionSelector->getCurrentSRSID() > 0 )    {      newSrs.createFromSrsId ( mProjectionSelector->getCurrentSRSID() );      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)      {        UNUSED(cse);        std::cerr << "Cannot transform point" << std::endl;        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();    QgsRect ext = mIface->getMapCanvas()->extent();    if ( ext.xMin() >= ext.xMax() || ext.yMin() >= ext.yMax() )    {      mCurrentRegionButton->setEnabled(false);    }  }  checkRegion();  if ( !mNoProjRadioButton->isChecked() )  {    drawRegion();  }}void QgsGrassNewMapset::setGrassRegionDefaults(){#ifdef QGISDEBUG  std::cerr << "QgsGrassNewMapset::setGrassRegionDefaults() mCellHead.proj = " << mCellHead.proj << std::endl;#endif  int srsid = QgsProject::instance()->readNumEntry(    "SpatialRefSys","/ProjectSRSID",0);#ifdef QGISDEBUG  std::cerr << "current project srsid = " << srsid << std::endl;#endif  QgsRect ext = mIface->getMapCanvas()->extent();  bool extSet = false;  if ( ext.xMin() < ext.xMax() && ext.yMin() < ext.yMax() )  {    extSet = true;  }  if ( extSet &&     ( mNoProjRadioButton->isChecked() ||    ( mProjRadioButton->isChecked()      && srsid == mProjectionSelector->getCurrentSRSID() )     )    )  {    mNorthLineEdit->setText( QString::number(ext.yMax()) );    mSouthLineEdit->setText( QString::number(ext.yMin()) );    mEastLineEdit->setText( QString::number(ext.xMax()) );    mWestLineEdit->setText( QString::number(ext.xMin()) );  }  else if ( mCellHead.proj == PROJECTION_XY )   {    mNorthLineEdit->setText("1000");    mSouthLineEdit->setText("0");    mEastLineEdit->setText("1000");    mWestLineEdit->setText("0");  }  else if ( mCellHead.proj == PROJECTION_LL )   {    mNorthLineEdit->setText("90");    mSouthLineEdit->setText("-90");    mEastLineEdit->setText("180");    mWestLineEdit->setText("-180");  }  else   {    mNorthLineEdit->setText("100000");    mSouthLineEdit->setText("-100000");    mEastLineEdit->setText("100000");    mWestLineEdit->setText("-100000");  }  mRegionModified = false; } void QgsGrassNewMapset::regionChanged(){#ifdef QGISDEBUG  std::cerr << "QgsGrassNewMapset::regionChanged()" << std::endl;#endif  mRegionModified = true;  checkRegion();  drawRegion();}void QgsGrassNewMapset::checkRegion(){#ifdef QGISDEBUG  std::cerr << "QgsGrassNewMapset::checkRegion()" << std::endl;#endif  bool err = false;  setError ( mRegionErrorLabel, "");  setNextEnabled ( page(REGION), false );  if (   mNorthLineEdit->text().stripWhiteSpace().length() == 0     || mSouthLineEdit->text().stripWhiteSpace().length() == 0    || mEastLineEdit->text().stripWhiteSpace().length() == 0    || mWestLineEdit->text().stripWhiteSpace().length() == 0 )  {    return;  }  double n = mNorthLineEdit->text().toDouble();  double s = mSouthLineEdit->text().toDouble();  double e = mEastLineEdit->text().toDouble();  double w = mWestLineEdit->text().toDouble();  if ( n <= s )   {    setError ( mRegionErrorLabel, tr("North must be greater than south") );    err = true;  }	  if ( e <= w && mCellHead.proj != PROJECTION_LL )   {    setError ( mRegionErrorLabel, tr("East must be greater than west") );    err = true;  }	  if ( err ) return;  mCellHead.north = n;  mCellHead.south = s;  mCellHead.east = e;  mCellHead.west = w;  mCellHead.top = 1.;  mCellHead.bottom = 0.;  double res = (e - w)/1000; // reasonable resolution   double res3 = res/10.;  mCellHead.rows   = (int) ( (n-s)/res );  mCellHead.rows3  = (int) ( (n-s)/res3 );  mCellHead.cols   = (int) ( (e-w)/res );  mCellHead.cols3  = (int) ( (e-w)/res3 );  mCellHead.depths = 1;  mCellHead.ew_res  = res;  mCellHead.ew_res3 = res3;  mCellHead.ns_res  = res;  mCellHead.ns_res3 = res3;  mCellHead.tb_res  = 1.;  mCellHead.zone = 0;  setNextEnabled ( page(REGION), true );}void QgsGrassNewMapset::loadRegions(){#ifdef QGISDEBUG  std::cerr << "QgsGrassNewMapset::loadRegions()" << std::endl;#endif  QString path = QgsApplication::pkgDataPath() + "/grass/locations.gml";#ifdef QGISDEBUG  std::cerr << "load:" << path.local8Bit().data() << std::endl;#endif  QFile file ( path );  if ( !file.exists() ) {    QMessageBox::warning( 0, tr("Warning"),       tr("Regions file (") + path + tr(") not found.") );    return;  }  if ( ! file.open( QIODevice::ReadOnly ) ) {    QMessageBox::warning( 0, tr("Warning"),       tr("Cannot open locations file (") + path +tr(")") );    return;  }  QDomDocument doc ( "gml:FeatureCollection" );  QString err;  int line, column;  if ( !doc.setContent( &file,  &err, &line, &column ) ) {    QString errmsg = tr("Cannot read locations file (") + path + tr("):\n")       + err + tr("\nat line ") + QString::number(line)       + tr(" column ") + QString::number(column);    std::cerr << errmsg.toLocal8Bit().data() << std::endl;    QMessageBox::warning( 0, tr("Warning"), errmsg );    file.close();    return;  }  QDomElement docElem = doc.documentElement();  QDomNodeList nodes = docElem.elementsByTagName ( "gml:featureMember" );  for ( int i = 0; i < nodes.count(); i++ )   {    QDomNode node = nodes.item(i);    if ( node.isNull() ) {      continue;    }    QDomElement elem = node.toElement();    QDomNodeList nameNodes = elem.elementsByTagName ( "gml:name" );    if ( nameNodes.count() == 0 ) continue;    if ( nameNodes.item(0).isNull() ) continue;    QDomElement nameElem = nameNodes.item(0).toElement();    if ( nameElem.text().isNull() ) continue;    QDomNodeList envNodes = elem.elementsByTagName ( "gml:Envelope" );    if ( envNodes.count() == 0 ) continue;    if ( envNodes.item(0).isNull() ) continue;    QDomElement envElem = envNodes.item(0).toElement();    QDomNodeList coorNodes = envElem.elementsByTagName ( "gml:coordinates" );    if ( coorNodes.count() == 0 ) continue;    if ( coorNodes.item(0).isNull() ) continue;    QDomElement coorElem = coorNodes.item(0).toElement();    if ( coorElem.text().isNull() ) continue;    QStringList coor = QStringList::split ( " ", coorElem.text() );    if ( coor.size() != 2 )    {      std::cerr << "Cannot parse coordinates: " << coorElem.text().ascii() << std::endl;      continue;    }    QStringList ll = QStringList::split ( ",", coor[0] );    QStringList ur = QStringList::split ( ",", coor[1] );    if ( ll.size() != 2 || ur.size() != 2 )    {      std::cerr << "Cannot parse coordinates: " << coorElem.text().ascii() << std::endl;      continue;    }    // Add region    mRegionsComboBox->insertItem ( nameElem.text() );    QgsPoint llp ( ll[0].toDouble(), ll[1].toDouble() );    mRegionsPoints.push_back( llp );    QgsPoint urp ( ur[0].toDouble(), ur[1].toDouble() );    mRegionsPoints.push_back( urp );  }  file.close();}void QgsGrassNewMapset::setSelectedRegion(){#ifdef QGISDEBUG  std::cerr << "QgsGrassNewMapset::setSelectedRegion()" << std::endl;#endif  // mRegionsPoints are in EPSG 4326 = LL WGS84  int index = 2 * mRegionsComboBox->currentItem();  std::vector<QgsPoint> points;   // corners ll lr ur ul  points.push_back( QgsPoint(mRegionsPoints[index]) );  points.push_back( QgsPoint(mRegionsPoints[index+1].x(),     mRegionsPoints[index].y()) );  points.push_back( QgsPoint(mRegionsPoints[index+1]) );  points.push_back( QgsPoint(mRegionsPoints[index].x(),     mRegionsPoints[index+1].y()) );  // Convert to currently selected coordinate system  // Warning: seems that crashes if source == dest  if ( mProjectionSelector->getCurrentSRSID() != 2585 )  {    // Warning: QgsSpatialRefSys::EPSG is broken (using epsg_id)    //QgsSpatialRefSys source ( 4326, QgsSpatialRefSys::EPSG );    QgsSpatialRefSys source ( 2585, QgsSpatialRefSys::QGIS_SRSID );    if ( !source.isValid() )     {      QMessageBox::warning( 0, tr("Warning"),         tr("Cannot create QgsSpatialRefSys" ) );      return;    }    QgsSpatialRefSys dest ( mProjectionSelector->getCurrentSRSID(),       QgsSpatialRefSys::QGIS_SRSID );    if ( !dest.isValid() )     {      QMessageBox::warning( 0, tr("Warning"),         tr("Cannot create QgsSpatialRefSys") );      return;    }    QgsCoordinateTransform trans( source, dest );    bool ok = true;    for ( int i = 0; i < 4; i++ )     { #ifdef QGISDEBUG      std::cerr << points[i].x() << "," << points[i].y() << "->" << std::endl;#endif      try      {        points[i] = trans.transform ( points[i] );#ifdef QGISDEBUG        std::cerr << points[i].x() << "," << points[i].y() << std::endl;#endif      }      catch(QgsCsException &cse)      {        UNUSED(cse);        std::cerr << "Cannot transform point" << std::endl;        ok = false;        break;      }    }    if ( !ok )    {      QMessageBox::warning( 0, tr("Warning"),         tr( "Cannot reproject selected region.") );      return;    }  }  double n, s, e, w;  if ( mCellHead.proj == PROJECTION_LL )   {    n = points[2].y();    s = points[0].y();    e = points[1].x();    w = points[0].x();    if ( n > 90 ) n = 90;    if ( s < -90 ) s = -90;    /*    if ( e > 180 ) e = 180;    if ( w < -180 ) w = 180;    */  }  else  {    for ( int i = 0; i < 4; i++ )     {       if ( i == 0 || points[i].y() > n ) n = points[i].y();      if ( i == 0 || points[i].y() < s ) s = points[i].y();      if ( i == 0 || points[i].x() > e ) e = points[i].x();      if ( i == 0 || points[i].x() < w ) w = points[i].x();    }  }  mNorthLineEdit->setText( QString::number(n) );  mSouthLineEdit->setText( QString::number(s) );  mEastLineEdit->setText ( QString::number(e) );  mWestLineEdit->setText ( QString::number(w) );  mRegionModified = true;  checkRegion();  drawRegion();}void QgsGrassNewMapset::setCurrentRegion(){#ifdef QGISDEBUG  std::cerr << "QgsGrassNewMapset::setCurrentRegion()" << std::endl;#endif  QgsRect ext = mIface->getMapCanvas()->extent();  int srsid = QgsProject::instance()->readNumEntry(    "SpatialRefSys","/ProjectSRSID",0);  QgsSpatialRefSys srs( srsid, QgsSpatialRefSys::QGIS_SRSID );#ifdef QGISDEBUG  std::cerr << "current project srsid = " << srsid << std::endl;  std::cerr << "srs.isValid() = " << srs.isValid() << std::endl;#endif  std::vector<QgsPoint> points;   // TODO: this is not perfect  points.push_back( QgsPoint(ext.xMin(),ext.yMin()) );  points.push_back( QgsPoint(ext.xMax(),ext.yMax()) );  // TODO add a method, this code is copy-paste from setSelectedRegion   if ( srs.isValid() && mSrs.isValid()    && srs.srsid() != mSrs.srsid() )   {		    QgsCoordinateTransform trans( srs, mSrs );    bool ok = true;    for ( int i = 0; i < 2; i++ )     {       try      {        points[i] = trans.transform ( points[i] );      }      catch(QgsCsException &cse)      {        UNUSED(cse);        std::cerr << "Cannot transform point" << std::endl;        ok = false;        break;      }    }    if ( !ok )    {      QMessageBox::warning( 0, tr("Warning"), tr("Cannot reproject region") );      return;    }  }  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() ) );  mRegionModified = true;  checkRegion();  drawRegion();  std::cerr << "setCurrentRegion - End" << std::endl;}void QgsGrassNewMapset::clearRegion(){#ifdef QGISDEBUG  std::cerr << "QgsGrassNewMapset::clearRegion()" << std::endl;#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -