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

📄 graticulecreator.cpp

📁 一个非常好的GIS开源新版本
💻 CPP
字号:
/***************************************************************************     graticulecreator.cpp     --------------------------------------    Date                 : Sun Sep 16 12:06:45 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 "graticulecreator.h"#include <qgsfeature.h> //we will need to pass a bunch of these for each rec#include <qgsgeometry.h> //each feature needs a geometry#include <qgspoint.h> //we will use point geometry#include <qgis.h> //defines GEOWKT#include <qgslogger.h>#include <QFileInfo>GraticuleCreator::GraticuleCreator(QString theOutputFileName){  QgsLogger::debug("GraticuleCreator constructor called with " +       theOutputFileName +  " for output file ");  mEncoding = "UTF-8";  QgsField myField1("LabelX",QVariant::Double,"Double",10,4,"X Position for label");  QgsField myField2("LabelY",QVariant::Double,"Double",10,4,"Y Position for label");  QgsField myField3("LblOffsetX",QVariant::Int,"Int",5,0,"X Offset for label");  QgsField myField4("LblOffsetY",QVariant::Int,"int",5,0,"Y Offset for label");  QgsField myField5("Label",QVariant::String,"String",10,0,"Label text");  QgsField myField6("Row",QVariant::String,"String",10,0,"Row");  QgsField myField7("Column",QVariant::String,"String",10,0,"Col");  QgsField myField8("RowCol",QVariant::String,"String",10,0,"Row and col");  mFields.insert(0, myField1);  mFields.insert(1, myField2);  mFields.insert(2, myField3);  mFields.insert(3, myField4);  mFields.insert(4, myField5);  mFields.insert(5, myField6);  mFields.insert(6, myField7);  mFields.insert(7, myField8);  mSRS = QgsSpatialRefSys(GEOWKT);  mFileName = theOutputFileName;}GraticuleCreator::~GraticuleCreator(){}//TODO: check for rediculous intervals!void GraticuleCreator::generatePointGraticule(                                         double theXInterval,                                         double theYInterval,                                         double theXOrigin,                                         double theYOrigin,                                         double theXEndPoint,                                         double theYEndPoint){  //  // Remove old copies that may be lying around  //  QgsVectorFileWriter::deleteShapeFile(mFileName);  QgsVectorFileWriter myWriter (mFileName,      mEncoding,      mFields,      QGis::WKBPoint,      &mSRS);  //   // Order our loop so that it goes from smallest to biggest  //  if (theXEndPoint < theXOrigin)  {    double myBuffer = theXOrigin;    theXOrigin = theXEndPoint;    theXEndPoint = myBuffer;  }  if (theYEndPoint < theYOrigin)  {    double myBuffer = theYOrigin;    theYOrigin = theYEndPoint;    theYEndPoint = myBuffer;  }  int myColumn=0;  int myRow=0;  for (double i=theXOrigin;      i<=theXEndPoint;      i+=theXInterval)  {    for (double j=theYOrigin;                j<=theYEndPoint;                j+=theYInterval)    {      //      // Create a polygon feature      //      QgsPolyline myPolyline;      QgsPoint myPoint = QgsPoint(i,j);      //      // NOTE: dont delete this pointer again -       // ownership is passed to the feature which will      // delete it in its dtor!      QgsGeometry * mypPointGeometry = QgsGeometry::fromPoint(myPoint);      QgsFeature myFeature;      myFeature.setTypeName("WKBPoint");      myFeature.setGeometry(mypPointGeometry);      if (i==theXOrigin && j==theYEndPoint) //labels for bottom right corner      {        myFeature.addAttribute(0,i);//"LabelX"        myFeature.addAttribute(1,j);//"LabelY"        myFeature.addAttribute(2,-20);//"LabelOffsetX"        myFeature.addAttribute(3,-20);//"LabelOffsetY"        myFeature.addAttribute(4,QString::number(i) + "," + QString::number(j));//"Label"      }      else if (i==theXEndPoint && j==theYOrigin) //labels for top left corner      {        myFeature.addAttribute(0,i);//"LabelX"        myFeature.addAttribute(1,j);//"LabelY"        myFeature.addAttribute(2,20);//"LabelOffsetX"        myFeature.addAttribute(3,20);//"LabelOffsetY"        myFeature.addAttribute(4,QString::number(i) + "," +  QString::number(j));//"Label"      }      if (i==theXOrigin && j==theYOrigin) //labels for bottom left corner      {        myFeature.addAttribute(0,i);//"LabelX"        myFeature.addAttribute(1,j);//"LabelY"        myFeature.addAttribute(2,-20);//"LabelOffsetX"        myFeature.addAttribute(3,-20);//"LabelOffsetY"        myFeature.addAttribute(4,QString::number(i) + "," + QString::number(j));//"Label"      }      else if (i==theXEndPoint && j==theYEndPoint) //labels for top right corner      {        myFeature.addAttribute(0,i);//"LabelX"        myFeature.addAttribute(1,j);//"LabelY"        myFeature.addAttribute(2,20);//"LabelOffsetX"        myFeature.addAttribute(3,20);//"LabelOffsetY"        myFeature.addAttribute(4,QString::number(i) + "," +  QString::number(j));//"Label"      }      else if (i==theXOrigin) //labels for left edge      {        myFeature.addAttribute(0,i);//"LabelX"        myFeature.addAttribute(1,j);//"LabelY"        myFeature.addAttribute(2,-20);//"LabelOffsetX"        myFeature.addAttribute(3,0);//"LabelOffsetY"        myFeature.addAttribute(4,QString::number(j));//"Label"      }      else if (i==theXEndPoint) //labels for right edge      {        myFeature.addAttribute(0,i);//"LabelX"        myFeature.addAttribute(1,j);//"LabelY"        myFeature.addAttribute(2,20);//"LabelOffsetX"        myFeature.addAttribute(3,0);//"LabelOffsetY"        myFeature.addAttribute(4,QString::number(j));//"Label"      }      else if (j==theYOrigin) //labels for bottom edge      {        myFeature.addAttribute(0,i);//"LabelX"        myFeature.addAttribute(1,j);//"LabelY"        myFeature.addAttribute(2,0);//"LabelOffsetX"        myFeature.addAttribute(3,-20);//"LabelOffsetY"        myFeature.addAttribute(4,QString::number(i));//"Label"      }      else if (j==theYEndPoint) //labels for top edge      {        myFeature.addAttribute(0,i);//"LabelX"        myFeature.addAttribute(1,j);//"LabelY"        myFeature.addAttribute(2,0);//"LabelOffsetX"        myFeature.addAttribute(3,20);//"LabelOffsetY"        myFeature.addAttribute(4,QString::number(i));//"Label"      }      //      // Set column and row attributes      //      myFeature.addAttribute(6,QString::number(myRow));      myFeature.addAttribute(7,QString::number(myColumn));      myFeature.addAttribute(8,QString::number(myRow) + "," +                                QString::number(myColumn));          ++myRow;      ++myColumn;      //      // Write the feature to the filewriter      // and check for errors      //      myWriter.addFeature(myFeature);      mError = myWriter.hasError();      if(mError==QgsVectorFileWriter::ErrDriverNotFound)      {        std::cout << "Driver not found error" << std::endl;      }      else if (mError==QgsVectorFileWriter::ErrCreateDataSource)      {        std::cout << "Create data source error" << std::endl;      }      else if (mError==QgsVectorFileWriter::ErrCreateLayer)      {        std::cout << "Create layer error" << std::endl;      }      if (mError!=QgsVectorFileWriter::NoError)      {        return;      }    }  }}//TODO: check for rediculous intervals!void GraticuleCreator::generatePolygonGraticule(                                         double theXInterval,                                         double theYInterval,                                         double theXOrigin,                                         double theYOrigin,                                         double theXEndPoint,                                         double theYEndPoint){  //  // Remove old copies that may be lying around  //  QgsVectorFileWriter::deleteShapeFile(mFileName);  QgsVectorFileWriter myWriter (mFileName,      mEncoding,      mFields,      QGis::WKBPolygon,      &mSRS);  //   // Order our loop so that it goes from smallest to biggest  //  if (theXEndPoint < theXOrigin)  {    double myBuffer = theXOrigin;    theXOrigin = theXEndPoint;    theXEndPoint = myBuffer;  }  if (theYEndPoint < theYOrigin)  {    double myBuffer = theYOrigin;    theYOrigin = theYEndPoint;    theYEndPoint = myBuffer;  }  for (double i=theXOrigin;      i<=theXEndPoint;      i+=theXInterval)  {    for (double j=theYOrigin;                j<=theYEndPoint;                j+=theYInterval)    {      //      // Create a polygon feature      //      QgsPolyline myPolyline;      QgsPoint myPoint1 = QgsPoint(i,j);      QgsPoint myPoint2 = QgsPoint(i+theXInterval,j);      QgsPoint myPoint3 = QgsPoint(i+theXInterval,j+theYInterval);      QgsPoint myPoint4 = QgsPoint(i,j+theYInterval);      myPolyline << myPoint1 << myPoint2 << myPoint3 << myPoint4 << myPoint1;      QgsPolygon myPolygon;      myPolygon << myPolyline;      //polygon: first item of the list is outer ring,       // inner rings (if any) start from second item       //      // NOTE: dont delete this pointer again -       // ownership is passed to the feature which will      // delete it in its dtor!      QgsGeometry * mypPolygonGeometry = QgsGeometry::fromPolygon(myPolygon);      QgsFeature myFeature;      myFeature.setTypeName("WKBPolygon");      myFeature.setGeometry(mypPolygonGeometry);      myFeature.addAttribute(0,i);//"LabelX");      myFeature.addAttribute(1,j);//"LabelY");      myFeature.addAttribute(2,-20);//"LabelOffsetX");      myFeature.addAttribute(3,-20);//"LabelOffsetY");      myFeature.addAttribute(4,QString::number(i));//"Label");      //      // Write the feature to the filewriter      // and check for errors      //      myWriter.addFeature(myFeature);      mError = myWriter.hasError();      if(mError==QgsVectorFileWriter::ErrDriverNotFound)      {        std::cout << "Driver not found error" << std::endl;      }      else if (mError==QgsVectorFileWriter::ErrCreateDataSource)      {        std::cout << "Create data source error" << std::endl;      }      else if (mError==QgsVectorFileWriter::ErrCreateLayer)      {        std::cout << "Create layer error" << std::endl;      }      if (mError!=QgsVectorFileWriter::NoError)      {        return;      }    }  }}

⌨️ 快捷键说明

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