UIMapview上绘制点的最小距离

时间:2013-09-15 06:00:44

标签: iphone ios mkannotation mkannotationview mkmapview

我的查询是在UIMAPVIEW上绘制点所需的最小距离,以便它们可以显示为不同的点。 例如,假设在同一个公寓中有用户,他们的纬度 - 经度之间几乎没有任何距离。那么我如何区分它们呢?

1 个答案:

答案 0 :(得分:1)

通常有两种方式 - 一种是聚类,这意味着您使用带有数字的标记来指示有多少基础标记。当点击它时,然后向用户显示单独的标记(或递归放大,其将标记分割得越来越多)。 Superpin(www.getsuperpin.com)就是一个例子,但还有其他一些例子。

另一种方法是将标记实际偏离其实际位置。为此,您需要某种分配算法来抵消它 - 也就是说,尽可能将标记设置在尽可能靠近的位置,同时仍然为它们提供足够的表面区域以供查看/触摸。为此,我们使用Fibonacci的向日葵模式。您需要做的是识别具有相同坐标的所有Annotations,对它们进行分组,然后按顺序绘制每个组,同时将其中一个相互抵消 - 例如。有一些代码沿着螺旋形状迭代并沿螺旋线下降标记。

如果您想要采用第二种方法,可以提供示例代码等,请告诉我。

编辑:我发现了一些我们为此编写的代码,但这不是客观的C.你能读懂它吗?

class SunFlower
{
    static $SEED_RADIUS = 2;
    static $SCALE_FACTOR = 4;
    static $PI2 = 6.28318531; // PI * 2
    static $PHI = 1.61803399; // (sqrt(5)+1) / 2

    public static function calcPos($xc, $yc, $factor, $i)
    {
        $theta = $i * SunFlower::$PI2 / SunFlower::$PHI;
        $r = sqrt($i) * $factor;
        $x = $xc + $r * cos($theta);
        $y = $yc - $r * sin($theta);

        if ($i == 1) {
            $y += ($factor * 0.5);
        }

        return array($x, $y);
    }
}