面朝大海,春暖华开

focus on scientific computue, 3dgis, spatial database
专注于科学计算、GIS空间分析

 

MapGuide open source开发系列教程五: 屏幕坐标与地图坐标(问题)已修改

MapGuide os 的Map frame methods,提供了ScreenToMapUnits,用于屏幕坐标到地图坐标的转换。
api文档如下:

ScreenToMapUnits(x, y)
Converts a position expressed in pixels (screen units) to one expressed in map units, returning a Point object:
Point {
X;
Y;
}

Parameters:
x - the x coordinate, expressed in pixels.

y - the y coordinate, expressed in pixels.

See Also: GetMapUnitsType()

可是,mos并没有提供对应的MapUnitsToScreen(x, y) 。不知道这是为什么?
如果自己编写,用什么方法?
如果用数值计算的方法,逐步逼近,应该可以。不过,那样太复杂,性能也不好。
可不可以直接线性内插?
step1.计算屏幕中心的x-pixel, y-pixel,
step2, 用ScreenToMapUnits,得到x-map, y-map
step3, 根据上面的两点,按比例,进行线性插值。
因为只涉及到单个屏幕,单副地图的坐标,应该没有多大的误差。

我又查了一下js源代码在viewerfiles目录下找到了以下源代码
function ScreenToMapUnits(x, y)
{
 if(x > mapDevW - 1)
  x = mapDevW - 1;
 else if(x < 0)
  x = ""0"";

 if(y="" >mapDevH - 1)
  y = mapDevH - 1;
 else if(y < 0)
  y = ""0"";

 x = ""extX1"" + (extX2="" -="" extX1="") * (x="" / mapDevW);

 y = extY1 - (extY1 - extY2) * (y / mapDevH);

 return new Point(x, y);
}
这说明,这个函数本身就是采用的线性插值,所以,我们反过来用,肯定没有问题。

posted on   风过 无痕  阅读(800)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

统计

向日葵支付宝收钱码
点击右上角即可分享
微信分享提示