Как получить ограничивающую рамку объекта геойсон?

У меня есть несколько многоугольников и многоугольников. Как получить из них ограничивающие рамки? Мне нужно только автономное решение.

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. Это означает, что весь мир, но это неправильно. Смотрите эту картинку:

Мир

я нашел geoPHP библиотека и есть та же ошибка в нем.

1

Решение

Вот Я нашел правильный ответ (Global Gotchas).

К сожалению, не существует простого и элегантного решения для
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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]