Browse Source

change driver_map_xodrload.

yuchuli 2 years ago
parent
commit
e6ea519352

+ 1 - 0
src/common/common/xodr/OpenDrive/OpenDriveXmlParser.cpp

@@ -65,6 +65,7 @@ bool OpenDriveXmlParser::ParseGeoReferenceLon0Lat0(std::string strgr, double & l
     return true;
 }
 
+#include <iostream>
 /**
  * The following methods are used to read the data from the XML file and fill in the the OpenDrive structure
  * Methods follow the hierarchical structure and are called automatically when ReadFile is executed

+ 3 - 1
src/driver/driver_gps_hcp2/driver_gps_hcp2.pro

@@ -41,11 +41,13 @@ LIBS += -livprotoif
 
 
 
-#DEFINES += USE_UTM
+DEFINES += USE_UTM
 
 if(contains(DEFINES,USE_UTM)){
 LIBS += -lGeographic
 }
 
+LIBS += -lproj
+
 
 

+ 65 - 4
src/driver/driver_gps_hcp2/main.cpp

@@ -3,19 +3,80 @@
 #include "ivversion.h"
 #include "hcp2.h"
 
+#include <iostream>
+
 
 iv::Ivlog * givlog = nullptr;
 iv::Ivfault *gfault = nullptr;
 
 #include "gnss_coordinate_convert.h"
 
+#include "proj.h"
+
 int main(int argc, char *argv[])
 {
 
-    double lat = 28.32;
-    double lon = 117.81;
-    double xv,yv;
-    GaussProjCal(lon,lat,&xv,&yv);
+
+    PJ_CONTEXT *C;//用于处理多线程程序
+        PJ *P;//初始化投影目标
+        PJ *norm;//初始化投影目标
+        PJ_COORD ap, bp,cp;//初始化投影坐标
+
+
+        C = proj_context_create();//创建多线程,由于本示例为单线程,此处为展示作用
+
+
+        P = proj_create_crs_to_crs (C,
+                                    "WGS84",
+                                    "+proj=tmerc +ellps=WGS84 +datum=WGS84 +units=m +lat_0=28.3252659663377 +lon_0=117.810536087614 +no_defs", /* or EPSG:32632 */
+                                    NULL);
+  //      P = proj_create(C,"+proj=tmerc +ellps=WGS84 +datum=WGS84 +units=m +lat_0=28.3252659663377 +lon_0=117.810536087614 +no_defs");
+
+        if (0 == P) {
+            std::cout << "Failed to create transformation object." << stderr << endl;
+            return 1;
+        }//如果P中两个投影的字符串不符合proj定义,提示转换失败
+
+        norm = proj_normalize_for_visualization(C, P);
+
+            if (0 == norm) {
+
+                fprintf(stderr, "Failed to normalize transformation object.\n");
+
+                return 1;
+
+            }
+
+            proj_destroy(P);
+
+            P = norm;
+
+
+        ap = proj_coord(117.8080745, 28.3220144, 0, 0);//设定待转换的投影坐标,此处分别为经度,纬度,高程,时间
+        /* transform to UTM zone 32, then back to geographical */
+        bp = proj_trans(P, PJ_FWD, ap);//投影转换,fwd代表源投影转换成目标投影,INV代表目标投影转换为源投影
+        std::cout << "East: " << bp.enu.e << "; North:" << bp.enu.n <<endl;;//经纬度转化为xy坐标
+
+        bp.enu.e = 0;
+        bp.enu.n = 0;
+        bp = proj_trans(P, PJ_INV, bp);//xy坐标转化为经纬度坐标
+        std::cout << "Longitude: " << bp.lp.lam << "; Latitude: " << bp.lp.phi <<endl;;//lam为经度,phi为纬度
+
+        cp.enu.e = 0;
+        cp.enu.n = 0;
+        cp = proj_trans(P, PJ_INV, cp);//xy坐标转化为经纬度坐标
+    double lat1 = 28.3252660;
+    double lon1 = 117.8105351;
+    double xv1,yv1;
+    GaussProjCal(lon1,lat1,&xv1,&yv1);
+
+    double lat2 = 28.3220144;
+    double lon2 = 117.8080745;
+    double xv2,yv2;
+    GaussProjCal(lon2,lat2,&xv2,&yv2);
+
+    qDebug("relx: %f rely::%f ",xv2-xv1,yv2-yv1);
+
     showversion("driver_gps_hcp2");
     QCoreApplication a(argc, argv);
 

+ 2 - 0
src/driver/driver_map_xodrload/driver_map_xodrload.pro

@@ -85,4 +85,6 @@ if(contains(DEFINES,USE_UTM)){
 LIBS += -lGeographic
 }
 
+LIBS += -lproj
+
 

+ 57 - 0
src/driver/driver_map_xodrload/main.cpp

@@ -39,6 +39,14 @@
 #include "service_roi_xodr.h"
 #include "ivservice.h"
 
+#include "proj.h"
+
+
+PJ_CONTEXT *C;//用于处理多线程程序
+    PJ *P;//初始化投影目标
+    PJ *norm;//初始化投影目标
+
+
 OpenDrive mxodr;
 xodrdijkstra * gpxd;
 bool gmapload = false;
@@ -52,6 +60,8 @@ bool gbExtendMap = true;
 static bool gbSideEnable = false;
 static bool gbSideLaneEnable = false;
 
+static std::string gstrcdata;
+
 static void * gpa;
 static void * gpasrc;
 static void * gpmap;
@@ -311,6 +321,8 @@ void CalcLatLon(const double lat0,const double lon0,const double hdg0,
                 const double x,const double y,const double xyhdg,
                 double &lat,double & lon, double & hdg)
 {
+
+
     double x0,y0;
     GaussProjCal(lon0,lat0,&x0,&y0);
     double x_gps,y_gps;
@@ -324,6 +336,16 @@ void CalcLatLon(const double lat0,const double lon0,const double hdg0,
 //    hdg = hdg0 - xyhdg * 180.0/M_PI;
     while(hdg < 0)hdg = hdg + 360;
     while(hdg >= 360)hdg = hdg - 360;
+
+    if(gstrcdata.length()>3)
+    {
+        PJ_COORD cp;//初始化投影坐标
+        cp.enu.e = x;
+        cp.enu.n = y;
+        cp = proj_trans(P, PJ_INV, cp);//xy坐标转化为经纬度坐标
+        lon = cp.lp.lam;
+        lat = cp.lp.phi;
+    }
 }
 
 class xodrobj
@@ -1218,6 +1240,41 @@ int main(int argc, char *argv[])
 
     std::string strsidelaneenable = xp.GetParam("sidelaneenable","false");
 
+    gstrcdata = xp.GetParam("cdata","");
+
+    std::cout<<" cdata: "<<gstrcdata.data()<<std::endl;
+
+    if(gstrcdata.length()>3)
+    {
+        C = proj_context_create();//创建多线程,由于本示例为单线程,此处为展示作用
+
+
+        P = proj_create_crs_to_crs (C,
+                                    "WGS84",
+                                    "+proj=tmerc +ellps=WGS84 +datum=WGS84 +units=m +lat_0=28.3252659663377 +lon_0=117.810536087614 +no_defs", /* or EPSG:32632 */
+                                    NULL);
+        //      P = proj_create(C,"+proj=tmerc +ellps=WGS84 +datum=WGS84 +units=m +lat_0=28.3252659663377 +lon_0=117.810536087614 +no_defs");
+
+        if (0 == P) {
+            std::cout << "Failed to create transformation object." << stderr << std::endl;
+            return 1;
+        }//如果P中两个投影的字符串不符合proj定义,提示转换失败
+
+        norm = proj_normalize_for_visualization(C, P);
+
+        if (0 == norm) {
+
+            fprintf(stderr, "Failed to normalize transformation object.\n");
+
+            return 1;
+
+        }
+
+        proj_destroy(P);
+
+            P = norm;
+    }
+
 
     glat0 = atof(strlat0.data());
     glon0 = atof(strlon0.data());