我正在使用标记为谷歌地图上的数据库中保存的地址绘制标记。不幸的是,数据库中的一些企业共享办公楼,这意味着它们的地址/邮政编码具有相同的长/纬度,这意味着您只能看到一个标记,但我需要显示的是每个标记与原始标记有一点偏移每个企业都是不同的企业,在同一栋建筑中并非都是相同的企业——例如 Osaka Fish Concern、Quahog Toys、Widgets ltd 等。
我无法相信这些年来我忘记了多少数学,并且无法找出正确的术语来搜索方程式。
我需要的是一个简单的等式,将标记放置在另一个点周围的圆形图案中。
例如,如果我收到 10 个企业的数据,它们都具有相同的经度/纬度,第一个将被绘制在精确的经度/纬度处,但其他 9 个我想在附近绘制,但理想情况下看起来像他们在围绕第一个圆圈。
我已经实现了一种这样做的方法,该方法暂时对 long/lat 的方向进行了一些随机化,但其中一些最终距离太远而无法被视为同一事物的一部分。
当前例程是一个非常简单的例子,即从值中添加或减去固定距离,然后检查我们是否已经在列表中找到了它。
我正在预处理服务器中的所有数据,因此例程在 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;
}
?>
这确实有效,并使它们保持相当紧凑,我只是想稍微完善一下。
谢谢。