如何获得geojson对象的边界框?

时间:2016-05-10 14:11:37

标签: php geospatial geojson

我有几个多边形和多边形。如何获得它们的边界框?我只需要离线解决方案。

bbox

这是我的解决方案:

function mymax($a, $b)
{
    if ($a === null) return $b;
    if ($b === null) return $a; 

    if($a > $b) return $a;
    return $b;
}

function mymin($a, $b)
{
    if ($a === null) return $b;
    if ($b === null) return $a; 

    if($a < $b) return $a;
    return $b;
}

function bbox($g, $bounds=array(null, null, null, null))    
{
    foreach($g as $iter)
    {
        if(is_array($iter))
        {
                $bounds = bbox($iter, $bounds);
        }else{
            $lon = $g[0];
            $lat = $g[1];

            $n = $bounds[0];
            $s = $bounds[1];
            $w = $bounds[2];
            $e = $bounds[3];

            $n = mymin($lat, $n);
            $s = mymax($lat, $s);
            $w = mymin($lon, $w);
            $e = mymax($lon, $e);

            return array($n, $s, $w, $e);
        }
    }

    return $bounds; 
}

但是180 / -180经度交叉存在问题。

有人看过这个吗? 180 / -180经度交叉的问题是最大值是180,最小值是-180。这意味着整个世界,但这是错误的。看到这张图片:

world

我找到了geoPHP库,其中也有相同的错误。

1 个答案:

答案 0 :(得分:0)

Here我找到了正确答案(Global Gotchas)。

  

不幸的是,没有简单而优雅的解决方案来解决问题   全球陷阱。多部分边界框是一种可能的选择,   但它们增加了数据库和搜索过程的复杂性,使其失败   边界框的简单性。

这是正确的代码:

function mymax($a, $b)
{
    if ($a === null) return $b;
    if ($b === null) return $a; 

    if($a > $b) return $a;
    return $b;
}

function mymin($a, $b)
{
    if ($a === null) return $b;
    if ($b === null) return $a; 

    if($a < $b) return $a;
    return $b;
}

function bbox($g, $bounds=array(array(null, null, null, null), array(null, null, null, null)))  
{
    foreach($g as $iter)
    {
        if(is_array($iter))
        {
                $bounds = bbox($iter, $bounds);
        }else{
            $pBounds = $bounds[0];
            $nBounds = $bounds[1];

            $lon = $g[0];
            $lat = $g[1];

            $curBounds = $pBounds;
            if($lon < 0)
            {
                $curBounds = $nBounds;
            }

            $n = $curBounds[0];
            $s = $curBounds[1];
            $w = $curBounds[2];
            $e = $curBounds[3];

            $n = mymin($lat, $n);
            $s = mymax($lat, $s);
            $w = mymin($lon, $w);
            $e = mymax($lon, $e);

            if($lon < 0)
            {
                return array($pBounds, array($n, $s, $w, $e));
            }

            return array(array($n, $s, $w, $e), $nBounds);
        }
    }

    return $bounds; 
}