マーカーを使用して、データベースに保持されている住所のマーカーをGoogleマップにプロットしています。残念ながら、データベース内の一部の企業はオフィスビルを共有しています。つまり、住所/郵便番号の経度/緯度が同じであることを意味します。つまり、マーカーは 1 つしか表示されませんが、表示する必要があるのは、各マーカーが元のものから少しずれていることです。各事業は、同じ建物内のすべてが同じではない別の事業です。たとえば、Osaka Fish Concern、Quahog Toys、Widgets ltd などです。
何年にもわたってどれだけ多くの数学を忘れてしまったのか信じられず、方程式を検索するための適切な用語を見つけることができません.
必要なのは、マーカーを別のポイントの周りに円形パターンで配置する簡単な方程式です。
たとえば、すべて同じ経度/緯度を持つ 10 の企業のデータを受け取った場合、最初の企業は正確な経度/緯度でプロットされますが、他の 9 つの企業は近くにプロットしたいのですが、理想的にはそれらが入っているように見えます最初の円。
今のところ、経度/緯度の方向をランダム化する方法を実装しましたが、それらのいくつかは、同じことの一部と見なすには遠すぎます。
現在のルーチンは、値に一定の距離を加算または減算し、リストに既に取得されているかどうかを確認するという非常に単純なケースです。
サーバー内のすべてのデータを前処理しているので、ルーチンは PHP で実行されます。
<?php
$tmpList = Array();
$latLngKeys = Array();
foreach ($officeList as $oItem) {
if ($oItem['lat'] == null && $oItem['lng'] == null) { continue; }
// now ensure that we don't get multiple lat/lng at same points
$latLngOk = false;
$lat = $oItem['lat'];
$lng = $oItem['lng'];
$origLatLng = md5($lat.$lng);
$displaceLat = 0.0000250000;
$displaceLng = 0.0000250000;
while (!$latLngOk) {
$latLng = md5($lat.$lng);
if (isset($latLngKeys[$latLng])) {
//echo "Key: $latLng, Orig lat: $lat, orig lng: $lng\n";
$numSame = $latLngKeys[$origLatLng];
//$numSame = 1;
$dirX = rand(0,1);
$dirY = rand(0,1);
if ($dirX == 0) { $dispLat = $displaceLat; } else { $dispLat = -$displaceLat; }
if ($dirY == 0) { $dispLng = $displaceLng; } else { $dispLng = -$displaceLng; }
$lat = $oItem['lat'] + ($dispLat * $numSame);
$lng = $oItem['lng'] + ($dispLng * $numSame);
//echo "numSame: $numSame, dirX: $dirX, diry: $dirY, dispLat: $dispLat, dispLng: $dispLng, lat: $lat, lng: $lng, key: $latLng\n"; flush();
$latLngKeys[$latLng]++;
} else {
$latLngKeys[$origLatLng]++;
$latLngOk = true;
break;
}
}
$oItem['lat'] = $lat;
$oItem['lng'] = $lng;
$tmpList[] = $oItem;
}
?>
これは実際に機能し、適度にタイトに保ちます。少しだけ完璧にしたいと思います。
ありがとう。