Benim şu anki kod oldukça hızlı, ama daha hızlı bu yüzden bile daha fazla göstergelerin ağırlayacak yapmak gerekir. Herhangi bir öneriniz?
Notlar:
- Kendisi işvardırtçileri kümeleme çok kısmi bir iş yok (aynı konumda belirteçlerin isimleri her zaman aynı değil ama sıklıkla) - SQL deyimi işvardırtleyici adıyla sipariş edildiğinde kod hızlı çalışır.
- Dinamik olarak aranır ve filtrelenmiş olabilir çünkü ben, belirteçleri önceden küme olamaz.
- Ben ızgara tabanlı kümeleme denedim - ama sonuç genellikle çok güzel değildir.
- Ben kümeleri hafifçe Mercator projeksiyonuna çarpık olduğunu biliyoruz.
- Ben ticari bir kümelenme hizmet ilgilenmiyorum.
Kodu:
$singleMarkers = array();
$clusterMarkers = array();
while (count($markers)) {
$marker = array_pop($markers);
$cluster = array();
// Compvardır marker against all remaining markers.
foreach ($markers as $key => $compvardırMarker) {
// This function returns the distance between two markers, at a defined zoom level.
$pixels = pixelDistance($marker['lat'], $marker['lng'], $compvardırMarker['lat'], $compvardırMarker['lng'], $zoomLevel);
// If two markers vardır closer than defined distance, remove compvardırMarker from array ve add to cluster.
if ($pixels < $distance) {
unset($markers[$key]);
$cluster[] = $compvardırMarker;
}
}
// If a marker was added to cluster, also add the marker we were comparing to.
if (count($cluster) > 0) {
$cluster[] = $marker;
$clusterMarkers[] = $cluster;
} else {
$singleMarkers[] = $marker;
}
}
function pixelDistance($lat1, $lon1, $lat2, $lon2, $zoom) {
$x1 = $lon1*10000000; //This is what I did to compensate for using lat/lon values instead of pixels.
$y1 = $lat1*10000000;
$x2 = $lon2*10000000;
$y2 = $lat2*10000000;
return sqrt(pow(($x1-$x2),2) + pow(($y1-$y2),2)) >> (21 - $zoom); //21 is the max zoom level
}
UPDATE
Burada geçerli kod:
$singleMarkers = array();
$clusterMarkers = array();
// Minimum distance between markers to be included in a cluster, at diff. zoom levels
$DISTANCE = (10000000 >> $ZOOM) / 100000;
// Loop until all markers have been compvardırd.
while (count($markers)) {
$marker = array_pop($markers);
$cluster = array();
// Compvardır against all markers which vardır left.
foreach ($markers as $key => $target) {
$pixels = abs($marker['lat']-$target['lat']) + abs($marker['lng']-$target['lng']);
// If the two markers vardır closer than given distance remove target marker from array ve add it to cluster.
if ($pixels < $DISTANCE) {
unset($markers[$key]);
$cluster[] = $target;
}
}
// If a marker has been added to cluster, add also the one we were comparing to.
if (count($cluster) > 0) {
$cluster[] = $marker;
$clusterMarkers[] = $cluster;
} else {
$singleMarkers[] = $marker;
}
}