最近学习了一下MapXtreme 2004开发网页GPS定位;研究了近半月,觉得自己对JAVA脚本实在不熟悉,网页框架控制也不太好做,尤其是浏览器和服务端的交互问题一直比较难控制。
要在地图上显示GPS车辆位置,有2个办法:一个是在Map控件的地图中添加一层,然后利用已知的经纬度生成地图图元,然后在发送到浏览器,这种方式的缺点就是必须刷新浏览器才能得到最新的地图信息(包含新添加或者移动的图元),效率比较低;
另外一种方式是通过浏览器脚本实现:
首先,地图刷新到客户端浏览器的时候,把当前地图的Center、Scale、以及利用DisplayTransform.FromDisplay得到的原点(屏幕位置0,0)对应的经纬度信息一并写到浏览器端的Cookie中去;(这里说明一下,为什么要这么做呢?因为如果浏览器和服务端信息的交互势必要造成页面的刷新(可能是我没控制好),使用ajax技术又会出现地图控件没定义的问题,所以暂时我还只能把浏览器脚本可能用到的参数写到浏览器);
有了这几个参数,屏幕坐标、地图坐标的互换就简单多了:
这是相关的浏览器Java脚本:
///读取中心点,视野,原点
var centerx = 0.0;//中心x坐标
var centery = 0.0;//中心y坐标
var zooms = 0.0;//地图视野
var zerox = 0.0;// 原点X经度
var zeroy = 0.0;// 原点Y纬度
function loadzoom()
{ centerx = parseFloat(readcookie("CenterX"));
centery = parseFloat(readcookie("CenterY"));
zooms = parseFloat(readcookie("Zoom"));
zerox = parseFloat(readcookie("ZeroX"));
zeroy = parseFloat(readcookie("ZeroY"));
var s = "当前地图视野:" + zooms*1.609 + "KM\r\n" + "中心X:" + centerx +"\r\n" + "中心Y:" + centery + "\r\n"
}
//读取Cookie,vv是要读取的变量名
function readcookie(vv)
{
try
{
var cook = document.cookie;
if (cook)
{
var cValues = cook.split(';');
for(i=0;i<cValues.length;i++)
{
if (cValues[i].match(vv))
{
var val = unescape(cValues[i]);
var start = cValues[i].indexOf('=') + 1; return unescape(cValues[i].substring(start));
return unescape(cValues[i].substring(start,val.lenth-1)); }
}
}
}
catch(e){}
return null;
}
//显示鼠标所在位置经纬度
function myMosemove(){
var curlong = (770/2 - event.x)*((centerx - zerox) / 770 * 2) + centerx;
/*enterx 、centery是屏幕中心的地图坐标;770是包含地图页面的宽度,580包含地图页面的高。地图控件必须位于页面的中心,可以通过<ifram>框架来包含地图页面,这样逻辑清楚些*/
var curlat = (580/2 - event.y )*((zeroy - centery) / 580 * 2) + centery;
var strlong = "";
var strlat = "";
strlong = curlong + ' '; //当前鼠标所在位置的经度
strlat = curlat + ' '; //当前鼠标所在位置的纬度
document.getElementById("pointshow").innerText =strlong.substring(0,7) + ',' + strlat.substring(0,6); // pointshow是一个标签控件,用于显示鼠标位置的经纬度。strlong.substring(0,7)是截取字符串的长度,因为从MpXtreme得到的经纬度精度非常高,有10多位长,如果显示出来就大霎风景了,保留4位小数显示足矣!
}
var posx;//保存得到的屏幕坐标x
var posy; //保存得到的屏幕坐标y
//根据经纬度计算屏幕坐标,x-经度,y-纬度
function getpost(x,y){
//计算每像素经纬度跨度
var longx = (centerx - zerox) / 770 * 2;
var laty = (zeroy - centery) / 580 * 2;
var longpy = (x - centerx)/longx;
var latpy = (y-centery)/laty;
posx = 770/2 + longpy;
posy = 580/2 - latpy;
}
如果要显示车辆在地图上,可以利用getpost()函数得到的屏幕坐标定位一个DIV,然后在DIV中插入图标文件,再显示这个DIV就可以了。记住,得到的屏幕坐标可能不在页面范围之内,这个时候要把DIV隐藏起来。
这样就可以避免刷新页面了。但是这样的问题就是比较麻烦,当已经显示DIV在地图上时,刷新或放大页面后必须立即重新计算DIV的位置并显示,这其中的逻辑过程就不多说了。
如果你能动态的变化经纬度(动态的获取到GPS车辆的信息),就可以动态的,无刷新的更新车辆在地图上的位置了。
这些是我的一些构思,实际做出来的东西因为其它业务逻辑尚没处理完整,所以没能放到网页上供大家参考,希望大家多交流!
评论