当前位置:网站首页>GPS original coordinates to Baidu map coordinates (pure C code)

GPS original coordinates to Baidu map coordinates (pure C code)

2022-07-05 14:45:00 Hua Weiyun

One 、 Introduction to the environment

GPS Module model : Zhongke microelectronics GPS modular

GPS Output raw data frame :

$GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F$GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D$GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37$BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A$GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B$GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C$GPGSV,3,3,10,31,50,287,36,32,66,018,*7F$BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62$GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D$GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14$GNZDA,114955.000,06,11,2017,00,00*47$GPTXT,01,01,01,ANTENNA OK*35

Two 、 Demand is introduced

obtain GPS After the original coordinate data , Want to use Baidu map API The interface directly displays the actual positioning .

The international longitude and latitude coordinate standard is WGS-84, At least the National Survey Bureau must be used in China GCJ- 02, Encrypt the location for the first time .

Baidu coordinates on this basis , the BD-09 Secondary encryption measures , More protection of personal privacy .

The coordinate system of Baidu's external interface is not GPS Collected true classics latitude , It needs to be converted through the coordinate conversion interface .

3、 ... and 、C The language code

The following code is in QtCreator Written in , Code can be ported to any support C Compile and run in the environment of language .

#include <QCoreApplication>#include <QString>#include <QDebug>extern C;{#include <math.h>;}class GPS_Data{public:    double lat; // latitude     double lng; // longitude     QString GPS_Data;};class GPS_Data gps_data;void GPS_ReadUasrtData();#define M_PI  3.14159265358979324double  a = 6378245.0;double  ee = 0.00669342162296594323;double  x_pi = M_PI * 3000.0 / 180.0;double wgs2gcj_lat(double x, double y){   double ret1 = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y  + 0.2 * sqrt(abs(x));   ret1 += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x  * M_PI)) * 2.0 / 3.0;   ret1 += (20.0 * sin(y * M_PI) + 40.0 * sin(y / 3.0 * M_PI)) * 2.0 / 3.0;   ret1 += (160.0 * sin(y / 12.0 * M_PI) + 320 * sin(y * M_PI  / 30.0)) * 2.0 / 3.0;   return ret1;}double  wgs2gcj_lng(double x, double y){    double ret2 = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1  * sqrt(abs(x));    ret2 += (20.0 *sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x  * M_PI)) * 2.0 / 3.0;    ret2 += (20.0 * sin(x * M_PI) + 40.0 * sin(x / 3.0 * M_PI)) * 2.0 / 3.0;    ret2 += (150.0 *sin(x / 12.0 * M_PI) + 300.0 * sin(x / 30.0  * M_PI)) * 2.0 / 3.0;    return ret2;}void wgs2gcj(double *lat,double *lng){    double dLat = wgs2gcj_lat(*lng - 105.0, *lat - 35.0);    double dLon = wgs2gcj_lng(*lng - 105.0, *lat - 35.0);    double radLat = *lat / 180.0 * M_PI;    double magic = sin(radLat);    magic = 1 - ee * magic * magic;    double sqrtMagic = sqrt(magic);    dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * M_PI);    dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * M_PI);    *lat = *lat + dLat;    *lng = *lng + dLon;}void gcj2bd(double *lat,double *lng){   double x = *lng, y = *lat;   double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);   double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);   *lng = z * cos(theta) + 0.0065;   *lat = z * sin(theta) + 0.006;}int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    GPS_ReadUasrtData();    // obtain GPS The original coordinates     double lat=gps_data.lat;    double lng=gps_data.lng;    // Coordinate transformation     wgs2gcj(&amp;lat,&amp;lng);    gcj2bd(&amp;lat,&amp;lng);    // Get the coordinates of Baidu map , It can be displayed directly on Baidu map     qDebug()&lt;&lt;&quot; latitude : &quot;&lt;&lt;QString(&quot;%1&quot;).arg(lat,0,'g',13);    qDebug()&lt;&lt;&quot; longitude : &quot;&lt;&lt;QString(&quot;%1&quot;).arg(lng,0,'g',13);    return a.exec();}void GPS_ReadUasrtData(){    /*GPS Original data frame */    gps_data.GPS_Data=&quot;$GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F&quot;            &quot;$GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D&quot;            &quot;$GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37&quot;            &quot;$BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A&quot;           &quot; $GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B&quot;            &quot;$GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C&quot;            &quot;$GPGSV,3,3,10,31,50,287,36,32,66,018,*7F&quot;            &quot;$BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62&quot;            &quot;$GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D&quot;            &quot;$GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14&quot;            &quot;$GNZDA,114955.000,06,11,2017,00,00*47&quot;            &quot;$GPTXT,01,01,01,ANTENNA OK*35&quot;;    /* analysis GPS Module data */    //QString lat; // latitude     //QString lng; // longitude     if(gps_data.GPS_Data.size()&gt;200)    {        int index=gps_data.GPS_Data.indexOf(&quot;$GNGGA&quot;);        if(index&gt;=0)        {            QString text=gps_data.GPS_Data.mid(index);            if(text.size()&gt;60)            {                QString lat=text.section(',',2,2);                QString lng=text.section(',',4,4);                if(lat.isEmpty()==false &amp;&amp; lng.isEmpty()==false)                {                    unsigned int int_data;                    double s_Longitude,s_latitude;                    // Convert latitude                     s_latitude=lat.toDouble();                    s_latitude=s_latitude/100;                    int_data=s_latitude;// Get the latitude integer part                     s_latitude=s_latitude-int_data;// Get the decimal part of latitude                     s_latitude=(s_latitude)*100;                    gps_data.lat=int_data+(s_latitude/60.0); // Get the converted value                     // Convert longitude                     s_Longitude=lng.toDouble();                    s_Longitude=s_Longitude/100;                    int_data=s_Longitude;// Get the longitude integer part                     s_Longitude=s_Longitude-int_data; // Get the longitude fraction                     s_Longitude=s_Longitude*100;                    //gai guo le                    gps_data.lng=int_data+(s_Longitude/60.0);                }            }        }        gps_data.GPS_Data.clear();    }}
原网站

版权声明
本文为[Hua Weiyun]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207051436339799.html