汽车导航gps软件设计课程 - 图文

更新时间:2024-06-01 11:28:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

GIS软件设计Ⅱ 实验报告

专 业 学 号 姓 名

一、软件设计目的:

通过构建嵌入式终端模块、服务器端模块、浏览端模块这三个模块,掌握利用windows mobile模拟汽车导航、SQL server完成车辆GPS数据读取管理、google earth API完成车辆位置信息浏览,并以此增强C#编程能力。 二、软件设计内容:

本次软件设计内容分三部分模块进行,该三个模块分别为嵌入式终端模块、服务器端模块、浏览端模块,最后这三个模块集成为该小组软件系统,三个模块需要完成的内容如下所示:

嵌入式终端模块:

该部分模拟汽车导航终端软件部分。

基本功能要求:能实现电子地图浏览、读取模拟GPS数据、GPS数据显示(即当前位置显示)、GPS数据上传至服务器数据库。 软件推荐:windows mobile 服务器端模块:

主要完成车辆GPS数据读取管理。

基本功能要求:读取终端上传过来的GPS数据,并存储。支持对车辆GPS数据进行检索查询等操作、终端当前位置、历史轨迹查询需求。 软件推荐:SQL server、C#语言 浏览端模块:

完成车辆位置信息浏览基本功能。

功能要求:在web 浏览器上显示车辆当前位置、移动轨迹、历史轨迹等。 软件推荐:google earth API 、灵图API、ASP.net 三、软件实现 数据准备:

1、 遥感影像配准(WGS_84),并导出.img文件(已包含坐标信息)

1.1加载影像图

1.2为Layers定义坐标系统Predefined\\Geograpic Coorinate Systems\\World\\WGS 1984

1.3将配准好的图导出

2、 SDE中建立数据库,要素类Car,并注册版本添加GlobalID(不确定是否每一步都必

要,但这样做肯定没问题)如图

3、 制作mxd地图文档,添加img文件和Car,

4、 发布地图服务,

5、 利用ArcToolbox\\Mobile Tools\\Generate Mobile Service Cache工具发布的服务

转换为bin文件,作为mobileservice读取的数据

6、 后台建立数据库,建立表,设置如图字段

7、 GPS数据的准备,建立文本文件,自定义数据格式,点名、X坐标、Y坐标、……

嵌入式汽车导航终端软件系统 (1)窗口界面设计

向窗口拖入7个button控件,修改它们的text属性,分别为加载、放大、缩小、漫游、停止、单步显示、自动显示;向窗体拖入1个Lable控件,将它的text属性改为位置列表;向窗体拖入一个Listbox控件、一个Timer控件和一个map控件。窗口设计如下:

(2)代码设计

1)双击加载button控件,写入代码,读取存放在txt文档中的GPS数据,代码如下: string strLine = \;

string filename = \数据.txt\; try {

FileStream aFile = new FileStream(filename, FileMode.Open); StreamReader sr = new StreamReader(aFile); strLine = sr.ReadLine(); while (strLine != null) {

if (strLine != null) {

string[] strArr = strLine.Split(','); MyClass PointsCollection = new MyClass(); //PointsCollection.name=strArr[0]; name[i++] = strArr[0];

PointsCollection.Coordinate.X = Convert.ToDouble(strArr[1]);

PointsCollection.Coordinate.Y = Convert.ToDouble(strArr[2]);

Pointkindscc.Add(PointsCollection.Coordinate); }

strLine = sr.ReadLine(); }

sr.Close(); }

catch (IOException ex) {

MessageBox.Show(ex.ToString()); }

2)双击放大butto控件,写入代码,实现电子地图的放大功能,代码如下: this.map1.CurrentMapAction = this.zoomInMapAction1;

3)双击缩小button控件,写入代码,实现电子地图的缩小功能,代码如下: this.map1.CurrentMapAction = this.zoomOutMapAction1;

4)双击漫游button控件,写入代码,实现电子地图的漫游功能,代码如下: this.map1.CurrentMapAction = this.panMapAction1;

5)双击单步显示button控件,写入代码,实现单击一次按钮显示一次汽车当前位置的功能,代码如下: DeleteAll();

ShowCar(t); if (t < 29) {

t = t + 1; } else t = 0; private void DeleteAll() {

FeatureLayer featurelayer = this.mobileService1.Layers[0] as FeatureLayer;

QueryFilter queryfilter = new QueryFilter(); FeatureDataTable featuredatatable = featurelayer.GetDataTable(queryfilter, null);

foreach (FeatureDataRow row in featuredatatable.Rows) row.Delete();

featuredatatable.SaveInFeatureLayer(); }

private void ShowCar(int t) {

ESRI.ArcGIS.Mobile.Geometries.Point tp = new ESRI.ArcGIS.Mobile.Geometries.Point(Pointkindscc[t]); string selectlayername = \;

m_selectedFeatureLayer = this.mobileService1.Layers[selectlayername] as FeatureLayer;

FeatureDataTable featureDataTable = m_selectedFeatureLayer.GetDataTable(); //要素表对象featureDataTable新增一条空的记录

FeatureDataRow editedFeature = featureDataTable.NewRow();

//获取要素图层对象的几何列,并把SketchGraphicLayer图层的几何值赋值给他

int geometryIndex = m_selectedFeatureLayer.GeometryColumnIndex;

editedFeature[geometryIndex] = tp; // 把新增的记录赋回到要素数据表中

featureDataTable.Rows.Add(editedFeature);

//保存结果

featureDataTable.SaveInFeatureLayer();

string X = tp.Coordinate.X.ToString();

string Y = tp.Coordinate.Y.ToString();

this.listBox1.Items.Add(name[t] + \ + X + \ + Y); this.listBox1.SelectedIndex = k++; UpLoad(name[t], X, Y); }

6)双击自动显示button控件,写入代码,实现每隔一秒显示汽车的当前位置,代码如下: this.timer1.Enabled = true;

private void timer1_Tick(object sender, EventArgs e) {

DeleteAll(); ShowCar(t); if (t < 29) {

t = t + 1; } else t = 0; }

7)双击停止button控件,写入代码,实现程序的停止,代码如下: this.timer1.Enabled = false; 截图如下所示: 图1为显示系统界面 图2为单步显示结果 图3为自动显示结果 图4为停止结果

图1

图2

图3

图4 (3)GPS数据上传至服务器数据库

1)建立Webservices,进行数据库连接,代码如下: public Service () {

//如果使用设计的组件,请取消注释以下行 //InitializeComponent(); } public

SqlConnection

connection

=

new

SqlConnection(\

Source=du-96e8d5846746;Initial Catalog=GISshixi;User ID=sa;Password=sa\ [WebMethod(Description = \

public void WriteGPS(string dianming, string X,string Y,string datetime) {

connection.Open();

string dian = string.Format(\ string XX = string.Format(\ string YY = string.Format(\ string tt = string.Format(\

string sqlstr = \信息(点号,X坐标,Y坐标,时间) VALUES (\+ dian + \

System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand(sqlstr, connection);

sqlCommand.ExecuteNonQuery(); connection.Close();

}2)将GPS信息写入到数据库中,代码如下:

汽车导航终端.shixi.Service hh = new 汽车导航终端.shixi.Service(); string datetime = DateTime.Now.ToString(); hh.WriteGPS(dianming, X, Y, datetime); 车辆GIS管理服务器端软件系统 (1)窗口界面设计

向窗口拖入2个button控件,修改它们的text属性,分别为历史轨迹查询、查询当前位置;向窗体拖入1个dataGridView1控件。窗口设计如下:

(2)读取终端上传过来的GPS数据,并存储

connectionString = \; myConnection = new SqlConnection(connectionString); string Olestr = \信息\;

SqlCommand cmd = new SqlCommand(Olestr, myConnection); SqlDataAdapter adp = new SqlDataAdapter(cmd);

DataTable dt = new DataTable(); adp.Fill(dt); (3)代码设计

1)双击历史轨迹查询button控件,写入代码,实现查询历史轨迹的功能,代码如下: string Olestr = \信息\;

SqlCommand cmd = new SqlCommand(Olestr, myConnection); SqlDataAdapter adp = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adp.Fill(dt);

dataGridView1.DataSource = dt;

2)双击查询当前位置button控件,写入代码,实现查询历史轨迹的功能,代码如下: string Olestr = \点号,X坐标,Y坐标,时间 from GPS信息 where 时间=(select MAX(时间) from GPS信息)\;

SqlCommand cmd = new SqlCommand(Olestr, myConnection); SqlDataAdapter adp = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adp.Fill(dt);

dataGridView1.DataSource = dt; 截图如下所示: 图1为历史轨迹查询结果 图2为当前位置查询结果

图1

图2

车辆GIS管理浏览器端软件系统 (1) 窗口界面设计,如下图所示:

(2)读取数据库内容,代码如下: Array1 = \;

SqlData1 sd = new SqlData1();

string cmdText = \信息\; dt = sd.ExecuteDatatable(CommandType.Text, cmdText, null); int i = 1;

foreach(DataRow dr in dt.Rows) {

Array1 += dr[\时间\].ToString(); Array1 += \;

Array1 += dr[\坐标\].ToString(); Array1 += \;

Array1 += dr[\坐标\].ToString(); Array1 += \; Array1+=i.ToString(); Array1 += \; i++; }

sd = new SqlData1();

cmdText = \信息 order by 时间 desc\;

DataRow dr1 = sd.ExecuteDatarow(CommandType.Text, cmdText, null); if (dr1 != null) {

Dest += dr1[\时间\].ToString(); Dest += \;

Dest += dr1[\坐标\].ToString(); Dest += \;

Dest += dr1[\坐标\].ToString(); Dest += \;

Dest += i.ToString(); }

(3) web 浏览器上显示电子地图,代码如下:

var latlng = new google.maps.LatLng(32.1058 , 118.9313); var image = new google.maps.MarkerImage('images/fly.gif', new google.maps.Size(64,64), new google.maps.Point(0,0),

new google.maps.Point(0,32)); var myOptions = { zoom: 16, center: latlng,

mapTypeId: google.maps.MapTypeId.ROADMAP };

map = new google.maps.Map(document.getElementById(\), myOptions); geocoder = new google.maps.Geocoder();

var contentString =GetcontentString(\,NUPT!\,\南京邮电大学!\); var infowindow = new google.maps.InfoWindow ({

content: contentString ,

maxWidth: 200 });

var marker = new google.maps.Marker({ position: latlng, map: map, icon: image,

title:\南京邮电大学\ });

google.maps.event.addListener(marker, 'click', function() { infowindow.open(map,marker); }); (4) 显示历史轨迹。代码如下: function btnAddpointline_onclick() {

var array='<%=Array1 %>'; var arr=array.split('|'); var polyOptions = {

strokeColor: '#00FF00', strokeOpacity: 1.0, strokeWeight: 2 }

poly = new google.maps.Polyline(polyOptions); poly.setMap(map);

var path = poly.getPath(); for (var j = 0; j < arr.length-1;j++) {

var image = new google.maps.MarkerImage('images/point.gif',

new google.maps.Size(10, 11), new google.maps.Point(0,0), new google.maps.Point(0,2)); var beachs=arr[j];

var beach = beachs.split('*');

var myLatLng1 = new google.maps.LatLng(beach[1], beach[2]); path.push(myLatLng1); var contentString =\; if(j==0)//这里的 0 代表起点! {

map.setCenter(myLatLng1);

var marker2 = new google.maps.Marker ({

position: myLatLng1, map: map,

title:'起点:'+beach[0], });

contentString1= GetcontentString(\点信息\,\起点\); var infowindow1 = new google.maps.InfoWindow ({

content: contentString1 , maxWidth: 200, });

google.maps.event.addListener(marker2, 'click', function() { infowindow1.open(map,marker2); }); }

else if(j== arr.length-2) {

var marker3 = new google.maps.Marker ({

position: myLatLng1, map: map,

title:'终点:'+beach[0], });

contentString2= GetcontentString(\点信息\,\终点\);

var infowindow2 = new google.maps.InfoWindow ({

content: contentString2 , maxWidth: 200, });

google.maps.event.addListener(marker3, 'click', function() { infowindow2.open(map,marker3); }); } else {

var marker1 = new google.maps.Marker ({

position: myLatLng1, map: map, icon: image, title: beach[0], }); }

}

(5) 显示当前位置,代码如下: var dest='<%=Dest %>'; var d=dest.split('*');

//alert(d[0]+\经度:\纬度:\点号:\var latlng_new = new google.maps.LatLng(d[1] ,d[2]); map.setCenter(latlng_new);

var info =d[0]+\经度:\+d[1]+\纬度:\+d[2]+\点号:\+d[3]; document.getElementById('information').innerHTML = info; 截图如下所示: 图1为显示电子地图 图2 为显示南邮位置标志

图3为显示历史轨迹 图4为显示当前位置信息

图1

图2

图3

图4

本文来源:https://www.bwwdw.com/article/eak6.html

Top