Hallo Leute...
zerbreche mir seit nun mehr 4 Stunden meine Platte darüber, wie ich am besten nahe liegende Punkte, welche auf einer Karte verzeichnet werden, gruppieren kann.
Im Prinzip speichere ich den erst Besten Eintrag in in ein Array. Alle fortlaufenden Koordinaten werden mit dieser ersten Gruppe verglichen, ob der Radius <= 20 ist. Befindet sich das Punkt innerhalb dieses Bereichs, werden die Koordinaten als neues Array der Gruppe hinzugefügt.
Das ganze hat nur den Haken, das es extrem unsauber arbeitet. Ich frage mich daher, wie es sonst noch lösen könnte, die Punkte zu Gruppieren. Hat jemand von Euch eine Idee?
Das Grundgerüst des Codes basiert auf dem Tutorial hier von der Seite... ist ein wenig abgeändert, sodass ich besser durchsteigen. Ich hoffe, die Comments reichen.
Und hier nochmal ein Teil der angelegten Array-Struktur.
Zuguter letzt noch einmal ein Blick auf die Karte. Punktpositionen stimmen soweit, nur wie sich gut erkennen lässt, befinden sich viele Punkte auf der rechten Seite der Karte sehr dicht beieinander, sodass eigentlich eine Gruppe enstehen müsste. Leider sind die Nachbarpunkte bereits in einer anderen Gruppe enthalten... wodurch alles etwas seltsam wird. Brauch da wirklich Hilfe... bin langsam mit meinem Latein am Ende
zerbreche mir seit nun mehr 4 Stunden meine Platte darüber, wie ich am besten nahe liegende Punkte, welche auf einer Karte verzeichnet werden, gruppieren kann.
Im Prinzip speichere ich den erst Besten Eintrag in in ein Array. Alle fortlaufenden Koordinaten werden mit dieser ersten Gruppe verglichen, ob der Radius <= 20 ist. Befindet sich das Punkt innerhalb dieses Bereichs, werden die Koordinaten als neues Array der Gruppe hinzugefügt.
Das ganze hat nur den Haken, das es extrem unsauber arbeitet. Ich frage mich daher, wie es sonst noch lösen könnte, die Punkte zu Gruppieren. Hat jemand von Euch eine Idee?
Das Grundgerüst des Codes basiert auf dem Tutorial hier von der Seite... ist ein wenig abgeändert, sodass ich besser durchsteigen. Ich hoffe, die Comments reichen.
PHP:
tengröße
$mapsize = GetImageSize("Bilder/karte.jpg");
//Range einstellen
$range['LEFT'] = 33;
$range['RIGHT'] = 462;
$range['TOP'] = 10;
$range['BOTTOM'] = 585;
$distance = 20;
//Koordinaten für die deutsche Landesgrenze
define ('COORD_LEFT', 5.5);
define ('COORD_RIGHT', 15.5);
define ('COORD_TOP', 55.1);
define ('COORD_BOTTOM', 47.2);
//Wohnorte holen
$query = mysql_query("SELECT Wohnort, Benutzername FROM Mitglieder WHERE Wohnort != ''");
$groups = array();
while($ort = mysql_fetch_array($query, MYSQL_NUM))
{
if($ort[0] != "")
{
$z++;
//Ortsangaben holen
$oquery = mysql_query("SELECT * FROM geo WHERE geo_ort LIKE '$ort[0]' LIMIT 0,1");
if(mysql_num_rows($oquery))
{
$row = mysql_fetch_array($oquery);
//Längen und Breitengrade
$lat = $row['geo_lat'];
$lon = $row['geo_lon'];
if ($range['RIGHT'] > $mapsize[0] or $range['LEFT'] < 0)
{
die('Die angegebene Range liegt ausserhalb des erlaubten Bereichs!');
}
if ($range['BOTTOM'] > $mapsize[1] or $range['TOP'] < 0)
{
die('Die angegebene Range liegt ausserhalb des erlaubten Bereichs!');
}
//Koordinaten umrechnen
$point['LEFT'] = round(($range['RIGHT'] - $range['LEFT']) / (COORD_RIGHT - COORD_LEFT) * ($lon - COORD_LEFT) + $range['LEFT']);
$point['TOP'] = round(($range['BOTTOM'] - $range['TOP']) / (COORD_TOP - COORD_BOTTOM) * (COORD_TOP - $lat) + ($range['TOP'] - 14));
//Gruppen
foreach($groups as $key => $val)
{
$left = abs($val['LEFT']-$point['LEFT']);
$top = abs($val['TOP']-$point['TOP']);
//echo"$left $top<br>";
if($left <= $distance && $top <= $distance)
{
$groups[$key][] = $point;
break;
}
else if(!in_array($point, $groups)) $groups[] = $point;
}
if(!count($groups)) $groups[] = $point;
rsort($groups);
}
}
}
Und hier nochmal ein Teil der angelegten Array-Struktur.
Code:
//Gruppenarray
Array
(
//Gruppe 1
[0] => Array
(
//Koordinaten für Punkte
=> 315
[TOP] => 304
//Gruppenmitglieder
[0] => Array
(
=> 328
[TOP] => 322
)
[1] => Array
(
=> 324
[TOP] => 284
)
[2] => Array
(
=> 318
[TOP] => 331
)
[3] => Array
(
=> 315
[TOP] => 304
)
[4] => Array
(
=> 315
[TOP] => 304
)
[5] => Array
(
=> 324
[TOP] => 284
)
)
)