• 1.33 MB
  • 48页

手持gps系统设计项目报告材料

  • 48页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'手持GPS系统设计报告——南京邮电大学自动化学院实验报告实验项目名称:手持GPS系统设计指导老师:项目成员:结题时间:2010—12-1547 手持GPS系统设计报告——南京邮电大学自动化学院手持GPS系统设计——项目报告一:实验名称手持GPS系统设计二:实验目的掌握嵌入式系统开发的方法,熟练掌握从总体方案设计、硬件电路的搭建调试、软件的编写测试到最终的软硬件联调、系统性能测试等各环节;掌握GPS模块的控制方法.三:实验内容利用51单片机开发板,GPS接收机,液晶显示屏等实现低成本,简单的局域GPS导航定位系统的设计。四:相关知识1.NMEA-0183协议目前,GPS采用NMEA-0183协议做为发送和接收数据的标准,NMEA-0183是美国国家海洋电子协会(NationalMarineElectronicsAssociation)为统一海洋导航规范而制定的标准,该格式标准已成为国际通用的一种格式,协议内容在兼容NMEA-180和NMEA-0182的基础上。增加了GPS、测深仪、罗经方位系统等多种设备接口和通讯协议定义,同时还允许一些特定厂商对其设备通信自定协议。NMEA-0183格式数据串的所有数据都采用ASCⅡ文本字符表示,数据传输以“$”开头,后面是语句头。语句头由5个字母组成。其前2个字母表示47 手持GPS系统设计报告——南京邮电大学自动化学院“系统ID”,即表示该语句是属于何种系统或设备,例如GP表示该语句属于GPS定位系统,HC表示该语句属于罗经方位系统;后3个字母表示“语句ID",表示该语句是关于何方面的数据。语句头后是数据体,包含不同的数据体字段,语句末尾为校验码(可选),以回车换行符结束,也就是ACSII字符“回车”(十六进制的0D)和“换行”(十六进制的0A)。数据字段以逗号分隔识别,空字段保留逗号。在GPS系统中常用语句有GPGGA(GPS定位信息),GPGSA(当前卫星信息),GPGSV(可见卫星信息),GPRMC(推荐定位信息),GPGLL(定位地理信息),GPVTG(地面速度信息)等。GPS数据传输是以标准异步串行方式发送,其串行通信波特率为4800b/s、数据位8位、停止位1位、无奇偶校验位。不同的语句中传送不同的信息,如GPGGA语句中传送的格式为:$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh 传送的信息说明如下:  $GPGGA:起始引导符及语句格式说明(本句为GPS定位数据)  <1>UTC时间,时时分分秒秒格式  <2>纬度,度度分分.分分分分格式(第一位是零也将传送)  <3>纬度半球,N或S(北纬或南纬)  <4>经度,度度分分.分分分分格式(第一位零也将传送)  <5>经度半球,E或W(东经或西经)  <6>47 手持GPS系统设计报告——南京邮电大学自动化学院GPS质量指示,0=方位无法使用,1=非差分GPS获得方位,2=差分方式获得方位(DGPS),6=估计获得  <7>使用卫星数量,从00到12(第一个零也将传送)  <8>水平精确度,0.5到99.9  <9>天线离海平面的高度,-9999.9到9999.9米 M指单位米  <10>大地水准面高度,-999.9到9999.9米M指单位米  <11>差分GPS数据期限(RTCMSC-104),最后设立RTCM传送的秒数量(如无DGPS为0)  <12>差分参考基站标号,从0000到1023(首位0也将传送。如无DGPS为0)  *语句结束标志符  hh从$开始的所有ASCII码的校验和    2.EM411GPS接收模块简介GPS接收模块性能主要决定于其内部使用的GPS核心芯片组,GPS芯片组SiRFStarIII通过采用20万次/频率的相关器(Correlators)提高了灵敏度并能在室内定位。冷开机/暖开机/热开机的时间分别达到42s/38s/1s,可同时追踪20个卫星信道。EM411型GPS接收模块采用SiRFStarIII高效能GPS芯片组,其具有特点:极佳的灵敏度(追踪感度:-159dBm);讯号微弱时,TTFF(TimetoFirstFix)定位仍十分迅速;支持NMEA47 手持GPS系统设计报告——南京邮电大学自动化学院0183语言格式:GGA,GSA,GSV,RMC,GLL,VTG;内建超大电容,可储存快速获取的卫星讯号数据;内建陶瓷天线;LED指示灯显示卫星定位状况:LED不亮时接收器关闭,LED恒亮时未定位或搜寻讯号,LED闪烁时已定位。此外,EM411体积小巧,外形尺寸为30mm×30mm×10.5mm,工作时供电电压为4.5~6.5V,消耗电流为60mA。对外提供6个引脚,使用时引脚1、5接地,引脚2接电源,引脚3为串口输出数据线,引脚4为串口输入数据线,引脚6悬空。五:实验步骤1.总体方案设计通过GPS接收机接收信号,提取此信号中相关信息对移动的物体进行定位并在液晶显示屏上以及上位机上显示相关位置信息。通过软硬件分别对接收的信号进行分析,通过一定的准换渠道得到我们所需要的实时位置进行定位。GPS接收信号分析测试信号显示信息总体方案设计图2.软件设计单片机部分主程序流程首先是初始化,主要包括通用I/O端口,UART,SPI,以及LCD初始化,并在LCD47 手持GPS系统设计报告——南京邮电大学自动化学院上显示开机初始信息。接着单片机开始接收从EM411传送的GPS定位信息,该系统设计的只接收GPSGGA语句信息并将保存接收到的信息。然后从中提取要显示在LCD上的信息,并然后键盘扫描,如果有键按下则进行键盘中断程序的处理。当SW1键按下时,软件通过延时子程序设定一个固定的保存时间间隔。当SW2键按下时,软件执行SD卡驱动子程序,可以方便地将GPS定位信息以FAT文件格式保存到SD卡中,并可在Windows操作系统下打开这些文件。SD卡驱动子程序主要完成SD卡初始化、卡插入检测、写保护检测、SD卡读/写命令的发送/接收、文件的更名、文件数据的传送等任务。部分代码/*配置GPS模块初始化函数*//*voidInit_GPS(){uchari;ucharin[]="$PGRMO,,4*";//发送数据数组for(i=0;i<10;i++){TI=0;SBUF=in[i];while(!TI);}}/*配置GPS模块使能特定几个输出语句子函数*//*voidEnable_GPS(){47 手持GPS系统设计报告——南京邮电大学自动化学院uchari;ucharen[]="$PGRMO,GPRMC,1*";//发送数据数组for(i=0;i<15;i++){TI=0;SBUF=en[i];while(!TI);}}/*配置GPS模块禁用所有输出语句子函数*//*voidDisable_GPS(){uchari;uchardiData_BUF[]="$PGRMO,,2*";//发送数据数组for(i=0;i<10;i++){TI=0;SBUF=diData_BUF[i];while(!TI);}}/*串口接收函数*/ucharserial_recieve(void){uinti=0;RI=0;serial_ERROR=0;47 手持GPS系统设计报告——南京邮电大学自动化学院while(!RI){if(i++>30000){serial_ERROR=1;returnSBUF;}};RI=0;returnSBUF;}/*道路定位函数*/voidLocateRoads(structLocation*L,structRoadR[]){inti,j;doublek,b;strcpy(L->name,"0");for(j=0;jpoint.x-R[j].point[i].x)*(L->point.x-R[j].point[i+1].x)<0)if(fabs(L->point.x*k+b-L->point.y)*fabs(L->point.x*k+b-L->point.y)/(1+k*k)name,R[j].name);return;}}else{//南北走向时k=(R[j].point[i+1].x-R[j].point[i].x)/(R[j].point[i+1].y-R[j].point[i].y);b=R[j].point[i].x-R[j].point[i].y*k;if((L->point.y-R[j].point[i].y)*(L->point.y-R[j].point[i+1].y)<0)if(fabs(L->point.y*k+b-L->point.x)*fabs(L->point.y*k+b-L->point.x)/(1+k*k)name,R[j].name);return;}}}}}/*高校定位函数*/voidLocateBuildings(structLocation*L,structBuildingB[]){doublek,b;unsignedchari;strcpy(L->name,"0");for(i=0;ipoint.y>=L->point.x*k+b){k=(B[i].point[3].y-B[i].point[2].y)/(B[i].point[3].x-B[i].point[2].x);47 手持GPS系统设计报告——南京邮电大学自动化学院b=B[i].point[2].y-k*B[i].point[2].x;if(L->point.y<=L->point.x*k+b){k=(B[i].point[2].x-B[i].point[0].x)/(B[i].point[2].y-B[i].point[0].y);b=B[i].point[2].x-B[i].point[2].y*k;if(L->point.x>=L->point.y*k+b){k=(B[i].point[3].x-B[i].point[1].x)/(B[i].point[3].y-B[i].point[1].y);b=B[i].point[3].x-B[i].point[3].y*k;if(L->point.x<=L->point.y*k+b){strcpy(L->name,B[i].name);return;}}}}}}/*液晶显示与清屏函数*/voidInit_LCD(void){LCD_Data=0xff;47 手持GPS系统设计报告——南京邮电大学自动化学院E=0;Delay(100);LCD_SET;//功能设定Delay(10);LCD_OFF;//关显示指令Delay(10);Write_com(0x06);//地址归位Delay(10);LCD_CLR;//清屏Delay(10);LCD_ON;//开显示Delay(10);}上位机部分通过使用上位机软件C#中相关控件将串口与GPS模块建立连接通信。每次触冲区接收完固定字节的数据,触发一个事件,自动从SBUF中接受所有数据存入str_org为原始数据,所接收到的数据中,我们只需要其中部分,所以使用字符串处理函数对字符进行剪切提取,提取出经度,纬度,海拔和时间四个量。47 手持GPS系统设计报告——南京邮电大学自动化学院再将这四个参数与图像上已标定的参考点进行比较,运算,计算出本点在地图上的位置并用标记标注。为了保证显示数据稳定,我们将单位时间内的一组数据平均化,再进行比较运算,减小了计算机的负荷,提高系统的响应速度。附上位机程序界面:在上位机的程序设计中,我们对于在应用中可能出现的异常处理进行了处理,防止程序的错误运行。具体程序如下所示:privatevoidbutton1_Click(objectsender,EventArgse){if((Convert.ToString(comboBox2.SelectedItem))==""){MessageBox.Show("请先选择COM端口!","系统提示");return;}elseif(serialPort1.IsOpen==false){serialPort1.PortName=Convert.ToString(comboBox2.SelectedItem);try{serialPort1.Open();serialPort1.DiscardInBuffer();}catch(Exceptionex){MessageBox.Show("端口不存在,请检查端口。","系统提示");return;}Thread.Sleep(1100);stringqqqq;47 手持GPS系统设计报告——南京邮电大学自动化学院qqqq=serialPort1.ReadExisting();if(qqqq.Length<7){MessageBox.Show("不能读取数据,请检查连接","系统提示");serialPort1.Close();while(true){if(qqqq.Length<7)return;elsebreak;}}}if(serialPort1.IsOpen==false){serialPort1.Open();Thread.Sleep(2000);stringqqqq;qqqq=serialPort1.ReadExisting();if(qqqq.Length<7){MessageBox.Show("不能读取数据,请检查连接","系统提示");while(true){if(qqqq.Length<7)return;elsebreak;}}}1.硬件设计主要芯片a)STC89C52单片机b)EM-411GPS接收模块电路实现a)部分电路47 手持GPS系统设计报告——南京邮电大学自动化学院GPS电路图:基于MCS-51系列单片机的GPS独立定位设备:47 手持GPS系统设计报告——南京邮电大学自动化学院六:实验数据道路经纬度转换数据:建筑物经纬度转换数据:七:实验心得全球定位系统(GlobalPositioningSystem47 手持GPS系统设计报告——南京邮电大学自动化学院简称GPS)是美国第二代卫星导航系统。它是在子午仪卫星导航系统的基础上发展起来的,GPS能提供全天候、连续、实时高精度导航参数,实现三维定位,并可提供精确的时间信息。我们所设计的系统具有目前GPS的部分功能,能在南京仙林地区内应用,可以实现GPS导航定位以及轨迹显示等功能。该系统具有结构简单,可移植性强,成本低,灵敏度高等特点,可以实现局域GPS导航系统,选用不同的的电子地图及应用场合,实现各种局域车载导航,智能交通及野外探测,也可以很方便的应用到其他导航定位场合(如校园,旅游景点等)。47 手持GPS系统设计报告——南京邮电大学自动化学院八:附录单片机部分程序/*定位*/#include#include#defineRoadWide0.0002doublefabs(doublex){if(x<0)x=-x;returnx;}structpoint{doublex,y;};structBuilding{charname[16];structpointpoint[4];structBuilding*Next;};structRoad47 手持GPS系统设计报告——南京邮电大学自动化学院{charname[16];structpointpoint[6];structRoad*Next;};structLocation{structpointpoint;charname[16];};structBuilding*BuildingPointer;structBuilding*Btail;structRoad*RoadPointer;structRoad*Rtail;structLocation*LocationPointer;#defineBuildNum1#defineRoadNum1structLocationLocation={{118.9118056,32.10356667},"0"};47 手持GPS系统设计报告——南京邮电大学自动化学院structBuildingBuilding[10]={{"南邮",{{118.9227583,32.10653056},{118.9307389,32.10913333},{118.9201806,32.12024444},{118.9281861,32.12385556}}},{"南财",{{118.9121028,32.10325556},{118.9224111,32.10665556},{118.9105333,32.11351389},{118.9189639,32.11989167}}},{"南师",{{118.9001556,32.10044444},{118.9115194,32.10355000},{118.8906667,32.10600833},{118.9085222,32.11263889}}},};structRoadRoad[10]={{"文苑路",{{118.8986528,32.09898333},{118.9053472,32.10115833},{118.912125,32.10324722},{118.9195417,32.10551667},{118.9252111,32.10724444},{118.9309222,32.10886667}}},{"学海路",{{118.9151528,32.12653611},{118.9222528,32.11440833},{118.923088947 手持GPS系统设计报告——南京邮电大学自动化学院,32.11277778},{118.9225639,32.10336389},{118.923175,32.10150000},{118.9277917,32.09604722}}},};voidLocateBuildings(structLocation*L,structBuilding*B);voidLocateRoads(structLocation*L,structRoad*R);voidLocateBuildings(structLocation*L,structBuilding*B){doublek,b;strcpy(L->name,"0");while(B){k=(B->point[1].y-B->point[0].y)/(B->point[1].x-B->point[0].x);b=B->point[1].y-k*B->point[1].x;if(L->point.y>=L->point.x*k+b){k=(B->point[3].y-B->point[2].y)/(B->point[3].x-B->point[2].x);47 手持GPS系统设计报告——南京邮电大学自动化学院b=B->point[2].y-k*B->point[2].x;if(L->point.y<=L->point.x*k+b){k=(B->point[2].x-B->point[0].x)/(B->point[2].y-B->point[0].y);b=B->point[2].x-B->point[2].y*k;if(L->point.x>=L->point.y*k+b){k=(B->point[3].x-B->point[1].x)/(B->point[3].y-B->point[1].y);b=B->point[3].x-B->point[3].y*k;if(L->point.x<=L->point.y*k+b){strcpy(L->name,B->name);return;}}}}B=B->Next;}}voidLocateRoads(structLocation*L,structRoad*R)47 手持GPS系统设计报告——南京邮电大学自动化学院{inti;doublek,b;strcpy(L->name,"0");while(R){for(i=0;i<6;i++){if((R->point[i+1].y-R->point[i].y)<(R->point[i+1].x-R->point[i].x)){//路是东西走向时k=(R->point[i+1].y-R->point[i].y)/(R->point[i+1].x-R->point[i].x);b=R->point[i].y-k*R->point[i].x;if((L->point.x-R->point[i].x)*(L->point.x-R->point[i+1].x)<0)if(fabs(L->point.x*k+b-L->point.y)*fabs(L->point.x*k+b-L->point.y)/(1+k*k)name,R->name);return;}47 手持GPS系统设计报告——南京邮电大学自动化学院}else{//南北走向时k=(R->point[i+1].x-R->point[i].x)/(R->point[i+1].y-R->point[i].y);b=R->point[i].x-R->point[i].y*k;if((L->point.y-R->point[i].y)*(L->point.y-R->point[i+1].y)<0)if(fabs(L->point.y*k+b-L->point.x)*fabs(L->point.y*k+b-L->point.x)/(1+k*k)name,R->name);return;}}}R=R->Next;}}voidInitMap(){inti;BuildingPointer=Building;47 手持GPS系统设计报告——南京邮电大学自动化学院RoadPointer=Road;LocationPointer=&Location;if(BuildNum>=2){for(i=0;iNext=&Building[i+1];}}if(RoadNum>=2){for(i=0;iNext=&Road[i+1];}}}voidLocate(){LocateBuildings(LocationPointer,BuildingPointer);if(!strcmp(LocationPointer->name,"0"))LocateRoads(LocationPointer,RoadPointer);47 手持GPS系统设计报告——南京邮电大学自动化学院}voidmain(){InitMap();Locate();printf("%s",LocationPointer->name);}/*GPS*///$GPRMC,010101.130,A,3606.6834,N,12021.7778,E,0.0,238.3,010807,,,A*6C//$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,#include//引用标准库的头文件#include#include"Locate.c"#include"LCD_TCM12864N.H"#defineucharunsignedchar//宏定义无符号字符型#defineuintunsignedint47 手持GPS系统设计报告——南京邮电大学自动化学院//宏定义无符号整数型enumstatus{init=0,show,search}status;//led显示状态标志//0:初始//1:显示经纬度//2:信号搜寻中;ucharserial_ERROR;ucharData_BUF[42];//存放数据缓存数组uchartime[16];uchardatacount;//接收数据长度ucharRecive_Complete;//GPS数据接收完voidConvertTime();voidConvertData();voiddisplay();//液晶显示/*液晶显示*/voidInit_display(){47 手持GPS系统设计报告——南京邮电大学自动化学院LCD_CLR;LCD_LINE1;Display_sentence("GPS卫星定位系统");}voiddisplay(){LCD_LINE1_3;Display_sentence(time);LCD_LINE2;if(strcmp(Location.name,"0")!=0){uinti;Display_sentence(Location.name);for(i=0;i<16-strlen(Location.name);i++)Display_sentence("");}elseDisplay_sentence("");LCD_LINE3_3;Display_double(Location.point.x);LCD_LINE4_3;Display_double(Location.point.y);//Delay(20);//EA=1;47 手持GPS系统设计报告——南京邮电大学自动化学院}/*配置GPS模块初始化函数*//*voidInit_GPS(){uchari;ucharin[]="$PGRMO,,4*";//发送数据数组for(i=0;i<10;i++){TI=0;SBUF=in[i];while(!TI);}}/*配置GPS模块使能特定几个输出语句子函数*//*voidEnable_GPS(){uchari;ucharen[]="$PGRMO,GPRMC,1*";//发送数据数组for(i=0;i<15;i++){TI=0;SBUF=en[i];while(!TI);}47 手持GPS系统设计报告——南京邮电大学自动化学院}/*配置GPS模块禁用所有输出语句子函数*//*voidDisable_GPS(){uchari;uchardiData_BUF[]="$PGRMO,,2*";//发送数据数组for(i=0;i<10;i++){TI=0;SBUF=diData_BUF[i];while(!TI);}}/*串口接收函数*/ucharserial_recieve(void){uinti=0;RI=0;serial_ERROR=0;while(!RI){if(i++>30000){serial_ERROR=1;returnSBUF;}};RI=0;47 手持GPS系统设计报告——南京邮电大学自动化学院returnSBUF;}codeunsignedcharGPS_ASC[]="$GPRMC";//定义特征字符串/*串口接收中断*/voidGetRs232_Data()interrupt4{//由于GPS发数据频率较快,所以中断程序必须短uchari;RI=0;//清除中断标志位Data_BUF[0]=SBUF;if(Data_BUF[0]=="$"){for(i=1;i#defineucharunsignedchar#defineuintunsignedint#defineLCD_DataP1//定义P1口为液晶数据口ucharBusy;//液晶忙标志sbitRS=P3^6;//液晶指令/数据选择信号sbitRW=P3^7;//液晶读写选择信号sbitE=P3^5;//液晶使能信号#defineLCD_CLRWrite_com(0x01)#defineLCD_ONWrite_com(0x0c)#defineLCD_OFFWrite_com(0x08)47 手持GPS系统设计报告——南京邮电大学自动化学院#defineLCD_SETWrite_com(0x30)#defineLCD_LINE1Write_com(0x80)#defineLCD_LINE1_1Write_com(0x81)#defineLCD_LINE1_2Write_com(0x82)#defineLCD_LINE1_3Write_com(0x83)#defineLCD_LINE1_4Write_com(0x84)#defineLCD_LINE1_5Write_com(0x85)#defineLCD_LINE1_6Write_com(0x86)#defineLCD_LINE1_7Write_com(0x87)#defineLCD_LINE2Write_com(0x90)#defineLCD_LINE2_1Write_com(0x91)#defineLCD_LINE2_2Write_com(0x92)#defineLCD_LINE2_3Write_com(0x93)#defineLCD_LINE2_4Write_com(0x94)#defineLCD_LINE2_5Write_com(0x95)#defineLCD_LINE2_6Write_com(0x96)#defineLCD_LINE2_7Write_com(0x97)#defineLCD_LINE3Write_com(0x88)#defineLCD_LINE3_1Write_com(0x89)#defineLCD_LINE3_2Write_com(0x8A)#defineLCD_LINE3_3Write_com(0x8B)#defineLCD_LINE3_4Write_com(0x8C)47 手持GPS系统设计报告——南京邮电大学自动化学院#defineLCD_LINE3_5Write_com(0x8D)#defineLCD_LINE3_6Write_com(0x8E)#defineLCD_LINE3_7Write_com(0x8F)#defineLCD_LINE4Write_com(0x98)#defineLCD_LINE4_1Write_com(0x99)#defineLCD_LINE4_2Write_com(0x9A)#defineLCD_LINE4_3Write_com(0x9B)#defineLCD_LINE4_4Write_com(0x9C)#defineLCD_LINE4_5Write_com(0x9D)#defineLCD_LINE4_6Write_com(0x9E)#defineLCD_LINE4_7Write_com(0x9F)/*延时t毫秒*/voidDelay(uintt){uintx,z;for(x=t;x>0;x--)for(z=110;z>0;z--);}47 手持GPS系统设计报告——南京邮电大学自动化学院voidCheck_busy(){RW=1;RS=0;do{LCD_Data=0xff;E=1;Delay(5);Busy=P1;E=0;}while(Busy&0x80);}voidWrite_com(ucharcom)//写指令{Check_busy();RW=0;RS=0;E=1;Delay(5);LCD_Data=com;47 手持GPS系统设计报告——南京邮电大学自动化学院E=0;}voidWrite_dat(uchardat)//写数据{Check_busy();RW=0;RS=1;LCD_Data=dat;E=1;Delay(5);E=0;}voidDisplay_sentence(uchar*p){while(*p){Write_dat(*p++);}}intexp(intx){inti,s;s=1;47 手持GPS系统设计报告——南京邮电大学自动化学院for(i=0;i=0;i--){Write_dat(temp/exp(i)+"0");temp=temp%exp(i);}}voidDisplay_double(doublex){47 手持GPS系统设计报告——南京邮电大学自动化学院uinttemp;temp=x;Display_int(temp);Display_sentence(".");temp=(x-temp)*100000;Display_int(temp);}voidInit_LCD(void){LCD_Data=0xff;E=0;Delay(100);LCD_SET;//功能设定Delay(10);LCD_OFF;//关显示指令Delay(10);Write_com(0x06);//地址归位Delay(10);LCD_CLR;//清屏Delay(10);47 手持GPS系统设计报告——南京邮电大学自动化学院LCD_ON;//开显示Delay(10);}#endif上位机部分#include#include#defineRoadWide0.0002doublefabs(doublex){if(x<0)x=-x;returnx;}structpoint{doublex,y;};structBuilding{charname[16];structpointpoint[4];structBuilding*Next;};structRoad{charname[16];structpointpoint[6];structRoad*Next;};structLocation{structpointpoint;charname[16];};structBuilding*BuildingPointer;structBuilding*Btail;structRoad*RoadPointer;structRoad*Rtail;47 手持GPS系统设计报告——南京邮电大学自动化学院structLocation*LocationPointer;#defineBuildNum1#defineRoadNum1structLocationLocation={{118.9118056,32.10356667},"0"};structBuildingBuilding[10]={{"南?邮?",{{118.9227583,32.10653056},{118.9307389,32.10913333},{118.9201806,32.12024444},{118.9281861,32.12385556}}},{"南?财?",{{118.9121028,32.10325556},{118.9224111,32.10665556},{118.9105333,32.11351389},{118.9189639,32.11989167}}},{"南?师簗",{{118.9001556,32.10044444},{118.9115194,32.10355000},{118.8906667,32.10600833},{118.9085222,32.11263889}}},};structRoadRoad[10]={{"文?苑·路·",{{118.8986528,32.09898333},{118.9053472,32.10115833},{118.912125,32.10324722},{118.9195417,32.10551667},{118.9252111,32.10724444},{118.9309222,32.10886667}}},{"学§海£路·",{{118.9151528,32.12653611},{118.9222528,32.11440833},{118.9230889,32.11277778},{118.9225639,32.10336389},{118.923175,32.10150000},{118.9277917,32.09604722}}},};voidLocateBuildings(structLocation*L,structBuilding*B);voidLocateRoads(structLocation*L,structRoad*R);voidLocateBuildings(structLocation*L,structBuilding*B){doublek,b;strcpy(L->name,"0");while(B){k=(B->point[1].y-B->point[0].y)/(B->point[1].x-B->point[0].x);b=B->point[1].y-k*B->point[1].x;if(L->point.y>=L->point.x*k+b){k=(B->point[3].y-B->point[2].y)/(B->point[3].x-B->point[2].x);b=B->point[2].y-k*B->point[2].x;if(L->point.y<=L->point.x*k+b){47 手持GPS系统设计报告——南京邮电大学自动化学院k=(B->point[2].x-B->point[0].x)/(B->point[2].y-B->point[0].y);b=B->point[2].x-B->point[2].y*k;if(L->point.x>=L->point.y*k+b){k=(B->point[3].x-B->point[1].x)/(B->point[3].y-B->point[1].y);b=B->point[3].x-B->point[3].y*k;if(L->point.x<=L->point.y*k+b){strcpy(L->name,B->name);return;}}}}B=B->Next;}}voidLocateRoads(structLocation*L,structRoad*R){inti;doublek,b;strcpy(L->name,"0");while(R){for(i=0;i<6;i++){if((R->point[i+1].y-R->point[i].y)<(R->point[i+1].x-R->point[i].x)){k=(R->point[i+1].y-R->point[i].y)/(R->point[i+1].x-R->point[i].x);b=R->point[i].y-k*R->point[i].x;if((L->point.x-R->point[i].x)*(L->point.x-R->point[i+1].x)<0)if(fabs(L->point.x*k+b-L->point.y)*fabs(L->point.x*k+b-L->point.y)/(1+k*k)name,R->name);return;}}else{k=(R->point[i+1].x-R->point[i].x)/(R->point[i+1].y-R->point[i].y);b=R->point[i].x-R->point[i].y*k;if((L->point.y-R->point[i].y)*(L->point.y-R->point[i+1].y)<0)if(fabs(L->point.y*k+b-L->point.x)*fabs(L->point.y*k+b-L->point.x)/(1+k*k)name,R->name);return;47 手持GPS系统设计报告——南京邮电大学自动化学院}}}R=R->Next;}}voidInitMap(){inti;BuildingPointer=Building;RoadPointer=Road;LocationPointer=&Location;if(BuildNum>=2){for(i=0;iNext=&Building[i+1];}}if(RoadNum>=2){for(i=0;iNext=&Road[i+1];}}}voidLocate(){LocateBuildings(LocationPointer,BuildingPointer);if(!strcmp(LocationPointer->name,"0"))LocateRoads(LocationPointer,RoadPointer);}voidmain(){InitMap();Locate();printf("%s",LocationPointer->name);}47 手持GPS系统设计报告——南京邮电大学自动化学院47'