正文

关于Web页面上屏幕坐标和地图坐标的转换思路2006-03-30 13:41:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/tujun/11626.html

分享到:

最近学习了一下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车辆的信息),就可以动态的,无刷新的更新车辆在地图上的位置了。

 

这些是我的一些构思,实际做出来的东西因为其它业务逻辑尚没处理完整,所以没能放到网页上供大家参考,希望大家多交流!

       

 

阅读(7127) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册