我正在使用标记在Google地图上的数据库中保存地址标记。不幸的是,数据库中的一些业务共享办公楼,这意味着它们的地址/邮政编码具有相同的长/ lat,这意味着您只能看到一个标记,但我需要显示的是每个标记与原始标记偏移一点每个企业都是不同的企业,而不是同一栋企业中的所有企业 - 例如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;
}
?>
这确实有效并且让它们保持合理的紧张,我只想稍微完善它。
感谢。