我先介绍一下问题:我正在开发一个应用程序,需要显示地图区域并覆盖标记和线条。不过,在BlackBerry OS 5.0中,API中提供的唯一的MapField类不提供叠加物的手段,只能在特定位置显示地图。虽然它提供了将屏幕坐标(像素)转换为/从WGS84坐标的方法,但这些方法可能计算成本很高。
因此,为了绘制自己的元素,我需要扩展这个类并重写其paint()方法。扩展类还将持有一个位置集合。以下是重写的方法示例(我将在这里使用Java):
然而,要在屏幕上绘制这些对象,我们首先需要将标记位置(纬度、经度)转换为屏幕坐标(像素中的x、y)。由于地图不是静态的,因此无法提前完成此操作,因为它可以滚动和缩放。因此,在每个绘制循环中,我们应该至少绘制可见对象。也就是说,我的问题是:
给定一个矩形范围,其中四个角是地理位置(当前显示的地图部分的变换后的四个角),是否有一种快速方法来循环遍历集合中的每个标记并确定它们是否可见?
我不需要这个测试的精确度达到100%,如果屏幕外的一些位置被绘制出来也没有关系。但是,由于标记集合可能包含许多元素(<100),并且绘制方法将在每个屏幕重绘时调用,尝试绘制集合中的每个位置而不检查其是否可见可能会影响性能并引入延迟,当用户与地图交互时。
在您尝试提供天真的答案之前,请注意这不是一个简单的几何问题:我们正在使用地理坐标,而不是整数屏幕坐标。世界不会以经度+180或纬度+90结束。此函数应在极点和赤道上工作,因此当我们有与矩形相交的过渡线(从-180到+180或从-90到+90或两条线)时,我需要它也能正常工作。由于逻辑可能会变得复杂,因此我想知道是否存在现有算法或开源库已经完成并测试了这一点,而不是实现自己的算法。
我还可以首先将集合中的每个位置转换为屏幕坐标,然后轻松检查仅由正屏幕坐标(从x = 0,y = 0开始)组成的矩形,但由于转换函数可能很昂贵,因此我认为最好只在每次刷新时转换4个点(可见地图角),而不是不确定数量的标记。
任何其他方法或想法也将不胜感激。
提前感谢您。
因此,为了绘制自己的元素,我需要扩展这个类并重写其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),并且绘制方法将在每个屏幕重绘时调用,尝试绘制集合中的每个位置而不检查其是否可见可能会影响性能并引入延迟,当用户与地图交互时。
在您尝试提供天真的答案之前,请注意这不是一个简单的几何问题:我们正在使用地理坐标,而不是整数屏幕坐标。世界不会以经度+180或纬度+90结束。此函数应在极点和赤道上工作,因此当我们有与矩形相交的过渡线(从-180到+180或从-90到+90或两条线)时,我需要它也能正常工作。由于逻辑可能会变得复杂,因此我想知道是否存在现有算法或开源库已经完成并测试了这一点,而不是实现自己的算法。
我还可以首先将集合中的每个位置转换为屏幕坐标,然后轻松检查仅由正屏幕坐标(从x = 0,y = 0开始)组成的矩形,但由于转换函数可能很昂贵,因此我认为最好只在每次刷新时转换4个点(可见地图角),而不是不确定数量的标记。
任何其他方法或想法也将不胜感激。
提前感谢您。