Proj4学习

news/2024/7/3 1:02:53

1. 地理坐标简介

地理坐标又称工程坐标

使用平面来近似地球的球面,在地表选取一个点,沿着这个点做地球的切平面

2. 初始化

bool init(const Eigen::Vector3d& point) {const char* geoccs = "+proj=geocent +datum=WGS84";const char* latlon = "+proj=latlong +datum=WGS84 +units=m";if (!(pjGeoccs_ = pj_init_plus(geoccs))) {LOG(ERROR) << "initzero init pjGeoccs fail";return false;}if (!(pjLatlon_ = pj_init_plus(latlon))) {LOG(ERROR) << "initzero init pjLatlon fail";return false;}double X = point.x * DEG_TO_RAD;double Y = point.y * DEG_TO_RAD;double Z = point.z;int iRev = pj_transform(pjLatlon_, pjGeoccs_, 1, 1, &X, &Y, &Z);if (iRev != 0) {LOG(ERROR) << "initzero pj transform fail";return false;}Eigen::Matrix4d orgin_geo;orgin_geo << 1,  0,  0,  0,0,  1,  0,  0,0,  0,  1,  0,X,  Y,  Z,  1;Eigen::Matrix4d rotZ;double z = (point.x - 270.0) / 180.0 * M_PI;rotZ << cos(z), sin(z), 0, 0,-sin(z), cos(z), 0, 0,0, 0, 1, 0,0, 0, 0, 1;Eigen::Matrix4d rotX;double x = (90.0 - point.y) / 180.0 * M_PI;rotX << 1, 0, 0, 0,0, cos(x), sin(x), 0,0, -sin(x), cos(x), 0,0, 0, 0, 1;l2gMatrix_ = rotX * rotZ * orgin_geo;Eigen::Matrix4d I = Eigen::Matrix4d::Identity(4, 4);g2lMatrix_ = l2gMatrix_.colPivHouseholderQr().solve(I);return true;}

3. GPS转地理坐标

 void gps2geo(const Eigen::Vecotor3d& gps, Eigen::Vecotor3d& geo) {double* X = new double[1];double* Y = new double[1];double* Z = new double[1];X[0] = gps.x * DEG_TO_RAD;Y[0] = gps.y * DEG_TO_RAD;Z[0] = gps.z;int iRev = pj_transform(pjLatlon_, pjGeoccs_, 1, 1, X, Y, Z);if (iRev != 0) {LOG(ERROR) << "gps2geo pj transform fail";return false;}Eigen::RowVector4d P;P<< X[0], Y[0], Z[0], 1.0;P = P * g2lMatrix_;geo.x = P(0);geo.y = P(1);geop.z = P(2);delete[] X;delete[] Y;delete[] Z;return true;}

4. 地理坐标转GPS

  void geo2gps(const Eigen::Vector3d& geo, Eigen::Vector3d& gps) {double* X = new double[1];double* Y = new double[1];double* Z = new double[1];Eigen::RowVector4d P;P << geo.x, geo.y geo.z, 1.0;P = P * l2gMatrix_;X[0] = P(0);Y[0] = P(1);Z[0] = P(2);int iRev = pj_transform(pjGeoccs_, pjLatlon_, 1, 1, X, Y, Z);if (iRev != 0) {std::cout<<"gps2geo pj transform fail"<<std::endl;return false;}gps.x = X[0] * RAD_TO_DEG;gps.y = Y[0] * RAD_TO_DEG;gps.z = Z[0];delete[] X;delete[] Y;delete[] Z;gpspt->time = geopt.time;return true;}

http://lihuaxi.xjx100.cn/news/248486.html

相关文章

4. matlab 中的axis与axes的区别

&#xff08;1&#xff09;axes产生坐标图形也就是将Figure的框图中左下角的坐标为&#xff08;0,0&#xff09;左上角的为&#xff08;1,1&#xff09; 就是将长宽都设置&#xff1a; 原点坐标&#xff08;0.1,0.2&#xff09; 终点的坐标&#xff08;0.3,0.4&#xff0…

C++对象赋值的四种方式

1. 引用作为参数的方式传递. 1 GetObject(Object& obj) 2 { 3 obj.value value1; 4 } 特点: 在外部构造一个对象. 把该对象以引用的方式传递到函数中. 从而实现对该对象的改变, 该参数实质是一个[out]类型的参数, 而非[in]类型的参数. 这里的引用可以称为别名. 点评: …

如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN

如何用BIND, GeoIP, Nginx, Varnish来创建你自己的高效的CDN网络&#xff1f;CDN&#xff0c;意思是Content Distrubtion Network&#xff0c;意思是内容分发网络&#xff0c;简单的说&#xff0c;就是全地域范围内的负载均衡&#xff0c;全地域的概念可以是全国&#xff0c;也…

你必须知道的.net学习总结

着几天在看《你必须知道的.net》&#xff0c;这次看书和以往不同&#xff0c;以前是把自己喜欢的章节看了。但是这次决定把一本书详细的看看。 在第一章第一节中主要讲的是“对象”,我想每一个程序员都对&#xff0c;“对象”有理解。 我来说说书中所说的对象吧。。 我只是把认…

混沌---

原文链接&#xff1a; 混沌数学及其软件模拟 - 叶飞影 - 博客园https://www.cnblogs.com/WhyEngine/p/3974515.html 混沌数学及其软件模拟这几天在研究混沌,并写了些程序将网上能找到的各种混沌模型以图形的形式显示出来.(一)混沌介绍混沌&#xff08;Chaos&#xff09;是指发生…

OpenCV读写YAML/XML文件

1. YAML 1.1. YAML格式 OpenCV识别和YAML格式必须带一个头 %YAML:1.0 --- T_camera_lidar: !!opencv-matrixrows: 4cols: 4dt: ddata: [ -9.9966749413220379e-01, -2.1254345991927007e-02,-1.4599792871676539e-02, -6.2313447310366470e-02,1.5385668712172389e-02, -3.7…

Loadrunner进行md5加密方法

本文主要介绍使用Loadrunner进行字符串md5加密的方法。 使用Loadrunner进行md5比较简单&#xff0c;首先是加载md5.h头文件&#xff0c;后使用头文件中的加密函数即可。 1. md5.h头文件内容如下 #ifndef MD5_H #define MD5_H #ifdef __alpha typedef unsigned int uint32; #els…

能和LoadRunner匹敌的VS2010/2012Web负载测试

VS自带的Web负载测试真的很大程度上能和专业的loadrunner媲美&#xff08;只是Web方面&#xff09;&#xff0c;上个report图吧&#xff08;如何实现&#xff0c;请往下拉&#xff09;&#xff1a; 看&#xff0c;能探测一堆的计数器&#xff08;上面红色打叉的是代表超过了基线…