最近想用C语言在Linux上开发一个简单的gps接口程序,能读取显示经度纬度的那种。

最近想用C语言在Linux上开发一个简单的gps接口程序,能读取显示经度纬度的那种。,第1张

权威《unix网络编程》。

做这个事情大概分这么几步。

一:gps设备先通过某种手段上网(可以是拨号上网,wifi。。。。)

二:gps设备向服务器(就是你运行程序的机器)申请连接。可以用域名或者IP找到你的服务器。

三:服务器接受连接。

四:你跟这个gps设备提前预定好。你们的通信形式。

常用的大概也就是,一问一答。你可以通过tcp连接发请求指令给设备,设备收到以后给你回复。然后你只要分析回复指令就就行了。

具体怎么监听连接,怎么收发。书上说的很清楚。

连接到 GPS 卫星并确定您的位置。

注:某些型号不支持 GPS 功能

如果安装在计算机中的 PCI Express 迷你卡支持 GPS,那么您的计算机可接收来自 GPS 卫星的信号并确定自己的位置。如果计算机已连接到因特网,您可以在 Google 地图或 Microsoft® Live Search Maps 提供的实时图中查找到您的位置。

您也可以下载和安装 GPS 应用程序,如 Google 地球。

要连接到 GPS 卫星,请按如下 *** 作启动ThinkVantage® GPS:

对于 Windows® 7:单击开始 --> 控制面板 --> 以大图标方式查看列表,选择Lenovo的GPS。

对于 Windows Vista® 和 Windows XP:单击开始 --> 所有程序 --> ThinkVantage --> ThinkVantage GPS。

有关设置和使用ThinkVantage GPS 的更多信息,请参阅程序的帮助信息。

除了经度、纬度和海拔,全球定位系统(GPS)提供一个关键的第四维参数-时间。每一个GPS卫星都装有多台原子钟为GPS信号提供非常精确的时间数据。GPS接收机可以将这些信号解码,有效地使每一个接收机与那些原子钟同步。这就使用户能够以万亿分之一秒的精确度确定时间,却不需要自己拥有原子钟。

全球定位系统(Global Positioning System)是美国第二代卫星导航系统。是在子午仪卫星导航系统的基础上发展起来的,它采纳了子午仪系统的成功经验。和子午仪系统一样,全球定位系统由空间部分、地面监控部分和用户接收机三大部分组成。

按目前的方案,全球定位系统的空间部分使用24颗高度约202万千米的卫星组成卫星星座。21+3颗卫星均为近圆形轨道,运行周期约为11小时58分,分布在六个轨道面上(每轨道面四颗),轨道倾角为55度。卫星的分布使得在全球的任何地方,任何时间都可观测到四颗以上的卫星,并能保持良好定位解算精度的几何图形(DOP)。这就提供了在时间上连续的全球导航能力。

GPS的基本定位原理是:卫星不间断地发送自身的星历参数和时间信息,用户接收到这些信息后,经过计算求出接收机的三维位置,三维方向以及运动速度和时间信息。

软件编辑时候满足以上需要即可

1、GPS *** 作程序:精确定位、电子导航、灵敏电子罗盘、地图功能、多种坐标转换、精确气压测高、中文输人的超大内存和数据库、智能查找、计时功能、计算器等。

2、电源键:在开阔条件下打开电源键并按下保持—开机或关机;按下后放开—背景光开关。

3、翻页键:按下后放开—循环显示各个页面,或者退出当前的 *** 作。

4、缩放键:按下后放开—在地图页面上,放大或缩小比例尺;按下后放开—在卫星页面上,调节显示对比度。

5、查找键:按下后放开—访问查找菜单。

6、鼠标键:按下后放开—进入高亮度选项或者确认信息。

GPS数据处理中为了满足不同的需要,处理的数据要进行坐标转换,得到在不同坐标系统下的结果,下面是笛卡尔坐标系,大地坐标系,站心地平坐标系(线型和极坐标形式)之间的转换源代码:

头文件:

#ifndef _COORDCOVERT_H

#define _COORDCOVERT_H

#include "stdlibh"

//WGS-84椭球体参数

const double a=63781370;//长半轴

const double flattening=1/298257223563;//扁率

const double delta=00000001;

typedef struct tagCRDCARTESIAN{

double x;

double y;

double z;

}CRDCARTESIAN;

typedef CRDCARTESIAN PCRDCARTESIAN;

//笛卡尔坐标系

typedef struct tagCRDGEODETIC{

double longitude;

double latitude;

double height;

}CRDGEODETIC;

typedef CRDGEODETIC PCRDGEODETIC;

//大地坐标系

typedef struct tagCRDTOPOCENTRIC{

double northing;

double easting;

double upping;

}CRDTOPOCENTRIC;

typedef CRDTOPOCENTRIC PCRDTOPOCENTRIC;

//站心地平坐标系(线坐标形式)

typedef struct tagCRDTOPOCENTRICPOLAR{

double range;

double azimuth;

double elevation;

}CRDTOPOCENTRICPOLAR;

typedef CRDTOPOCENTRICPOLAR PCRDTOPOCENTRICPOLAR;

//站心地平坐标系(极坐标形式)

//由笛卡尔坐标转换为大地坐标

void CartesianToGeodetic (PCRDGEODETIC pcg, PCRDCARTESIAN pcc,

double dSemiMajorAxis, double dFlattening);

//pcg:指向所转换出的大地坐标的指针;

//pcc:指向待转换的笛卡尔坐标的指针;

//dSemiMajorAxis:参考椭球的长半轴;

//dFlattening:参考椭球的扁率。

//由大地坐标转换为笛卡尔坐标

void GeodeticToCartesian (PCRDCARTESIAN pcc, PCRDGEODETIC pcg,

double dSemiMajorAxis, double dFlattening);

//pcc:指向所转换出的笛卡尔坐标的指针;

//pcg:指向待转换的大地坐标的指针;

//dSemiMajorAxis:参考椭球的长半轴;

//dFlattening:参考椭球的扁率。

//由笛卡尔坐标转换为站心地平坐标

void CartesianToTopocentric (PCRDTOPOCENTRIC pct,

PCRDCARTESIAN pcc,

PCRDCARTESIAN pccCenter,

double dSemiMajorAxis,

double dFlattening);

//pct:指向所转换出的站心地平坐标的指针;

//pcc:指向待转换的笛卡尔坐标的指针;

//pccCenter:指向站心的笛卡尔坐标的指针;

//dSemiMajorAxis:参考椭球的长半轴;

//dFlattening:参考椭球的扁率。

//由站心地平直角坐标转换为站心地平极坐标

void TopocentricToTopocentricPolar (PCRDTOPOCENTRICPOLAR pctp,

PCRDTOPOCENTRIC pct);

//pctp:指向所转换出的站心地平极坐标的指针;

//pct:指向待转换的站心地平坐标的指针;

//由站心地平极坐标转换为站心地平直角坐标

void TopocentricPolarToTopocentric (PCRDTOPOCENTRIC pct,PCRDTOPOCENTRICPOLAR pctp);

//pct:指向所转换的站心地平坐标的指针;

//pctp:指向待转换的站心地平极坐标的指针;

#endif

源文件:

#include "CoordCoverth"

#include "mathh"

void CartesianToGeodetic (PCRDGEODETIC pcg, PCRDCARTESIAN pcc,

double dSemiMajorAxis, double dFlattening)

{

double e2;//第一偏心率的平方

e2=2dFlattening-dFlatteningdFlattening;

pcg->longitude=atan(pcc->y/pcc->x);

double W,N,N1=0,B,B1;

B1=atan(pcc->z/sqrt(pcc->xpcc->x+pcc->ypcc->y));

while(1)

{

W=sqrt(1-e2sin(B1)sin(B1));

N1=dSemiMajorAxis/W;

B=atan((pcc->z+N1e2sin(B1))/sqrt(pcc->xpcc->x+pcc->ypcc->y));

if(fabs(B-B1)<delta)

break;

else

B1=B;

}

pcg->latitude=B;

N=dSemiMajorAxis/sqrt(1-e2sin(pcg->latitude)sin(pcg->latitude));

pcg->height=sqrt(pcc->xpcc->x+pcc->ypcc->y)/cos(B)-N;

}

//由大地坐标转换为笛卡尔坐标

void GeodeticToCartesian (PCRDCARTESIAN pcc, PCRDGEODETIC pcg,

double dSemiMajorAxis, double dFlattening)

{

double e2;//第一偏心率的平方

double N;//卯酉圈半径

e2=2dFlattening-dFlatteningdFlattening;

N=dSemiMajorAxis/sqrt(1-e2sin(pcg->latitude)sin(pcg->latitude));

pcc->x=(N+pcg->height)cos(pcg->latitude)cos(pcg->longitude);

pcc->y=(N+pcg->height)cos(pcg->latitude)sin(pcg->longitude);

pcc->z=(N(1-e2)+pcg->height)sin(pcg->latitude);

}

//由笛卡尔坐标转换为站心地平坐标

void CartesianToTopocentric (PCRDTOPOCENTRIC pct,

PCRDCARTESIAN pcc,

PCRDCARTESIAN pccCenter,

double dSemiMajorAxis,

double dFlattening)

{

double dx,dy,dz;

dx=pcc->x-pccCenter->x;

dy=pcc->y-pccCenter->y;

dz=pcc->z-pccCenter->z;

PCRDGEODETIC pd;

pd=(PCRDGEODETIC)malloc(sizeof(CRDGEODETIC));

CartesianToGeodetic (pd,pccCenter,dSemiMajorAxis,dFlattening);

pct->northing=-sin(pd->latitude)cos(pd->longitude)dx

-sin(pd->latitude)sin(pd->longitude)dy

+cos(pd->latitude)dz;

pct->easting=-sin(pd->longitude)dx

+cos(pd->longitude)dy;

pct->upping=cos(pd->latitude)cos(pd->longitude)dx

+cos(pd->latitude)sin(pd->longitude)dy

+sin(pd->latitude)dz;

free(pd);

}

//由站心地平直角坐标转换为站心地平极坐标

void TopocentricToTopocentricPolar (PCRDTOPOCENTRICPOLAR pctp,

PCRDTOPOCENTRIC pct)

{

pctp->range=sqrt(pct->northingpct->northing+pct->eastingpct->easting+pct->uppingpct->upping);

pctp->azimuth=atan(pct->easting/pct->northing);

pctp->elevation=asin(pct->upping/pctp->range);

}

//由站心地平极坐标转换为站心地平直角坐标

void TopocentricPolarToTopocentric (PCRDTOPOCENTRIC pct,

PCRDTOPOCENTRICPOLAR pctp)

{

pct->northing=pctp->rangecos(pctp->elevation)cos(pctp->azimuth);

pct->easting=pctp->rangecos(pctp->elevation)sin(pctp->azimuth);

pct->upping=pctp->rangesin(pctp->elevation);

}

常见用法

F1 显示当前程序或者windows的帮助内容。

F2 当你选中一个文件的话,这意味着“重命名”

F3 当你在桌面上的时候是打开“查找:所有文件” 对话框

F10或ALT 激活当前程序的菜单栏

F11 所打开的网页(退出)全屏

windows键或CTRL+ESC 打开开始菜单

CTRL+ALT+DELETE 在win9x中打开关闭程序对话框 ;在winxp中

以上就是关于最近想用C语言在Linux上开发一个简单的gps接口程序,能读取显示经度纬度的那种。全部的内容,包括:最近想用C语言在Linux上开发一个简单的gps接口程序,能读取显示经度纬度的那种。、ThinkVantage GPS这个应用程序在X230上是派什么用途的、GPS定时定位软件程序如何编辑等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9360036.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存