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);