阅读:2150回复:4
MapXtreme 2005学习(6):两种方法实现动态轨迹
在GIS中,动态轨迹的实现是非常有用的,可用GPS定位,热点跟踪等。在本例中,先创建一个用于呈现动态轨迹的临时图层,并在图层上添加一个点表示位体的位置。代码如下:<br><br> <br> /**//// <summary><br> /// 创建动态轨迹图层<br> /// Glacier<br> /// 2008年8月7日<br> /// <param name="trackLayerTableName">图层表名</param><br> /// <param name="trackLayerName">图层名</param><br> /// <param name="firstPoint">点初始坐标</param><br> /// </summary><br> protected void CreateTrackLayer(string trackLayerTableName, string trackLayerName, DPoint firstPoint)<br> {<br> MapInfo.Mapping.Map myMap = MapInfo.Engine.Session.Current.MapFactory[MapControl1.MapAlias];<br><br> //创建临时图层<br> MapInfo.Data.TableInfoMemTable tblInfoTemp = new MapInfo.Data.TableInfoMemTable(trackLayerTableName);<br> MapInfo.Data.Table tblTemp = MapInfo.Engine.Session.Current.Catalog.GetTable(trackLayerTableName);<br> if (tblTemp != null)<br> {<br> MapInfo.Engine.Session.Current.Catalog.CloseTable(trackLayerTableName);<br> }<br><br> tblInfoTemp.Columns.Add(MapInfo.Data.ColumnFactory.CreateFeatureGeometryColumn(myMap.GetDisplayCoordSys()));<br> tblInfoTemp.Columns.Add(MapInfo.Data.ColumnFactory.CreateStyleColumn());<br> tblTemp = MapInfo.Engine.Session.Current.Catalog.CreateTable(tblInfoTemp);<br><br> FeatureLayer workLayer = new FeatureLayer(tblTemp, AnimationLayerName, AnimationLayerName);<br> myMap.Layers.Add(workLayer);<br><br> //向临时图层中添加初始点<br> FeatureGeometry pfg = new MapInfo.Geometry.Point(workLayer.CoordSys, firstPoint.x, firstPoint.y) as FeatureGeometry;<br> MapInfo.Styles.CompositeStyle cstyle = new MapInfo.Styles.CompositeStyle(new MapInfo.Styles.SimpleVectorPointStyle(52, System.Drawing.Color.Blue, 30));<br><br> MapInfo.Data.Feature pft = new MapInfo.Data.Feature(tblTemp.TableInfo.Columns);<br> pft.Geometry = pfg;<br> pft.Style = cstyle;<br> workLayer.Table.InsertFeature(pft);<br> }<br><br> <br><br>实现动态轨迹的第一种方法是,对原来点的坐标的位置进行偏移,从实现位置的更新。代码如下:<br><br> <br> /**//// <summary><br> /// 把原来的点偏移到新的位置以实现动态轨迹<br> /// Glacier<br> /// 2008年8月7日<br> /// <param name="trackLayerTableName">图层表名</param><br> /// <param name="newPoint">点的新坐标</param><br> /// </summary><br> protected void UpdateTrack(string trackLayerTableName, DPoint newPoint)<br> {<br> MapInfo.Data.Table altb = MapInfo.Engine.Session.Current.Catalog.GetTable(trackLayerTableName);<br> if (altb == null)<br> {<br> return;<br> }<br><br> //Change the positon of the existed feature.<br> SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchWhere("");<br> Feature ftr = MapInfo.Engine.Session.Current.Catalog.SearchForFeature(altb, si);<br> if (ftr == null)<br> {<br> return;<br> }<br> DPoint offsetPoint = new DPoint(newPoint.x - ftr.Geometry.Centroid.x, newPoint.y - ftr.Geometry.Centroid.y);<br> ftr.Geometry.GetGeometryEditor().OffsetByXY(offsetPoint.x, offsetPoint.y, DistanceUnit.Degree, DistanceType.Spherical);<br> ftr.Geometry.EditingComplete();<br> ftr.Update();<br> }<br><br> <br><br>实现动态轨迹的第二种方法是,先删除原有的点,再在新的位置添加一个新点。因为第一种方法求偏移过程中可能会产生误差,并且这种误差是会积累的。而这种方法相对来说会比较精确一点。代码如下:<br><br> <br> /**//// <summary><br> /// 把删除原有点并向图层中添加新点以实现动态轨迹<br> /// Glacier<br> /// 2008年8月7日<br> /// <param name="trackLayerTableName">图层表名</param><br> /// <param name="newPoint">点的新坐标</param><br> /// </summary><br> protected void UpdateTrack(string trackLayerTableName, DPoint newPoint)<br> {<br> MapInfo.Data.Table altb = MapInfo.Engine.Session.Current.Catalog.GetTable(trackLayerTableName);<br> if (altb == null)<br> {<br> return;<br> }<br><br> //Delete the existed feature and create a new one.<br> SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchWhere("");<br> Feature dftr = MapInfo.Engine.Session.Current.Catalog.SearchForFeature(altb, si);<br> if (dftr == null)<br> {<br> return;<br> }<br> altb.DeleteFeature(dftr);<br> MapInfo.Mapping.Map myMap = MapInfo.Engine.Session.Current.MapFactory[MapControl1.MapAlias];<br> FeatureGeometry pfg = new MapInfo.Geometry.Point(myMap.GetDisplayCoordSys(), new DPoint(newPoint.x, newPoint.y)) as FeatureGeometry;<br> MapInfo.Styles.CompositeStyle cstyle = new MapInfo.Styles.CompositeStyle(new MapInfo.Styles.SimpleVectorPointStyle(52, System.Drawing.Color.Blue, 30));<br><br> MapInfo.Data.Feature pft = new MapInfo.Data.Feature(altb.TableInfo.Columns);<br> pft.Geometry = pfg;<br> pft.Style = cstyle;<br> altb.InsertFeature(pft);<br> }
|
|
|
1楼#
发布于:2009-05-12 08:41
先支持一下。
|
|
2楼#
发布于:2009-08-17 16:29
<img src="images/post/smile/dvbbs/em56.gif" />
|
|
3楼#
发布于:2009-08-17 16:44
<img src="images/post/smile/dvbbs/em01.gif" />
|
|
4楼#
发布于:2009-08-17 16:44
<img src="images/post/smile/dvbbs/em01.gif" />
|
|