我将首先介绍这个问题:我正在开发一个应用程序,我必须在其中显示一个地图字段,并覆盖标记和线条。但是,在 BlacBerry OS 5.0 中,唯一MapField
可用的 API 不提供覆盖内容的方法,仅在某个位置显示地图。它还提供了将屏幕坐标(像素)转换为 WGS84 坐标或从 WGS84 坐标转换的方法。这些方法可能在计算上很昂贵。
所以要绘制我自己的项目,我需要扩展这个类并覆盖它的 paint() 方法。扩展类还将保存一组位置。这就是被覆盖方法的样子(我将在这里使用 Java):
public void paint (Graphics g) {
super.paint(g); //draws the map
//TODO
//Draw placemarks. The placemarks are basically holder objects
//(for latitude and longitude) stored in a collection in this class.
}
然而,要在屏幕上绘制这些对象,我们应该首先将地标位置(纬度、经度)转换为屏幕坐标(x,y,以像素为单位)。这不能提前完成,因为地图不是静态的,所以它可以滚动和放大。这就是为什么在每个绘制循环中我们至少应该绘制可见对象。也就是说,我的问题是:
给定一个矩形周长,其中角是地理位置(当前显示的地图部分的转换后的四个角),是否有一种快速的方法可以循环遍历集合中的每个地标并确定它们是否可见?
我不需要这个测试是 100% 准确的,我不介意屏幕外的几个位置是否被绘制。但是由于地标集合可以包含许多元素(< 100),并且每次屏幕重绘都会调用paint方法,因此尝试在不检查是否可见的情况下绘制集合中的每个位置可能会影响性能并在用户与地图交互。
在您尝试提供一个天真的答案之前,请注意这不是一个简单的几何问题:我们使用的是地理坐标,而不是整数屏幕坐标。世界的尽头不是经度+180,也不是纬度+90。这个函数应该在两极和 ecuator 中工作,所以当我们有一条与矩形相交的过渡线(从 -180 到 +180,或从 -90 到 +90,或两条线)时,我也需要它工作。由于逻辑可能变得复杂,我想知道是否存在已经完成和测试的现有算法或开源库,而不是实现我自己的。
我也可以首先将集合中的每个位置转换为屏幕坐标,然后轻松检查仅由正屏幕坐标(从 x=0,y=0 开始)组成的矩形,但我认为转换函数可能很昂贵每次刷新时只转换 4 个点(可见的地图角)比不确定数量的地标要好。
任何其他方法或想法也将不胜感激。
提前致谢。