Kartenelemente gruppieren

Benzol

Erfahrenes Mitglied
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.

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
                )
       )
)
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 :)
 

Anhänge

  • karte.jpg
    karte.jpg
    109 KB · Aufrufe: 17
Hallo Benzol,

ich habs mir mal kurz angeschaut. Versuch doch mal den Gruppenmittelpunkt nach Hinzufügen eines neuen Punktes neu zu berechnen. Er muss ja keinem der tatsächlich vorhandenen Punkte entsprechen. Vielleicht bekommst du damit bessere Resultate.

Markus
 
Das ist schonmal eine wirklich gute Idee! Bin gestern Abend auch noch darauf gekommen, das meine Schleife eigentlich nicht richtig durchlaufen wird.

PHP:
else if(!in_array($point, $groups)) $groups[] = $point;
Das dürfte er eigentlich erst dann machen, wenn der Zeiger auf dem letzten Element des Gruppenarrays steht. Ansonsten gibt es viele Gruppen, die nicht sein drüften...

So langsam komme ich der Sache näher.. vielen dank schonmal - das war ne super Idee! :)
 
Zurück