📄 qgspointdialog.cpp
字号:
/*************************************************************************** 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 + -