2016-05-10 2 views
1

У меня есть несколько полигонов и многоугольников. Как получить ограничивающие коробки? Мне нужно только автономное решение.Как получить ограничительную рамку объекта 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 библиотеку и там такая же ошибка в нем.

ответ

0

Here Я нашел правильный ответ (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; 
}