📄 qgsgrassnewmapset.cpp
字号:
} 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 + -