Web ADF 实时轨迹是指在Web客户端指定一资源项,并对资源项进行实进跟踪并绘制出轨迹图。实时绘制可采用Ajax实现服务端与客户端无刷新动态绘制,在.net2.0 框架下可轻易实现:通过客户端时钟控制客户端绘制,通过每个时间周期实时到服务端获取数据:
    服务端实现Page CallBack调用:

CallBackScript=Page.ClientScript.GetCallbackEventReference
(this, "message", "processTrack", "context", "postError", true);
String cbDrawLine = Page.ClientScript.GetCallbackEventReference(this, "arg", "DrawHistoryTraceLines", "context");
String callbackscripts = "function callserversDrawLines(arg,context) {" + cbDrawLine + "}";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "callserversDrawLines", callbackscripts, true);

获取客户端激发的事件,设置returnstring为当前空间坐标所对应的当前的屏幕坐标:

void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
{
if (eventArgument == "getCoordinate")
{
returnstring = getCoordinate();
}
}

返回当前屏幕坐标给客户端:

string ICallbackEventHandler.GetCallbackResult()
{
switch (_callbackArg)
{
case "getCoordinate":
return returnstring;
       default:
return RaiseCallbackEvent(_callbackArg);
}
}

客户端脚本:

var myXY=null;//屏幕坐标数据
var moveTimes=0;//移动次数
var preX=null,preY=null; //上一次的X,Y坐标
//绘制跟踪点及轨迹:
function processMyResult(returnmessage, context){
myXY=returnmessage.split(",");
showTraceItem(myXY[2],myXY[0]-8,myXY[1]-8,myXY[3]);
if(preX!=null&&preY!=null)
{
DrawTraceLines(preX,preY,myXY[0],myXY[1]);
}
else
{
// 如果服务服务端的最后一个的点存在,则绘制最后一个点与当前的点。
if (lastX!= null && lastY != null && lastX != 0 && lastY != 0)
{
DrawTraceLines(lastX,lastY,myXY[0],myXY[1]);
} } preX=myXY[0];
preY=myXY[1];
}
//回调错误处理
function postMyError(returnmessage, context){
alert("Callback Error: " + returnmessage + ", " + context);
} //绘制轨迹线,当未做放大、缩小时的绘制
function DrawTraceLines(startx,starty,endx,endy)
{
if (startx != null && starty != null && endx != null && endy != null)
showLayer(map.vectorHistoryObject.divId);
map.vectorHistoryObject.line(startx,starty,endx,endy);
map.vectorHistoryObject.draw();
} //绘制跟踪目标物:
function showGoal(id,x,y,name) {
map.cursor = map.divObject.style.cursor;
var identifyFilePath="../../";
var content = '<div id="'+id+'" style="position: absolute; left: 0px; top:0px;visibility:hidden;">';
content += '<img src="' + identifyFilePath + 'images/tracker.gif" alt="" border="0" hspace="0" vspace="0" />\n';
if(name!='')
{
content += '<div style="background-color=white;font-size=12;width=38">'+name+'</div>';
}
content += '</div>';
map.overlayObject.insertAdjacentHTML("BeforeEnd", content);
window.setTimeout('moveLayer("'+id+'", ' + x + ', ' + y + '); showLayer("'+id+'");', 1000);
}

这种绘制在地图不做相关处理时会比较好地实现,但当地图平移、放大、缩小等相关处理时,由于客户端绘制的坐标与平移时坐标的切换未能及时刷新(从服务端再次更新空间坐标对应的屏幕坐标),从而产生已绘制的图形与真实的图形错位。
     如何使绘制的图形与真实图形相吻合:
     第一:重绘:
     只有重新绘制,才能使真实图形得以在屏幕重新展现,但重新绘制并不是对已经绘制的屏幕坐标进行重绘,因为此时的屏幕坐标已发生偏移,必须重新从服务端取得转换后的数据进行绘制。
由于第一次从服务端获得的通过空间坐标转换的数据(屏幕坐标)与地图放大、平移、缩小后的该空间坐标对应的屏幕坐标不同,因而必须再次对实时跟踪至当前的轨迹点的所有历史空间坐标进行转换成当前屏幕对应的屏幕坐标。
     第二:重绘机制:
     重绘时如果不停止时钟,则地图绘制、坐标转换会有一个时间差的问题,从而产生最后一个点坐标错位问题;
     解决此方法可通过暂停时钟,然后清除历史轨迹,再从服务端获取历史空间坐标对应当前的屏幕坐标,绘制轨迹,最后启动时钟。
     如下图所示:

第三:重绘具体实现:
     方式一:
     在服务端map Control 的UpdateExtent中调用客户端脚本进行重绘;
     此方法在9.2Beta版实现时暂时会出现异常。
     (未做进一步的试验)

方式二:
     在客户端ESRI的官方脚本的function postBack(control, eventArg, responseFunction)中执行重绘。
     1)、在PostBack中捕捉到地图平移、放大、缩小等事件,同时调用页面JavaScript函数:ReDrawTraceLine();

//重新绘绘制地图实时监控轨迹
Function ReDrawTraceLine()
{
//首先暂停实时监控
StopMonitor();
//清除绘制的轨迹线
ClearDrawLayer();
//从客户端触发服务端,把坐标转换,并在客户端获取数据进行绘制
//客记端会在DrawHistoryTraceLines函数中获取服务端返回的数据
ReDrawLayer();
//开启实时监控
StartMonitor(); }
function StopMonitor()
{
window.clearInterval(timerTackerOne);
//vectorHistoryObject为Map控件中新加的一VectorObject
map.vectorHistoryObject.clear(); }
function StartMonitor()
{
timerTackerOne= window.setInterval('getCoordinate()', 5000);
}
function ReDrawLayer()
{ callserversDrawLines("drawHistoryLine");
} function DrawHistoryTraceLines(arg, context)
{ preX=null;
preY=null
var histPoint=arg.split("|");
showLayer(map.vectorHistoryObject.divId);
for(var i=1;i<histPoint.length;i++)
{
if (histPoint[i-1] != null && histPoint[i] != null)
DrawTraceLineQuick(histPoint[i-1].split(",")[0],histPoint[i-1].split(",")[1],histPoint[i].split(",")[0],histPoint[i].split(",")[1]); }
//lastX及lastY为公共变量
lastX = histPoint[histPoint.length-1].split(",")[0];
lastY = histPoint[histPoint.length-1].split(",")[1]
//一定要绘制完所有点,然后执行draw()函数进行刷新,速度、性能加大好多。
map.vectorHistoryObject.draw();
StartMonitor();
} //加快速度绘制历史轨迹
function DrawTraceLineQuick(startx,starty,endx,endy)
{
map.vectorHistoryObject.line(startx,starty,endx,endy);
}

函数ReDrawLayer()是一个Ajax回调函数,必须从服务端获取数据,然后再绘制数据,可按如下方式实现:
     1)、服务端注册回调函数脚本;
     2)、服务端GetCallbackResult回传把所有历史实时跟踪的空间数据转换为现在对应的屏幕坐标的字符串。
     3)、客户端在获取回调消息时,取得当前空间坐标对应的屏幕坐标字符串进行分解并绘制。

原文连接:http://www.cnblogs.com/SmithLee/archive/2006/12/19/596427.html

【转】ArcGIS ADF 实时轨迹问题初步解决方案的更多相关文章

  1. 物联网应用中实时定位与轨迹回放的解决方案 – Redis的典型运用(转载)

    物联网应用中实时定位与轨迹回放的解决方案 – Redis的典型运用(转载)   2015年11月14日|    by: nbboy|    Category: 系统设计, 缓存设计, 高性能系统 摘要 ...

  2. webgl(three.js)实现室内三维定位,3D定位,3D楼宇bim、实时定位三维可视化解决方案——第十四课(定位升级版)

    序: 还是要抽出时间看书的,迷上了豆豆的作品,最近在看<天幕红尘>,书中主人公的人生价值观以及修为都是让我惊为叹止.很想成为那样的人,但是再看看自己每天干的事,与时间的支配情况,真是十分的 ...

  3. 【转】ArcGIS Server10.1安装常见问题及解决方案

    转载自:http://www.higis.cn/Tech/tech/tId/85/ 最近因为更换系统的原因,重新安装了ArcGISServer 10.1.过程中遇到了几个小问题,虽然都一一解决了,但也 ...

  4. webgl(three.js)实现室内定位,楼宇bim、实时定位三维可视化解决方案

    (写在前面,谈谈物联网展会)上次深圳会展中心举行物联网展会,到了展会一看,80%以上的物联网应用都是在搞RFID,室内定位,我一度怀疑物联网落地方案的方向局限性与市场导向,后来多方面了解才明白,展会上 ...

  5. web端百度地图API实现实时轨迹动态展现

    最近在工作中遇到了一个百度地图api中的难题,恐怕有的程序员可能也遇到过.就是实时定位并显示轨迹,网上大部分都是通过创建polyline对象贴到地图上.当然,百度地图的画线就是这样实现的,但是好多人会 ...

  6. Tapdata 实时数据融合平台解决方案(五):落地

    作者介绍:TJ,唐建法,Tapdata 钛铂数据 CTO,MongoDB中文社区主席,原MongoDB大中华区首席架构师,极客时间MongoDB视频课程讲师. 通过前面几篇文章,我们从企业数据整合与分 ...

  7. Tapdata 实时数据融合平台解决方案(四):技术选型

    作者介绍:TJ,唐建法,Tapdata 钛铂数据CTO,MongoDB中文社区主席,原MongoDB大中华区首席架构师,极客时间MongoDB视频课程讲师. 常见搭建数据中台的技术产品 数据中台包括: ...

  8. Tapdata 实时数据融合平台解决方案(三):数据中台的技术需求

    作者介绍:TJ,唐建法,Tapdata 钛铂数据 CTO,MongoDB中文社区主席,原MongoDB大中华区  首席架构师,极客时间MongoDB视频课程讲师. 我们讲完了这个中台的一个架构和它的逻 ...

  9. Tapdata 实时数据融合平台解决方案(二):理解数据中台

    作者介绍:TJ,唐建法,Tapdata 钛铂数据 CTO,MongoDB中文社区主席,原MongoDB大中华区首席架构师,极客时间MongoDB视频课程讲师. 数据中台定义: 以打通部门或数据孤岛的统 ...

随机推荐

  1. 异常解决:java.lang.IllegalStateException: Failed to introspect Class

    java.lang.IllegalStateException: Failed to introspect Class 异常详情 原因 解决办法 异常详情 Exception encountered ...

  2. js用for循环模拟数组翻转

    文章地址 https://www.cnblogs.com/sandraryan/ js本身为数组提供了reverse()方法,可以翻转数组,返回一个新的数组,不影响原数组. 本例中用for循环简单模拟 ...

  3. 2016年NOIP普及组复赛题解

    题目涉及算法: 买铅笔:入门题: 回文日期:枚举: 海港:双指针: 魔法阵:数学推理. 买铅笔 题目链接:https://www.luogu.org/problem/P1909 设至少要买 \(num ...

  4. excel中如何筛选功能的使用

    excel中如何筛选功能的使用 excel是一款数据处理工具,可以在众多的数据中找到想要的经过处理之后的数据,而最直接方便的功能就是筛选.请阅读下文,了解如何对数据进行筛选. 如下图所示的学生成绩中, ...

  5. 用一维数组实现栈(C++编程思想 p120)

    1 实现思路 向栈中插入4个元素后的状态 执行过程分析: 2 代码实现 clib.h 接口定义 typedef struct CStashTag { int ele_size; //栈中每个元素的占用 ...

  6. 2018-8-10-使用-RetroShare-分享资源

    title author date CreateTime categories 使用 RetroShare 分享资源 lindexi 2018-08-10 19:16:51 +0800 2018-02 ...

  7. H3C RIPv1的缺点

  8. linux scull 代码read 方法

    read 的返回值由调用的应用程序解释: 如果这个值等于传递给 read 系统调用的 count 参数, 请求的字节数已经被传送. 这是最好的情况. 如果是正数, 但是小于 count, 只有部分数据 ...

  9. 在后台管理系统中引入富文本编辑器 (vue-quill-editor)

    在admin系统中引入富文本编辑器 (vue-quill-editor) 由于公司项目的需求,内容需要更新,那么自然需要admin后台来上传内容,在苦苦寻觅了N个编辑器之后,终于找到了一个比较容易使用 ...

  10. linux内核指针和错误值

    很多内部内核函数返回一个指针值给调用者. 许多这些函数也可能失败. 大部分情况, 失 败由返回一个 NULL 指针值来指示. 这个技术是能用的, 但是它不能通知问题的确切特性. 一些接口确实需要返回一 ...