1、GIS软件设计实验报告 专 业 学 号 姓 名 一、软件设计目的:通过构建嵌入式终端模块、服务器端模块、浏览端模块这三个模块,掌握利用windows mobile模拟汽车导航、SQL server完成车辆GPS数据读取管理、google earth API完成车辆位置信息浏览,并以此增强C#编程能力。二、软件设计内容:本次软件设计内容分三部分模块进行,该三个模块分别为嵌入式终端模块、服务器端模块、浏览端模块,最后这三个模块集成为该小组软件系统,三个模块需要完成的内容如下所示:嵌入式终端模块:该部分模拟汽车导航终端软件部分。基本功能要求:能实现电子地图浏览、读取模拟GPS数据、GPS数据显示(即
2、当前位置显示)、GPS数据上传至服务器数据库。软件推荐:windows mobile服务器端模块:主要完成车辆GPS数据读取管理。基本功能要求:读取终端上传过来的GPS数据,并存储。支持对车辆GPS数据进行检索查询等操作、终端当前位置、历史轨迹查询需求。软件推荐:SQL server、C#语言浏览端模块:完成车辆位置信息浏览基本功能。功能要求:在web 浏览器上显示车辆当前位置、移动轨迹、历史轨迹等。软件推荐:google earth API 、灵图API、ASP.net三、软件实现数据准备:1、 遥感影像配准(WGS_84),并导出.img文件(已包含坐标信息)1.1加载影像图1.2为Lay
3、ers定义坐标系统PredefinedGeograpic Coorinate SystemsWorldWGS 19841.3将配准好的图导出2、 SDE中建立数据库,要素类Car,并注册版本添加GlobalID(不确定是否每一步都必要,但这样做肯定没问题)如图3、 制作mxd地图文档,添加img文件和Car,4、 发布地图服务,5、 利用ArcToolboxMobile ToolsGenerate Mobile Service Cache工具发布的服务转换为bin文件,作为mobileservice读取的数据6、 后台建立数据库,建立表,设置如图字段7、 GPS数据的准备,建立文本文件,自定义
4、数据格式,点名、X坐标、Y坐标、嵌入式汽车导航终端软件系统(1)窗口界面设计向窗口拖入7个button控件,修改它们的text属性,分别为加载、放大、缩小、漫游、停止、单步显示、自动显示;向窗体拖入1个Lable控件,将它的text属性改为位置列表;向窗体拖入一个Listbox控件、一个Timer控件和一个map控件。窗口设计如下:(2)代码设计1)双击加载button控件,写入代码,读取存放在txt文档中的GPS数据,代码如下:string strLine = ; string filename = TempGPS数据.txt; try FileStream aFile = new File
5、Stream(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=strArr0; namei+ = strArr0; PointsCollection.Coordinate.
6、X = Convert.ToDouble(strArr1); PointsCollection.Coordinate.Y = Convert.ToDouble(strArr2); Pointkindscc.Add(PointsCollection.Coordinate); strLine = sr.ReadLine(); sr.Close(); catch (IOException ex) MessageBox.Show(ex.ToString(); 2)双击放大butto控件,写入代码,实现电子地图的放大功能,代码如下:this.map1.CurrentMapAction = this.zo
7、omInMapAction1;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;priva
8、te void DeleteAll() FeatureLayer featurelayer = this.mobileService1.Layers0 as FeatureLayer; QueryFilter queryfilter = new QueryFilter(); FeatureDataTable featuredatatable = featurelayer.GetDataTable(queryfilter, null); foreach (FeatureDataRow row in featuredatatable.Rows) row.Delete(); featuredatat
9、able.SaveInFeatureLayer(); private void ShowCar(int t) ESRI.ArcGIS.Mobile.Geometries.Point tp = new ESRI.ArcGIS.Mobile.Geometries.Point(Pointkindscct); string selectlayername = Car; m_selectedFeatureLayer = this.mobileService1.Layersselectlayername as FeatureLayer; FeatureDataTable featureDataTable
10、= m_selectedFeatureLayer.GetDataTable();/要素表对象featureDataTable新增一条空的记录 FeatureDataRow editedFeature = featureDataTable.NewRow(); /获取要素图层对象的几何列,并把SketchGraphicLayer图层的几何值赋值给他 int geometryIndex = m_selectedFeatureLayer.GeometryColumnIndex;editedFeaturegeometryIndex = tp; / 把新增的记录赋回到要素数据表中 featureDataT
11、able.Rows.Add(editedFeature);/保存结果 featureDataTable.SaveInFeatureLayer();string X = tp.Coordinate.X.ToString(); string Y = tp.Coordinate.Y.ToString(); this.listBox1.Items.Add(namet + + X + + Y); this.listBox1.SelectedIndex = k+; UpLoad(namet, X, Y); 6)双击自动显示button控件,写入代码,实现每隔一秒显示汽车的当前位置,代码如下:this.ti
12、mer1.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
13、Service () /如果使用设计的组件,请取消注释以下行 /InitializeComponent(); public SqlConnection connection = new SqlConnection(Data Source=du-96e8d5846746;Initial Catalog=GISshixi;User ID=sa;Password=sa); WebMethod(Description = WriteGPS, EnableSession = false) public void WriteGPS(string dianming, string X,string Y,st
14、ring datetime) connection.Open(); string dian = string.Format(01, , dianming); string XX = string.Format(01, , X); string YY = string.Format(01, , Y); string tt = string.Format(01, , datetime); string sqlstr = INSERT INTO GPS信息(点号,X坐标,Y坐标,时间) VALUES ( + dian + , + XX +, + YY +, + tt + ); System.Data
15、.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)窗口界面设
16、计向窗口拖入2个button控件,修改它们的text属性,分别为历史轨迹查询、查询当前位置;向窗体拖入1个dataGridView1控件。窗口设计如下:(2)读取终端上传过来的GPS数据,并存储connectionString = server=du-96e8d5846746;uid=sa;pwd=sa;database=GISshixi;myConnection = new SqlConnection(connectionString); string Olestr = select * from GPS信息; SqlCommand cmd = new SqlCommand(Olestr,
17、myConnection); SqlDataAdapter adp = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adp.Fill(dt);(3)代码设计1)双击历史轨迹查询button控件,写入代码,实现查询历史轨迹的功能,代码如下: string Olestr = select * from GPS信息; SqlCommand cmd = new SqlCommand(Olestr, myConnection); SqlDataAdapter adp = new SqlDataAdapter(cmd); DataTab
18、le dt = new DataTable(); adp.Fill(dt); dataGridView1.DataSource = dt;2)双击查询当前位置button控件,写入代码,实现查询历史轨迹的功能,代码如下: string Olestr = select 点号,X坐标,Y坐标,时间 from GPS信息 where 时间=(select MAX(时间) from GPS信息); SqlCommand cmd = new SqlCommand(Olestr, myConnection); SqlDataAdapter adp = new SqlDataAdapter(cmd); Da
19、taTable dt = new DataTable(); adp.Fill(dt); dataGridView1.DataSource = dt;截图如下所示:图1为历史轨迹查询结果图2为当前位置查询结果图1图2 车辆GIS管理浏览器端软件系统(1) 窗口界面设计,如下图所示:(2)读取数据库内容,代码如下:Array1 = ; SqlData1 sd = new SqlData1(); string cmdText = select distinct * from gps信息; dt = sd.ExecuteDatatable(CommandType.Text, cmdText, null
20、); int i = 1; foreach(DataRow dr in dt.Rows) Array1 += dr时间.ToString(); Array1 += *; Array1 += drY坐标.ToString(); Array1 += *; Array1 += drX坐标.ToString(); Array1 += *; Array1+=i.ToString(); Array1 += |; i+; sd = new SqlData1(); cmdText = select * from gps信息 order by 时间 desc; DataRow dr1 = sd.ExecuteD
21、atarow(CommandType.Text, cmdText, null); if (dr1 != null) Dest += dr1时间.ToString(); Dest += *; Dest += dr1Y坐标.ToString(); Dest += *; Dest += dr1X坐标.ToString(); Dest += *; Dest += i.ToString(); (3) web 浏览器上显示电子地图,代码如下:var latlng = new google.maps.LatLng(32.1058 , 118.9313); var image = new google.map
22、s.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(map_canvas), myOptions); geocoder = new google.map
23、s.Geocoder(); var contentString =GetcontentString(Hello,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, f
24、unction() infowindow.open(map,marker); );(4) 显示历史轨迹。代码如下:function btnAddpointline_onclick() var array=;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 (va
25、r 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=arrj; var beach = beachs.split(*); var myLatLng1 = new google.maps.LatLng(beach1, beach2); path.push(myLatLng1); var co
26、ntentString =; if(j=0)/这里的 0 代表起点! map.setCenter(myLatLng1); var marker2 = new google.maps.Marker ( position: myLatLng1, map: map, title:起点:+beach0, ); contentString1= GetcontentString(Gps点信息,起点); var infowindow1 = new google.maps.InfoWindow ( content: contentString1 , maxWidth: 200, ); google.maps.
27、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:终点:+beach0, ); contentString2= GetcontentString(Gps点信息,终点); var infowindow2 = new google.maps.InfoWindow ( content: cont
28、entString2 , 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: beach0, ); (5) 显示当前位置,代码如下:var dest=;var d=dest.split(*);/alert(d0+经度:+d1+纬度:+d2+点号:+d3);var latlng_new = new google.maps.LatLng(d1 ,d2); map.setCenter(latlng_new); var info =d0+经度:+d1+纬度:+d2+点号:+d3;document.getElementById(information).innerHTML = info;截图如下所示:图1为显示电子地图图2 为显示南邮位置标志图3为显示历史轨迹图4为显示当前位置信息图1 图2 图3 图4