namespace openMVG {namespace sfm {/// Define a collection of IntrinsicParameter (indexed by View::id_intrinsic)using Intrinsics = Hash_Map<IndexT, std::shared_ptr<cameras::IntrinsicBase>>;/// Define a collection of Pose (indexed by View::id_pose)using Poses = Hash_Map<IndexT, geometry::Pose3>;/// Define a collection of View (indexed by View::id_view)using Views = Hash_Map<IndexT, std::shared_ptr<View>>;/// Generic SfM data container/// Store structure and camera properties:structSfM_Data{/// Considered viewsViews views;/// Considered poses (indexed by view.id_pose)Poses poses;/// Considered camera intrinsics (indexed by view.id_intrinsic)Intrinsics intrinsics;/// Structure (3D points with their 2D observations)Landmarks structure;/// Controls points (stored as Landmarks (id_feat has no meaning here))Landmarks control_points;/// Root Views pathstd::string s_root_path;//--// Accessors//--const Views &GetViews()const{return views;}const Poses &GetPoses()const{return poses;}const Intrinsics &GetIntrinsics()const{return intrinsics;}const Landmarks &GetLandmarks()const{return structure;}const Landmarks &GetControl_Points()const{return control_points;}/// Check if the View have defined intrinsic and poseboolIsPoseAndIntrinsicDefined(const View * view)const{if(!view)returnfalse;return(view->id_intrinsic != UndefinedIndexT &&view->id_pose != UndefinedIndexT &&intrinsics.find(view->id_intrinsic)!= intrinsics.end()&&poses.find(view->id_pose)!= poses.end());}/// Get the pose associated to a viewconst geometry::Pose3 GetPoseOrDie(const View * view)const{return poses.at(view->id_pose);}};}// namespace sfm}// namespace openMVG
lla转换为ecef
Vec3 lla_to_ecef(double lat,double lon,double alt
){constdouble clat =cos(D2R(lat));constdouble slat =sin(D2R(lat));constdouble clon =cos(D2R(lon));constdouble slon =sin(D2R(lon));constdouble a2 =Square(WGS84_A);constdouble b2 =Square(WGS84_B);constdouble L =1.0/sqrt(a2 *Square(clat)+ b2 *Square(slat));constdouble x =(a2 * L + alt)* clat * clon;constdouble y =(a2 * L + alt)* clat * slon;constdouble z =(b2 * L + alt)* slat;returnVec3(x, y, z);}
lla转换为utm
/**** Convert WGS84 lon,lat,alt data to UTM data (Universal Transverse Mercator)** @param lat Latitude in degree** @param lon Longitude in degree** @param alt Altitude relative to the WGS84 ellipsoid** @return UTM corresponding coordinates**/
Vec3 lla_to_utm(double lat,double lon,double alt,double a = WGS84_A,double b = WGS84_B
){a /=1000;// meters to kilometersb /=1000;// meters to kilometers/// CONSTANTSstaticconstdouble N0_n =0;staticconstdouble N0_s =1e4;staticconstdouble E0 =5e2;staticconstdouble k0 =0.9996;constdouble f =(a - b)/ a;constdouble n = f /(2- f);constdouble n_2 = n * n;constdouble n_3 = n_2 * n;constdouble n_4 = n_3 * n;constdouble n_5 = n_4 * n;constdouble n_6 = n_5 * n;constdouble n_7 = n_6 * n;constdouble n_8 = n_7 * n;constdouble n_9 = n_8 * n;constdouble n_10 = n_9 * n;constint lon_zone =1+floor((lon +180)/6);constdouble lon_0 =D2R(3+6*(lon_zone -1)-180);lat =D2R(lat);lon =D2R(lon);constdouble A = a /(1+ n)*(1+ n_2/4+ n_4/64+ n_6/256+ n_8*25.0/16384.0+ n_10*49.0/65536.0);constdouble a1 =(1.0/2.0)*n -(2.0/3.0)*n_2 +(5.0/16.0)*n_3 +(41.0/180.0)*n_4 -(127.0/288.0)*n_5 +(7891.0/37800.0)*n_6 +(72161.0/387072.0)*n_7 -(18975107.0/50803200.0)*n_8 +(60193001.0/290304000.0)*n_9 +(134592031.0/1026432000.0)*n_10;constdouble a2 =(13.0/48.0)*n_2 -(3.0/5.0)*n_3 +(557.0/1440.0)*n_4 +(281.0/630.0)*n_5 -(1983433.0/1935360.0)*n_6 +(13769.0/28800.0)*n_7 +(148003883.0/174182400.0)*n_8 -(705286231.0/465696000.0)*n_9 +(1703267974087.0/3218890752000.0)*n_10;constdouble a3 =(61.0/240.0)*n_3 -(103.0/140.0)*n_4 +(15061.0/26880.0)*n_5 +(167603.0/181440.0)*n_6 -(67102379.0/29030400.0)*n_7 +(79682431.0/79833600.0)*n_8 +(6304945039.0/2128896000.0)*n_9 -(6601904925257.0/1307674368000.0)*n_10;constdouble a4 =(49561.0/161280.0)*n_4 -(179.0/168.0)*n_5 +(6601661.0/7257600.0)*n_6 +(97445.0/49896.0)*n_7 -(40176129013.0/7664025600.0)*n_8 +(138471097.0/66528000.0)*n_9 +(48087451385201.0/5230697472000.0)*n_10;constdouble a5 =(34729.0/80640.0)*n_5 -(3418889.0/1995840.0)*n_6 +(14644087.0/9123840.0)*n_7 +(2605413599.0/622702080.0)*n_8 -(31015475399.0/2583060480.0)*n_9 +(5820486440369.0/1307674368000.0)*n_10;constdouble a6 =(212378941.0/319334400.0)*n_6 -(30705481.0/10378368.0)*n_7 +(175214326799.0/58118860800.0)*n_8 +(870492877.0/96096000.0)*n_9 -(1328004581729009.0/47823519744000.0)*n_10;constdouble a7 =(1522256789.0/1383782400.0)*n_7 -(16759934899.0/3113510400.0)*n_8 +(1315149374443.0/221405184000.0)*n_9 +(71809987837451.0/3629463552000.0)*n_10;constdouble a8 =(1424729850961.0/743921418240.0)*n_8 -(256783708069.0/25204608000.0)*n_9 +(2468749292989891.0/203249958912000.0)*n_10;constdouble a9 =(21091646195357.0/6080126976000.0)*n_9 -(67196182138355857.0/3379030566912000.0)*n_10;constdouble a10 =(77911515623232821.0/12014330904576000.0)*n_10;constdouble t =sinh(atanh(sin(lat))-2*sqrt(n)/(1+n)*atanh(2*sqrt(n)/(1+n)*sin(lat)));constdouble xi =atan(t/cos(lon-lon_0));constdouble eta =atanh(sin(lon-lon_0)/sqrt(1+t*t));constdouble N0 =(lat >0? N0_n : N0_s);constdouble E = E0 + k0 * A *(eta + a1*cos(2*1*xi)*sinh(2*1*eta)+ a2*cos(2*2*xi)*sinh(2*2*eta)+ a3*cos(2*3*xi)*sinh(2*3*eta)+ a4*cos(2*4*xi)*sinh(2*4*eta)+ a5*cos(2*5*xi)*sinh(2*5*eta)+ a6*cos(2*6*xi)*sinh(2*6*eta)+ a7*cos(2*7*xi)*sinh(2*7*eta)+ a8*cos(2*8*xi)*sinh(2*8*eta)+ a9*cos(2*9*xi)*sinh(2*9*eta)+ a10*cos(2*10*xi)*sinh(2*10*eta));constdouble N = N0 + k0 * A *(xi + a1*sin(2*1*xi)*cosh(2*1*eta)+ a2*sin(2*2*xi)*cosh(2*2*eta)+ a3*sin(2*3*xi)*cosh(2*3*eta)+ a4*sin(2*4*xi)*cosh(2*4*eta)+ a5*sin(2*5*xi)*cosh(2*5*eta)+ a6*sin(2*6*xi)*cosh(2*6*eta)+ a7*sin(2*7*xi)*cosh(2*7*eta)+ a8*sin(2*8*xi)*cosh(2*8*eta)+ a9*sin(2*9*xi)*cosh(2*9*eta)+ a10*sin(2*10*xi)*cosh(2*10*eta));// Scale E,N from kilometers to metersreturnVec3(E *1000, N *1000, alt);}