緯度・経度が一致する場合少しずらしたい

YY3ai2ui24 101views 更新:2015年11月26日

google mapに複数のマーカーをプロットする際に緯度経度が同じものが合った場合に、後ろのマーカーが見えなくなってしまいます。
$check_posに確定済みの緯度経度の情報が入っているとします。
全ての重複しないarray($lat, $lng)のタプルのような形で$check_posにしまっていくと、foreachを全てチェックしないと重複があるかどうかわからなかったので、おそらくO(n)になってしまします。

$lat = $building['lat'];
$lng = $building['lng'];
foreach ($check_pos as $pos){
  // 緯度・軽度が一致したら
  if ($pos['lat'] == $lat and $pos['lng'] == $lng){
    // 横に広がる
    $lng += 0.00005;
  }
}
$check_pos[] = array(
  'lat' => $lat,
  'lng' => $lng
);

これでは良くないので、O(1)のisset()関数を使って高速化するように改善してみました。

// 以下がforeachで回っている
$checked = false;
$lat = $building['lat'];
$lng = $building['lng'];
do { // 緯度・軽度が一致したら横に広がる
  if (isset($check_pos[$lat])){
    if (is_array($check_pos[$lat])){// 複数の値
      if (isset($check_pos[$lat][$lng])){
        $lng += $lat_diff;
      } else {
        $check_pos[$lat][] = $lng;
        $checked = true;
      }
    } else { // ひとつの値
      if ($check_pos[$lat] === $lng){
        $lng += $lat_diff;
      } else {
        $check_pos[$lat] = array($check_pos[$lat], $lng);
        $checked = true;
      }
    }
  } else {
    $check_pos[$lat] = $lng;
    $checked = true;
  }
} while (! $checked);

ログイン / 新規登録してコメントする

このソースコードをストックして後で利用したり、作業に利用したソースコードをまとめることができます。

こちらもお役に立つかもしれません