[转]展示车辆实时轨迹
/********************************************************/
// 功能:展示车辆实时轨迹
/*******************************************************/
var trackRealtimeIconUrl = "./App_Themes/Vehicles/carRun";//默认的车辆图标
var trackLastIconUrl;
var trackRealtimeRecordNum = 0;
var trackPoint; //地图上车辆显示的位置
var trackMap; //单独获取的地图
var trackPointGroup; //地图上点的集合
var lastResult; //上次接收到的数据
var trackLine; //轨迹线
//获取地图对象
trackMap = $find("TrackRealtimeMap");
if(trackMap != null)
{
spatialReference = trackMap.get_spatialReference();
trackMap.add_zoomCompleted(function(){trackMap.refreshGraphics(true)});
trackMap.add_panCompleted(function(){trackMap.refreshGraphics(true)});
}
//获取地图坐标系统
var spatialReference;
if(trackMap != null)
spatialReference = trackMap.get_spatialReference();
//此处采用的extjs,也就是等页面内容完全加载后就执行此处代码
Ext.onReady(function() {
//处理页面传递来的数据
processTrackRealtimeInfo(passinfo);
//并在5秒中后启动实时数据获取
setTimeout(getTrackRealtimeInfo,5000);
});
//实时数据获取函数
function getTrackRealtimeInfo()
{
//此处采用exejs的 Ajax方案,各位可以改用asp.net的Ajax方案
Coolite.AjaxMethods.GetGpsInfo(tracktmlid,tracklasttime,{success:processTrackRealtimeInfo});//ajax方法请求台数据
setTimeout(getTrackRealtimeInfo,10000); //循环调用,时间间隔为10秒钟
}
//处理实时获取的数据
function processTrackRealtimeInfo(result)
{
if(result.updated == 1) //获取的数据在更新了的情况下才进行下一步的处理
{
tracklasttime = result.gpstime; //设置下次获取时的时间
if(lastResult != null) //要判断当前的数据坐标与上次数据坐标是否相同
{
if(result.speed == 0 && lastResult.speed == 0)
{
//不做地图更新,不做任何事情
}
else
{
if(lastResult.lon != result.lon || lastResult.lat != result.lat)
{
updateGPSPosition(result); //在地图上进行绘制
}
}
}
else
{
updateGPSPosition(result); //在地图上进行绘制
}
lastResult = result;
}
}
//更新GPS数据在地图上的展示
function updateGPSPosition(result)
{
//首先判断是否有,
if(trackMap == null)
{
trackMap = $find("TrackRealtimeMap");
if(trackMap == null)
return;
spatialReference = trackMap.get_spatialReference();
trackMap.add_zoomCompleted(function(){trackMap.refreshGraphics(true)});
trackMap.add_panCompleted(function(){trackMap.refreshGraphics(true)});
}
if(trackPoint == null) //在gps点不存在的情况下,创建它。否则只对其进行更新
{
//添加
initTrackPointGroup();
createTrackPoint(result);
}
else
{
updateTrackPoint(result);//更新位置和属性信息
}
updateTrackLine(result); //更新轨迹线
//当GPS的当前位置不在视野范围内时,则将其移动到地图中央
var trackMapEnvelope = trackMap.get_extent();
if(result.lon < trackMapEnvelope.get_xmin() ||
result.lon > trackMapEnvelope.get_xmax() ||
result.lat < trackMapEnvelope.get_ymin() ||
result.lat > trackMapEnvelope.get_ymax())
{
var pt = new ESRI.ADF.Geometries.Point(result.lon,result.lat,spatialReference);
trackMap.panTo(pt,true);
}
//强制重新绘制地图上绘制的GraphicFeature
trackMap.refreshGraphics(true);
}
//在地图上创建点,并设置地图的视野范围
function createTrackPoint(Gpsinfo)
{
trackPointGroup.clear();
trackMap.refreshGraphics(true);
var carUrl = getCarIconDirect(trackRealtimeIconUrl ,Gpsinfo.direction);
trackLastIconUrl = carUrl;
var carPoint = new ESRI.ADF.Geometries.Point(Gpsinfo.lon,Gpsinfo.lat,spatialReference);
var carMarkerSymbol = new ESRI.ADF.Graphics.MarkerSymbol(carUrl,15,15,"pointer"); //创建非选中状态时的符合显示
trackPoint= $create(ESRI.ADF.Graphics.GraphicFeature,{"geometry":carPoint,//创建GraphicFeature,然后将其添加到GraphicsFeatureGroup
"symbol":carMarkerSymbol});
trackPointGroup.add(trackPoint);
trackMap.zoom(trackMap.get_minZoom(),carPoint,false);
trackMap.zoom(150,carPoint,false);//250trackMap.get_maxZoom()
bInit = true;
}
//更新点的信息
function updateTrackPoint(Gpsinfo)
{
trackMap.refreshGraphics(true);
//获取每个对象的值
var carUrl = getCarIconDirect(trackRealtimeIconUrl,Gpsinfo.direction);
//更新坐标信息
var pt = new ESRI.ADF.Geometries.Point(Gpsinfo.lon,Gpsinfo.lat,spatialReference);
trackPoint.set_geometry(pt);
if(carUrl != trackLastIconUrl)
{
trackPoint.get_symbol().set_imageUrl(carUrl); //更新图片显示
trackLastIconUrl = carUrl;
}
trackMap.refreshGraphics(true);
}
//更新轨迹线
function updateTrackLine(gpsinfo)
{
if(lastResult == null) //上次无数据,也就代表着仅仅上传了一次数据,只有一个点无法创建线
return;
var newpath = new ESRI.ADF.Geometries.CoordinateCollection();
var newpt =new ESRI.ADF.Geometries.Point(gpsinfo.lon,gpsinfo.lat,spatialReference);
var lastpt = new ESRI.ADF.Geometries.Point(lastResult.lon,lastResult.lat,spatialReference);
newpath.add(lastpt);
newpath.add(newpt);
if(trackLine != null) //轨迹存在的情况下则只更新其坐标
{
trackLine.get_geometry().addPath(newpath);
}
else
{ //不存在的情况下创建新的线
var newPolyline = new ESRI.ADF.Geometries.Polyline(newpath,spatialReference);
var trackLineSymbol = new ESRI.ADF.Graphics.LineSymbol();
trackLineSymbol.set_lineColor('blue');
trackLineSymbol.set_width(3);
trackLineSymbol.set_cursor('crosshair');
trackLineSymbol.set_opacity(0.7);
trackLine = $create(ESRI.ADF.Graphics.GraphicFeature,{"id":trackRealtimeRecordNum.toString(),
"geometry":newPolyline,
"symbol":trackLineSymbol});
trackMap.addGraphic(trackLine);
}
trackMap.refreshGraphics(true);
}
//初始化GraphicFeatureGroup
function initTrackPointGroup()
{
if(trackPointGroup == null)
{
// Use ASP.NET AJAX $create to create a new graphic feature group and define type, properties, events.
trackPointGroup = $create(ESRI.ADF.Graphics.GraphicFeatureGroup,{"id":"trackPointGroup"});//, "mapTips":mapTips
// Add the graphic feature group to the map.
trackMap.addGraphic(trackPointGroup);
}
}