权威《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定时定位软件程序如何编辑等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)