最近,做了一段输水管道桩号计算的数据处理。
其中涉及,根据桩号计算坐标,在地质体中加入中线转点坐标的问题。
数据量有1500多条。一个个计算比较麻烦。所以考虑编程批量计算。
第一步:数据准备
1.中线转点坐标值(转点桩号里程,转点X,转点Y)
2.地质体信息(地质体桩号里程,待求X,待求Y,高程h,s1上地层编号,s2下地层编号,s1上地层属性,s2下地层属性,s1编码,s2编码)
第二步:编码
#include <iostream>
#include <fstream>
#include <string>
#include "vector3.h"
#include<iterator>
#include<iomanip>
#include <list>
#include <sstream>
#include <string>
#include <ctype.h>
using namespace std;
typedef struct CzHstuct
{
bool tf;//是否是中线点
int Id;
int linenumb;
double x,y,h,Length;
string s1,s2,stmp1,stmp2,s1zw,s2zw;
bool operator < (CzHstuct & b) {
return Length < b.Length;
}
};
//桩号坐标计算,x,y,z;z代表桩距
typedef struct CIrrPostion
{
int posnum;
POSTION *positionlist;
};
//计算输入数据
typedef struct CzjPosIndex
{
int Indexnum;
double *zjIndexlist;
};
//定义已知地质体信息
typedef struct CzHPosDataList
{
int Indexnum;
CzHstuct *posIndexlist;
};
//定义已知地质体信息
typedef struct CRecordxlList
{
int Indexnum;
string Nameofline;
int LineId;
};
char gEnergyFile[30];
typedef list<CRecordxlList> LISTRECORDLINE;
typedef list<CzHstuct> LISTCZHSTUCT;
全局变量记录桩号信息//线路I信息
LISTRECORDLINE meRecordCountNamelist;
LISTCZHSTUCT meListzhstruct;
//中线桩数据
LISTCZHSTUCT mezxzdataList;
LISTCZHSTUCT :: iterator iterzhst;//指针桩号
LISTCZHSTUCT :: iterator iterzxst;//指针中线桩号
LISTRECORDLINE::iterator iterxlst;//指针线路
//读取桩距列表
CzjPosIndex ReadposIndex()
{
CzjPosIndex PosIndexlist;
FILE *fp;
char stemp[50];
strcpy(gEnergyFile,"zjlist.txt");
//cinployfloat
fp = fopen( gEnergyFile, "r" );
if ( fp == NULL )
{
printf( "\n Can not open energy data file:%s\n", gEnergyFile);
exit(0);
// AfxMessageBox( "\n Can not open energy data,没有找到屋顶参数!提示!默认设置:(30,5) ");
// return Poslist;
}
fseek( fp, 0, SEEK_SET);
fscanf( fp, "%s", stemp);
while( strcmp( stemp,"Zjlist:" ) != 0) fscanf( fp, "%s", stemp);
fscanf( fp, "%d", &(PosIndexlist.Indexnum));
PosIndexlist.zjIndexlist =(double*)malloc(sizeof(double)* PosIndexlist.Indexnum);
for(int i=0;i<PosIndexlist.Indexnum;i++)
{
fscanf( fp, "%lf", &(PosIndexlist.zjIndexlist[i]));
}
fclose( fp );
return PosIndexlist;
}
//读取桩距坐标类表
CIrrPostion ReadPosdatas()
{
CIrrPostion Poslist;
FILE *fp;
char stemp[50];
strcpy(gEnergyFile,"zhzb.txt");
//cinploydouble
fp = fopen( gEnergyFile, "r" );
if ( fp == NULL )
{
printf( "\n Can not open energy data file:%s\n", gEnergyFile);
exit(0);
// AfxMessageBox( "\n Can not open energy data,没有找到屋顶参数!提示!默认设置:(30,5) ");
// return Poslist;
}
fseek( fp, 0, SEEK_SET);
fscanf( fp, "%s", stemp);
while( strcmp( stemp,"Zhzbdata:" ) != 0) fscanf( fp, "%s", stemp);
fscanf( fp, "%d", &(Poslist.posnum));
Poslist.positionlist =(POSTION*)malloc(sizeof(POSTION)* Poslist.posnum);
for(int i=0;i<Poslist.posnum;i++)
{
fscanf( fp, "%lf%lf%lf", &(Poslist.positionlist[i].z),&(Poslist.positionlist[i].x),&(Poslist.positionlist[i].y));
}
fclose( fp );
return Poslist;
}
//读取需要计算的桩号地质体信息
void Preadzhdata()
{
// CzHPosDataList zHdataList;
//临时变量桩号信息
CzHstuct sengleCzhstruct;
CRecordxlList sengleCRecordline;
int mecount=0;
int melinenumb=0;
cout << setprecision(4) << fixed;
// LISTINT::iterator plist; //读取数据
std::ifstream fin("newformatread.txt", std::ios::in);
char line[1024]={0};
while(fin.getline(line, sizeof(line)))
{
std::stringstream word(line);
if(isdigit(line[0])||isdigit(line[1]))//如果是数字
{
mecount++;
///
word >> sengleCzhstruct.Length >> sengleCzhstruct.x >> sengleCzhstruct.y>> sengleCzhstruct.h>> sengleCzhstruct.s1>> sengleCzhstruct.stmp1>> sengleCzhstruct.s1zw>> sengleCzhstruct.s2>>sengleCzhstruct.stmp2>>sengleCzhstruct.s2zw;
sengleCzhstruct.Id=mecount;
sengleCzhstruct.tf=false;
sengleCzhstruct.linenumb=melinenumb;
meListzhstruct.push_back(sengleCzhstruct);
std::cout <<setw(6)<< mecount << " " << sengleCzhstruct.Length <<" " << sengleCzhstruct.x <<" " << sengleCzhstruct.y <<" " << sengleCzhstruct.h <<" " << sengleCzhstruct.s1 <<" " << sengleCzhstruct.s2 <<" " << sengleCzhstruct.stmp1 <<" " << sengleCzhstruct.s2 <<" "<<sengleCzhstruct.stmp2<<" "<<sengleCzhstruct.s2zw<< std::endl;
}
else
{
word >> sengleCRecordline.Nameofline;
sengleCRecordline.Indexnum=mecount;
sengleCRecordline.LineId=melinenumb;
std::cout << "线名: " << sengleCRecordline.Nameofline << " 个数: "<<sengleCRecordline.Indexnum <<std::endl;
meRecordCountNamelist.push_back(sengleCRecordline);
mecount=0;
melinenumb++;
}
}
fin.clear();
fin.close();
}
//读取中线桩信息
void Readzxlistdata()
{
//临时变量桩号信息中线点
CzHstuct zxdCzhstruct;
cout << setprecision(4) << fixed;
int mecount=0;
// LISTINT::iterator plist; //读取数据
std::ifstream fin("xinjianzxdata.txt", std::ios::in);
char line[524]={0};
while(fin.getline(line, sizeof(line)))
{
std::stringstream word(line);
if(isdigit(line[0])||isdigit(line[1]))//如果是数字
{
mecount++;
word >> zxdCzhstruct.Length >> zxdCzhstruct.x >> zxdCzhstruct.y;
zxdCzhstruct.Id=1000000+mecount;
zxdCzhstruct.tf=true;
mezxzdataList.push_back(zxdCzhstruct);
///std::cout << mecount << " " << zxdCzhstruct.Length <<" " << zxdCzhstruct.x <<" " << zxdCzhstruct.y <<" " << zxdCzhstruct.h <<" " << zxdCzhstruct.s1 <<" " << zxdCzhstruct.s2 <<" " << zxdCzhstruct.stmp1 <<" " << zxdCzhstruct.stmp2 << std::endl;
std::cout<<setw(6) << mecount << " : " << zxdCzhstruct.Length <<" " << zxdCzhstruct.x <<" " << zxdCzhstruct.y << std::endl;
}
else
{
std::cout << "错误: " << " 第几???: "<<mecount <<std::endl;
}
}
fin.clear();
fin.close();
}
int main()
{
//读取待测桩号数据数据得到所有线路的桩号点信息和路线信息
printf( "\n ----------------读取桩号地质体信息--------------------\n");
Preadzhdata();
printf( "\n ----------------读取中线坐标信息---------------------\n");
Readzxlistdata();
printf( "\n----------------------------------------------\n");
printf( "\n 开始计算\n----------------------------------------------\n");
///
// LISTRECORDLINE meRecordCountNamelist;
// LISTCZHSTUCT meListzhstruct;
//中线桩数据
// LISTCZHSTUCT mezxzdataList;
// LISTCZHSTUCT :: iterator iterzhst;//指针桩号
// LISTCZHSTUCT :: iterator iterzxst;//指针中线桩号
// LISTRECORDLINE::iterator iterxlst;//指针线路
//私有指针
LISTCZHSTUCT :: iterator iterzhstper;//指针桩号
LISTCZHSTUCT :: iterator iterzhstnext;//指针桩号
ofstream outfile("NewZhzbZHresult.txt", ios_base::out);
if (!outfile)
{
cerr<<"error: can not open \"NewZhzbZHresult.txt\" for output\n";
exit(-1);
}
outfile.precision(4);
outfile.setf(ios::fixed);
cout << setprecision(4) << fixed;
int Errorcount=0;
double tmpzj;
double tempA,tempB;
int perId;
int pnextId=0;
double a=0,b=0,zhzbx=0,zhzby=0;
//首先计算地质体桩号坐标信息
for (iterzhst=meListzhstruct.begin();iterzhst!=meListzhstruct.end();iterzhst++)
{
perId=mezxzdataList.size();//获得中线点的个数
pnextId=0;
tempA=500000000;
tempB=500000000;
tmpzj=iterzhst->Length;
//实现插入
for (iterzxst=mezxzdataList.begin();iterzxst!=mezxzdataList.end();iterzxst++)
{
if(iterzxst->Length<=tmpzj)
{
if (tmpzj-iterzxst->Length <tempA)
{
tempA=tmpzj-iterzxst->Length ;
perId=iterzxst->Id;
iterzhstper=iterzxst;
}
}
if(iterzxst->Length>tmpzj)
{
if (iterzxst->Length-tmpzj <tempB)
{
tempB=iterzxst->Length-tmpzj;
pnextId=iterzxst->Id;
iterzhstnext=iterzxst;
}
}
}
if( perId!=mezxzdataList.size()&&pnextId!=0&& iterzhstper->Length <=tmpzj && iterzhstnext->Length>tmpzj )
{
a=tmpzj-iterzhstper->Length;
b=iterzhstnext->Length-tmpzj;
/* zhzbx = mIrrpos.positionlist[perId].x+ (mIrrpos.positionlist[pnextId].x-mIrrpos.positionlist[perId].x)*a /(a+b) ;
zhzby = mIrrpos.positionlist[perId].y+ (mIrrpos.positionlist[pnextId].y-mIrrpos.positionlist[perId].y)*a /(a+b) ;*/
if (a<0||b<0){ cout<<"我去!Error 出现异常!"<< std::endl ;}
/* zhzbx = (a*iterzhstnext->x+ b*iterzhstper->x )/(a+b) ;
zhzby = (a*iterzhstnext->y + b*iterzhstper->y )/(a+b) ;*/
iterzhst->x = (a*iterzhstnext->x+ b*iterzhstper->x )/(a+b) ;
iterzhst->y= (a*iterzhstnext->y + b*iterzhstper->y )/(a+b) ;
outfile<< iterzhst->Id <<" "<<iterzhst->Length<<" "<<iterzhst->x<<" "<<iterzhst->y<<" "<<iterzhst->h<<" "<<iterzhst->s1<<" "<<iterzhst->stmp1<<" "<<iterzhst->s1zw<<" "<<iterzhst->s2<<" "<<iterzhst->stmp2<<" "<<iterzhst->s2zw<<std::endl ;
cout<< iterzhst->Id <<" "<<iterzhst->Length<<" "<<iterzhst->x<<" "<<iterzhst->y<<" "<<iterzhst->h<<" "<<iterzhst->s1<<" "<<iterzhst->s2<<" "<<iterzhst->stmp1<<" "<<iterzhst->stmp2<<std::endl ;
}
else
{
outfile<< iterzhst->Id <<" "<<iterzhst->Length<<" "<<iterzhst->x<<" "<<iterzhst->y<<" "<<iterzhst->h<<" "<<iterzhst->s1<<" "<<iterzhst->stmp1<<" "<<iterzhst->s1zw<<" "<<iterzhst->s2<<" "<<iterzhst->stmp2<<" "<<iterzhst->s2zw<<std::endl ;
// outfile<< iterzhst->Id <<" "<<iterzhst->Length<<" "<<iterzhst->x<<" "<<iterzhst->y<<" "<<iterzhst->h<<" "<<iterzhst->s1<<" "<<iterzhst->s2<<" "<<iterzhst->stmp1<<" "<<iterzhst->stmp2<<std::endl ;
cout<< iterzhst->Id <<" Error 出现异常!"<< std::endl ;
Errorcount++;
}
}
outfile.close();
printf( "\n -------------------------------------\n");
printf( "\n 计算结束生成文件:Zhzbresult.txt");
if (Errorcount>0)
{
cout<<"Error 出现异常个数 : "<<Errorcount << std::endl ;
}
逐线插值生成中线点信息。
// LISTRECORDLINE meRecordCountNamelist;
// LISTCZHSTUCT meListzhstruct;
//中线桩数据
// LISTCZHSTUCT mezxzdataList;
// LISTCZHSTUCT :: iterator iterzhst;//指针桩号
// LISTCZHSTUCT :: iterator iterzxst;//指针中线桩号
// LISTRECORDLINE::iterator iterxlst;//指针线路
// LISTCZHSTUCT :: iterator iterzhstper;//指针下面新含义
//LISTCZHSTUCT :: iterator iterzhstnext;//指针下面新含义
//临时中线
ofstream Lastoutfile("LastZhRresult.txt", ios_base::out);
if (!Lastoutfile)
{
cerr<<"error: can not open \"LastZhRresult.txt\" for output\n";
exit(-1);
}
Lastoutfile.precision(4);
Lastoutfile.setf(ios::fixed);
cout << setprecision(4) << fixed;
LISTCZHSTUCT tmplist;//临时桩号
LISTCZHSTUCT tmpzxlist;//临时中线桩号
CzHstuct lnewzxdCzhstruct;//临时桩号定义
double tmplengthmin,tmplengthmax;//最大最小临时
for (iterxlst=meRecordCountNamelist.begin();iterxlst!=meRecordCountNamelist.end();iterxlst++)//循环逐条地层
{
tmpzxlist.clear();
tmplist.clear();//清空上条地层信息
//首先读取已有地址体线路信息
for(iterzhst=meListzhstruct.begin();iterzhst!=meListzhstruct.end(); iterzhst++)//循环所有的地层逐条选取
{
if(iterzhst->linenumb==iterxlst->LineId )
{
lnewzxdCzhstruct.Length=iterzhst->Length;
lnewzxdCzhstruct.x=iterzhst->x;
lnewzxdCzhstruct.y=iterzhst->y;
lnewzxdCzhstruct.h=iterzhst->h;
lnewzxdCzhstruct.Id=iterzhst->Id;
lnewzxdCzhstruct.linenumb=iterzhst->linenumb;
lnewzxdCzhstruct.s1=iterzhst->s1;
lnewzxdCzhstruct.s2=iterzhst->s2;
lnewzxdCzhstruct.stmp1=iterzhst->stmp1;
lnewzxdCzhstruct.stmp2=iterzhst->stmp2;
lnewzxdCzhstruct.s1zw=iterzhst->s1zw;
lnewzxdCzhstruct.s2zw=iterzhst->s2zw;
lnewzxdCzhstruct.tf=iterzhst->tf;
tmplist.push_back(lnewzxdCzhstruct);
}
}
///找到已有线路的最大桩号,最小桩号
tmplist.sort();//按桩号长度排序
iterzhstper= tmplist.begin();//第一个
tmplengthmin=iterzhstper->Length;//最近
iterzhstnext=tmplist.end();//最后一个
iterzhstnext--;//最远
tmplengthmax=iterzhstnext->Length;//最大值
//插入中线点
for(iterzxst=mezxzdataList.begin();iterzxst!=mezxzdataList.end(); iterzxst++)
{
if(iterzxst->Length< tmplengthmax &&iterzxst->Length>tmplengthmin )
{
tempA=500000000;
tempB=500000000;
tmpzj=iterzxst->Length;
///******查找最邻近的桩号指针
for(iterzhst=tmplist.begin();iterzhst!=tmplist.end(); iterzhst++)
{
if(iterzhst->Length<=tmpzj)
{
if (tmpzj-iterzhst->Length <tempA)
{
tempA=tmpzj-iterzhst->Length ;
perId=iterzhst->Id;
iterzhstper=iterzhst;
}
}
if(iterzhst->Length>tmpzj)
{
if (iterzhst->Length-tmpzj <tempB)
{
tempB=iterzhst->Length-tmpzj;
pnextId=iterzhst->Id;
iterzhstnext=iterzhst;
}
}
}
lnewzxdCzhstruct.Length=iterzxst->Length;
lnewzxdCzhstruct.x=iterzxst->x;
lnewzxdCzhstruct.y=iterzxst->y;
lnewzxdCzhstruct.h= ((iterzhstper->h)*tempB+(iterzhstnext->h)*tempA)/(tempA+tempB) ;
lnewzxdCzhstruct.Id=iterzxst->Id;
lnewzxdCzhstruct.linenumb=iterxlst->LineId;
if (tempA<tempB)
{
lnewzxdCzhstruct.s1=iterzhstper->s1;
lnewzxdCzhstruct.s2=iterzhstper->s2;
lnewzxdCzhstruct.stmp1=iterzhstper->stmp1;
lnewzxdCzhstruct.stmp2=iterzhstper->stmp2;
lnewzxdCzhstruct.s1zw=iterzhstper->s1zw;
lnewzxdCzhstruct.s2zw=iterzhstper->s2zw;
}
else
{
lnewzxdCzhstruct.s1=iterzhstnext->s1;
lnewzxdCzhstruct.s2=iterzhstnext->s2;
lnewzxdCzhstruct.stmp1=iterzhstnext->stmp1;
lnewzxdCzhstruct.stmp2=iterzhstnext->stmp2;
lnewzxdCzhstruct.s1zw=iterzhstnext->s1zw;
lnewzxdCzhstruct.s2zw=iterzhstnext->s2zw;
}
lnewzxdCzhstruct.tf=iterzxst->tf;
tmpzxlist.push_back(lnewzxdCzhstruct);
}
}
//开始以中线长度排序
for(iterzhst=tmpzxlist.begin();iterzhst!=tmpzxlist.end();iterzhst++ )
{
lnewzxdCzhstruct.Length=iterzhst->Length;
lnewzxdCzhstruct.x=iterzhst->x;
lnewzxdCzhstruct.y=iterzhst->y;
lnewzxdCzhstruct.h=iterzhst->h;
lnewzxdCzhstruct.Id=iterzhst->Id;
lnewzxdCzhstruct.linenumb=iterzhst->linenumb;
lnewzxdCzhstruct.s1=iterzhst->s1;
lnewzxdCzhstruct.s2=iterzhst->s2;
lnewzxdCzhstruct.stmp1=iterzhst->stmp1;
lnewzxdCzhstruct.stmp2=iterzhst->stmp2;
lnewzxdCzhstruct.s1zw=iterzhst->s1zw;
lnewzxdCzhstruct.s2zw=iterzhst->s2zw;
lnewzxdCzhstruct.tf=iterzhst->tf;
tmplist.push_back(lnewzxdCzhstruct);
}
tmplist.sort();//再次排序
for(iterzhst=tmplist.begin();iterzhst!=tmplist.end();iterzhst++ )
{
Lastoutfile<< iterzhst->Id <<" "<<iterzhst->Length<<" "<<iterzhst->x<<" "<<iterzhst->y<<" "<<iterzhst->h<<" "<<iterzhst->s1<<" "<<iterzhst->stmp1<<" "<<iterzhst->s1zw<<" "<<iterzhst->s2<<" "<<iterzhst->stmp2<<" "<<iterzhst->s2zw<<" "<<iterzhst->linenumb<<" "<<iterzhst->tf<<std::endl ;
cout<< iterzhst->linenumb << std::endl ;
}
Lastoutfile<<iterxlst->Nameofline<<" "<<iterxlst->LineId<<" "<<tmplist.size() <<std::endl ;
cout<< "--------------------------------------" << std::endl ;
}
Lastoutfile.close();
printf( "\n -------------------------------------\n");
printf( "\n 计算结束生成文件:LastZhRresult.txt");
printf( "\n -------------------------------------\n");
int pouse;
cin >>pouse;
return 0 ;
}
最终解决。批量生成
没有项目工程文件,只有两个代码和实例文件,程序小白就不要下了。