文章源代码如下:
Shapefile.h
class ContourLine { public: ContourLine(); //ShapeFile(char *); ~ContourLine(void); void ReadContour(char*); void SavaContour(char*); vector<Line> mContours;//等高线 double MinElevation; double MaxElevation; int lineNumber;//shpfile数据中线多个数 int pointNumber;//shpfile数据中点多个数 private: char *FilePath; //数据路径 public: void SetPath(char *path); double ContourLine::GetLengthBetweenPoint(Point P1,Point P2); void ContourLine::GetLength(Line& pContour); public: double minx,miny,maxx,maxy; };
Shapefile.cpp
//构造函数 ContourLine::ContourLine() { OGRRegisterAll(); pointNumber = 0; } ContourLine::~ContourLine(void) { } void ContourLine::ReadContour(char *heightName) { mContours.clear(); OGRDataSource* poDS = OGRSFDriverRegistrar::Open( this->FilePath, FALSE ); if( poDS == NULL ) { return; } OGRLayer* poLayer = poDS->GetLayer(0); if (poLayer == NULL) { return; } poLayer->ResetReading(); OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn(); OGRFeature* poFeature = poLayer->GetNextFeature(); int number=0; Line tempContour; while( poFeature != NULL ) { OGRGeometry* poGeometry = poFeature->GetGeometryRef(); OGRLineString *poPolyline = (OGRLineString *) poGeometry; tempContour.Elevation= poFeature->GetFieldAsDouble (heightName); if (tempContour.Elevation < 0 || poPolyline->getNumPoints() < 3) { poFeature = poLayer->GetNextFeature(); continue; } int ptNumber = poPolyline->getNumPoints(); pointNumber +=ptNumber; for(int i = 0; i < ptNumber; i++) { Point Point; Point.x=poPolyline->getX(i); Point.y=poPolyline->getY(i); tempContour.Points.push_back(Point); } //计算tempContour的长度 this->GetLength(tempContour); if(number==0) { this->MaxElevation=this->MinElevation=tempContour.Elevation; } else { if(tempContour.Elevation<this->MinElevation) this->MinElevation=tempContour.Elevation; if(tempContour.Elevation>this->MaxElevation) this->MaxElevation=tempContour.Elevation; } number++; mContours.push_back(tempContour); tempContour.Points.clear(); poFeature = poLayer->GetNextFeature(); } this->lineNumber=number; } void ContourLine::SavaContour(char *FilePath) { char FileName[MaxFileNameSize]; char *p=strrchr(FilePath,'\\')+1; strcpy(FileName,p); int i=0,j=0; while(i<MaxFileNameSize &&FileName[i]!='\0' &&FileName[i]!='.') i++; if(i !=MaxFileNameSize) FileName[i]='\0'; const char *pszDriverName = "ESRI Shapefile"; OGRSFDriver *poDriver; poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName ); if( poDriver == NULL ) { printf( "%s driver not available.\n", pszDriverName ); return; } OGRDataSource *poDS; poDS = poDriver->CreateDataSource( FilePath, NULL ); if( poDS == NULL ) { printf( "Creation of output file failed.\n" ); return; } OGRLayer *poLayer; poLayer = poDS->CreateLayer(FileName, NULL, wkbLineString, NULL ); if( poLayer == NULL ) { printf( "Layer creation failed.\n" ); return; } OGRFieldDefn oField( "contour", OFTReal ); if( poLayer->CreateField( &oField ) != OGRERR_NONE ) { printf( "Creating field failed.\n" ); return; } int LineNumber=static_cast<int>(mContours.size()); for(i=0;i<LineNumber;i++) { OGRFeature *poFeature=new OGRFeature( poLayer->GetLayerDefn() ); poFeature->SetField( "contour", mContours[i].Elevation ); OGRLineString *poPolyline = new OGRLineString(); int num=static_cast<int>(mContours[i].Points.size()); poPolyline->setNumPoints(num); for(j=0;j<num;j++) { poPolyline->setPoint(j,mContours[i].Points[j].x,mContours[i].Points[j].y); } poFeature->SetGeometryDirectly(poPolyline); if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE ) { printf( "Failed to create feature in shapefile.\n" ); return; } } OGRDataSource::DestroyDataSource( poDS ); } void ContourLine::SetPath(char *path) { FilePath = path; } //计算2点之间的距离 double ContourLine::GetLengthBetweenPoint(Point P1,Point P2) { double length; length = sqrt((double)((P2.x - P1.x)*(P2.x - P1.x) + (P2.y - P1.y)*(P2.y - P1.y))); return length; } //计算线pContour的长度,并把长度结果存入length void ContourLine::GetLength(Line& pContour) { double tempLength;//两点之间的距离 double totalLength;//一条线的距离 totalLength = 0; //pContour中点的数目 int lineNumber = pContour.Points.size(); for(int i = 0; i < lineNumber-1;i++) { tempLength = GetLengthBetweenPoint(pContour.Points[i],pContour.Points[i+1]); totalLength = totalLength + tempLength; } //返回线段长度 pContour.Length = totalLength; }
在用G++编译的时候输入命令:g++ -c Shapefile.cpp -o Shapefile
会提示如下错误:
Shapefile.h:40:9: error: extra qualification ‘ContourLine::’ on member ‘GetLengthBetweenPoint’ [-fpermissive]
Shapefile.h:41:7: error: extra qualification ‘ContourLine::’ on member ‘GetLength’ [-fpermissive]
错误的原因是:类的定义中
double ContourLine::GetLengthBetweenPoint(Point P1,Point P2); void ContourLine::GetLength(Line& pContour);
不需要用
double ContourLine::,
或者类的函数声明和类的定义是放在一个文件里面,也不许要用***::
上述错误代码改为
double GetLengthBetweenPoint(Point P1,Point P2); void GetLength(Line& pContour);
OK,编译通过,错误解决。
时间: 2024-09-08 10:33:55