检查是否一个位置是一个长方形的周长内的有效途径?(Efficient way of checking

2019-09-17 06:55发布

我先介绍一下这个问题:我开发在那里我已经显示在地图领域中的应用,并覆盖标记和线条。 然而,在BlacBerry OS 5.0,只有MapField在API中没有提供手段覆盖的东西,只能显示位置地图。 它还提供了方法,以屏幕坐标(像素)转换到/从WGS84坐标。 这些方法可能是计算昂贵的。

因此,要画我自己的项目,我需要扩展该类并覆盖其paint()方法。 延伸类还将举行locations.This的集合是怎样的覆盖方法会是什么样子(我将在这里使用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点(可见地图拐角)。

任何其他办法或思路也将不胜感激。

提前致谢。

Answer 1:

只是一个基本理念:以你的“矩形”,如左上角的一个右下一个的两个对角。 变换两个角到笛卡尔空间坐标(x,y,z)由:

x = cos[long] cos[lat]
y = sin[long] cos[lat]
z = sin[lat] 

两者的(x,y,z)坐标是单位矢量(想象球体在被中心(0,0,0)并且所述载体是从那里箭头的表面)。 找到你的地图区域的两个角向量的平均赋范的“中间”(添加为载体,然后通过和向量的长度划分,以确保你有一个新的单位向量)。 当你有中间(xMiddle,yMiddle,zMiddle)对于每一个标的坐标转换成直角坐标(x,y,z)请使用点积(xMiddle,yMiddle,zMiddle)作为接近到中间的量度。

现在,包括每一个地标,其点积用(xMiddle,yMiddle,zMiddle)比使用左上角的点积越大(xMiddle,yMiddle,zMiddle)

这应该给你所有地标在“中间”为中心的圆盘内。



Answer 2:

你至少可以排除大量的候选人有一个天真的箱子检查在地图坐标空间。 有可能是这里三个主要情况。 要么有一个极是矩形或没有。 如果极是不可见的,或者是矩形穿过+/- 180度线或没有。 不能有任何+/- 90线,因为这将南北极放在一起,你不四维地图的工作,是吗? ;-)

案例1,一极是明显的:如果它是北极,找出哪些角落的具有最小的纬度。 任何小于纬度可能关闭屏幕。 如果它是南极正好颠倒逻辑,即使用最大的纬度和排除具有更大的自由度任何项目。 我知道,有一个角落的两极和赤道的另一意味着你仍然包括整个半球。 但至少可以便宜地排除了另一半。

情况2中,没有极,不交叉的+/- 180经线:找到最小/最大经度和纬度值,并使用与用于一个简单的框检查。 箱外的任何屏幕外。

情况3中,没有极,但交叉的+/- 180经度线:与上述相同纬度。 对于经度,发现经度分别从+180和-180最远。 排除与最小值/最大值之外,或者你发现两个最远的经度之间的纬度的任何项目。

案件2和3应该能排除足够的候选人,以便为其他可行的蛮力检查。 案例1,可能需要进一步的后处理,但我怕,如果你想要的东西复杂的部分是对我来说有点太复杂了。 我想你可以某种方式找到一个离屏最靠近极点如果极是远离屏幕的中央。 然后以某种方式在这一点上构造一个三角形形状与一个角并使其尽可能大而不接触屏幕的矩形。



Answer 3:

我想你只需要你的rectengular周边转换为地理坐标 。 而不是试图将geogrpahic坐标转换到屏幕坐标。

我很遗憾,答案是天真的 - 但你要问关于逻辑。 所以我想象的逻辑就是一个窗口滑动上spehere,这意味着你需要有一个窗口,地理坐标为您的参考点。

您处理“3D”的信息后,就可以开始渲染你的看法。



文章来源: Efficient way of checking if a location is inside a rectangular perimeter?