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

📄 qgspointdialog.cpp

📁 一个非常好的GIS开源新版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************     qgspointdialog.cpp     --------------------------------------    Date                 : Sun Sep 16 12:03:52 AKDT 2007    Copyright            : (C) 2007 by Gary E. Sherman    Email                : sherman at mrcc dot com *************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include <cmath>#include <QFileDialog>#include <QFileInfo>#include <QMessageBox>#include <QPainter>#include <QTextStream>#include "qgisinterface.h"#include "qgsapplication.h"#include "qgspointdialog.h"#include "mapcoordsdialog.h"#include "qgsleastsquares.h"#include "qgsimagewarper.h"#include "qgsgeorefwarpoptionsdialog.h"#include "qgsmaplayerregistry.h"#include "qgsmaptoolzoom.h"#include "qgsmaptoolpan.h"#include "qgsgeorefdatapoint.h"class QgsGeorefTool : public QgsMapTool{  public:        QgsGeorefTool(QgsMapCanvas* canvas, QgsPointDialog* dlg, bool addPoint)      : QgsMapTool(canvas), mDlg(dlg), mAddPoint(addPoint)    {    }        //! Mouse press event for overriding    virtual void canvasPressEvent(QMouseEvent * e)    {      QgsPoint pnt = toMapCoords(e->pos());            if (mAddPoint)        mDlg->showCoordDialog(pnt);      else        mDlg->deleteDataPoint(pnt);    }    virtual void canvasMoveEvent(QMouseEvent * e) { }    virtual void canvasReleaseEvent(QMouseEvent * e) { }      private:    QgsPointDialog* mDlg;    bool mAddPoint;};QgsPointDialog::QgsPointDialog(QString layerPath, QgisInterface* theQgisInterface,                                QWidget* parent, Qt::WFlags fl)   : QDialog(parent, fl), mIface(theQgisInterface), mAcetateCounter(0){   initialize();  openImageFile(layerPath);}QgsPointDialog::QgsPointDialog(QgisInterface* theQgisInterface, QWidget* parent, Qt::WFlags fl): QDialog(parent, fl), mLayer(0), mIface(theQgisInterface), mAcetateCounter(0){  initialize();}QgsPointDialog::~QgsPointDialog(){  // delete layer (and don't signal it as it's our private layer)  if (mLayer)  {    QgsMapLayerRegistry::instance()->removeMapLayer(mLayer->getLayerID(), FALSE);  }    delete mToolZoomIn;  delete mToolZoomOut;  delete mToolPan;  delete mToolAddPoint;  delete mToolDeletePoint;  }void QgsPointDialog::openImageFile(QString layerPath){  //delete old points  for(std::vector<QgsGeorefDataPoint*>::iterator it = mPoints.begin(); it != mPoints.end(); ++it)    {      delete *it;    }  mPoints.clear();  mAcetateCounter = 0;    //delete any old rasterlayers  if(mLayer)    {      QgsMapLayerRegistry::instance()->removeMapLayer(mLayer->getLayerID(), FALSE);    }  //add new raster layer  QgsRasterLayer* layer = new QgsRasterLayer(layerPath, "Raster");  mLayer = layer;    // add to map layer registry, do not signal addition  // so layer is not added to legend  QgsMapLayerRegistry* registry = QgsMapLayerRegistry::instance();  registry->addMapLayer(layer, FALSE);      // add layer to map canvas  QList<QgsMapCanvasLayer> layers;  layers.push_back(QgsMapCanvasLayer(layer));  mCanvas->setLayerSet(layers);    // load previously added points  QFile pointFile(mLayer->source() + ".points");  if (pointFile.open(QIODevice::ReadOnly)) {    QTextStream points(&pointFile);    QString tmp;    // read the header    points>>tmp>>tmp>>tmp>>tmp;    // read the first line    double mapX, mapY, pixelX, pixelY;    points>>mapX>>mapY>>pixelX>>pixelY;    while (!points.atEnd()) {      QgsPoint mapCoords(mapX, mapY);      QgsPoint pixelCoords(pixelX, pixelY);      addPoint(pixelCoords, mapCoords);      // read the next line      points>>mapX>>mapY>>pixelX>>pixelY;    }  }    mCanvas->setExtent(mLayer->extent());  mCanvas->freeze(false);    leSelectWorldFile->setText(guessWorldFileName(mLayer->source()));  pbnGenerateWorldFile->setEnabled(true);  pbnGenerateAndLoad->setEnabled(true);  mCanvas->refresh();}void QgsPointDialog::addPoint(const QgsPoint& pixelCoords, const QgsPoint& mapCoords){             QgsGeorefDataPoint* pnt = new QgsGeorefDataPoint(mCanvas,                        mAcetateCounter++, pixelCoords, mapCoords);  pnt->show();  mPoints.push_back(pnt);    mCanvas->refresh();}void QgsPointDialog::on_pbnGenerateWorldFile_clicked(){  generateWorldFile();}void QgsPointDialog::on_pbnGenerateAndLoad_clicked(){  if (generateWorldFile())  {    QString source = mLayer->source();        // delete layer before it's loaded again (otherwise it segfaults)    QgsMapLayerRegistry::instance()->removeMapLayer(mLayer->getLayerID(), FALSE);    mLayer = 0;        // load raster to the main map canvas of QGIS    if (cmbTransformType->currentText() == tr("Linear"))      mIface->addRasterLayer(source);    else       mIface->addRasterLayer(leSelectModifiedRaster->text());  }}void QgsPointDialog::on_pbnSelectWorldFile_clicked(){  QString filename = QFileDialog::getSaveFileName(this,              tr("Choose a name for the world file"), ".");  leSelectWorldFile->setText(filename);}void QgsPointDialog::on_pbnSelectModifiedRaster_clicked(){  QString filename = QFileDialog::getSaveFileName(this,              tr("Choose a name for the world file"), ".");  if (filename.right(4) != ".tif")    filename += ".tif";  leSelectModifiedRaster->setText(filename);  leSelectWorldFile->setText(guessWorldFileName(filename));}void QgsPointDialog::on_cmbTransformType_currentIndexChanged(const QString& value){  if (value == tr("Helmert"))  {    enableModifiedRasterControls(true);    // Make up a modified raster field name based on the layer file name    if(mLayer)      {	QString filename(mLayer->source());	QFileInfo file(mLayer->source());	int pos = filename.size()-file.suffix().size()-1;	filename.insert(pos, tr("-modified", "Georeferencer:QgsPointDialog.cpp - used to modify a user given filename"));	pos = filename.size()-file.suffix().size();	filename.replace(pos, filename.size(), "tif");		leSelectModifiedRaster->setText(filename);	leSelectWorldFile->setText(guessWorldFileName(filename));      }  }  else  {    // Reset to the default filenames    leSelectModifiedRaster->setText("");    enableModifiedRasterControls(false);    if(mLayer)      {	leSelectWorldFile->setText(guessWorldFileName(mLayer->source()));      }  }}bool QgsPointDialog::generateWorldFile(){  QgsPoint origin(0, 0);  double pixelXSize = 1;  double pixelYSize = 1;  double rotation = 0;  QString outputFileName = leSelectModifiedRaster->text();  QString worldFileName = leSelectWorldFile->text();    // create arrays with points from mPoints  std::vector<QgsPoint> pixelCoords, mapCoords;  for (unsigned int i = 0; i < mPoints.size(); i++)  {    QgsGeorefDataPoint* pt = mPoints[i];    pixelCoords.push_back(pt->pixelCoords());    mapCoords.push_back(pt->mapCoords());  }    // compute the parameters using the least squares method   // (might throw std::domain_error)  try  {    if (cmbTransformType->currentText() == tr("Linear"))    {      QgsLeastSquares::linear(mapCoords, pixelCoords, origin, pixelXSize, pixelYSize);    }    else if (cmbTransformType->currentText() == tr("Helmert"))    {      QMessageBox::StandardButton res = QMessageBox::warning(this, tr("Warning"),		     tr("<p>A Helmert transform requires modifications in "		     "the raster layer.</p><p>The modified raster will be "		     "saved in a new file and a world file will be "		     "generated for this new file instead.</p><p>Are you "		     "sure that this is what you want?</p>") + 		     "<p><i>" + tr("Currently all modified files will be written in TIFF format.") + 		     "</i><p>", QMessageBox::Ok | QMessageBox::Cancel);      if (res == QMessageBox::Cancel)	       return false;      QgsLeastSquares::helmert(mapCoords, pixelCoords, origin, pixelXSize, rotation);      pixelYSize = pixelXSize;          }    else if (cmbTransformType->currentText() == tr("Affine"))    {      QMessageBox::critical(this, tr("Not implemented!"),			    tr("<p>An affine transform requires changing the "			    "original raster file. This is not yet "

⌨️ 快捷键说明

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