cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5917
  • QQ14265545
  • 铜币29669枚
  • 威望217点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
阅读:2150回复:4

MapXtreme 2005学习(6):两种方法实现动态轨迹

楼主#
更多 发布于:2008-08-21 10:37
在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>    }
喜欢0 评分0
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
hppla
路人甲
路人甲
  • 注册日期2009-04-01
  • 发帖数5
  • QQ
  • 铜币115枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2009-05-12 08:41
先支持一下。
举报 回复(0) 喜欢(0)     评分
ivan_yaya
路人甲
路人甲
  • 注册日期2009-08-08
  • 发帖数3
  • QQ
  • 铜币107枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2009-08-17 16:29
<img src="images/post/smile/dvbbs/em56.gif" />
举报 回复(0) 喜欢(0)     评分
ivan_yaya
路人甲
路人甲
  • 注册日期2009-08-08
  • 发帖数3
  • QQ
  • 铜币107枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2009-08-17 16:44
<img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
ivan_yaya
路人甲
路人甲
  • 注册日期2009-08-08
  • 发帖数3
  • QQ
  • 铜币107枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2009-08-17 16:44
<img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
游客

返回顶部