Leaflet:Koordinaten für Marker aus Datenbank auslesen und anzeigen

BigJim87

Lt. Junior Grade
Registriert
Juli 2008
Beiträge
397
Update siehe Post #16

Hallo

aus persönlichem Interesse und nicht aus sonstigen kommerziellen oder privaten Grünen, habe ich mir folgende Problematik gestellt.

Es geht darum in einer Karte Marker an zu zeigen, welche die Koordinaten aus einer SQL Datenbank bekommen.
Das heißt ich habe eine Datenbank erstellt, in der Name, Lon, Lat abgespeichert sind, und nun sollen diese Marker Automatisch gesetzt werden.
Das bedeutet ich brauche eine Schleife, die alle Werte aus der Datenbank ausliest, und dann für jede Zeile aus der Datenbank einen neuen Marker erzeugt.

Ich bin schon so weit gekommen, dass alle Werte aus der Datenbank ausgelesen werden können, aber irgendwie erstellt der trotzdem nur einen Marker dort hin, wo der letzte Eintrag in der Datenbank war.
Hier das Skript dazu:

Code:
<!DOCTYPE html>
<html>
    
    <head>
        <link rel="stylesheet" type="text/css" href="leaflet/leaflet.css" />
        <!--[if lte IE 8]>
            <link rel="stylesheet" type="text/css" href=" leaflet/leaflet.ie.css" />
        <![endif]-->
        <script src="leaflet/leaflet-src.js"></script>
        <style>
            html, body, #map {
                height: 100%;
            }
            body {
                padding: 0;
                margin: 0;
            }
        </style>
        <title>Creating markers with popups and handling events</title>
    </head>
    
    <body>
		
<?php

//Auslesen der Koordinaten der ersten Person zum centern
  $verbindung = include ('pgdb.inc.php');
  $table    = "freunde";

  $sql_center = "SELECT lon, lat FROM $table WHERE marker_id = 1";
  $res_center = pg_query($sql_center);

	$row_center = pg_fetch_array($res_center, NULL, PGSQL_ASSOC);
			$lon_center = $row_center["lon"];
			$lat_center = $row_center["lat"];
			
//Auslesen aller Koordinaten um Marker zu erstellen		
  $sql = "SELECT * FROM $table";
  $res = pg_query($sql);
	
	
while($row = pg_fetch_array($res, NULL, PGSQL_ASSOC ))
	{
		$id = $row["marker_id"];
		$name = $row["name"];
		$lon = $row["lon"];
		$lat = $row["lat"];
		echo "<br>$id $name $lon $lat";
	}

  pg_close ($verbindung);
  
 ?>

        <div id="map"></div>
        
        <script type="text/javascript">
            var map = L.map('map', {
                center: [<? echo $lon_center;?>, <? echo $lat_center;?>],
                zoom: 16
            });
            L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
                attribution: '&copy; OpenStreetMap contributors'
            }).addTo(map);
				
            var markers = [
				["<? echo $name;?>",<? echo $lon;?>,<? echo $lat;?>],
            ];
            
      
		for (var i = 0; i < markers.length; i++) {
			marker = new L.marker([markers[i][1],markers[i][2]])
				.bindPopup(markers[i][0])
				.addTo(map);
		}
       
        </script>
    </body>

</html>


Und hier ein Screen wie das aussieht:



Wie man sieht, werden oben die Namen (Natürlich nur Fakenamen) und Koordinaten aus der Datenbank ausgelesen, aber es wir nur ein Marker erzeugt...
 
Zuletzt bearbeitet:
Ahja wenn der andere Mod da zu macht..
Ich hab ja dem versucht zu erklären, dass es keine Hausaufgaben sind, sondern eine freiwillige nicht abzugebene Aufgabe, die ich aus reinem Interesse mache.. aber der Mod hat leider noch nicht reagiert.. und ewig zeit opfern wollte ich auch nicht...
Lösch das andere einfach, und dass das hier laufen
 
BigJim87 schrieb:
Ahja wenn der andere Mod da zu macht..
Ich hab ja dem versucht zu erklären, dass es keine Hausaufgaben sind, sondern eine freiwillige nicht abzugebene Aufgabe, die ich aus reinem Interesse mache.. aber der Mod hat leider noch nicht reagiert.. und ewig zeit opfern wollte ich auch nicht...
Lösch das andere einfach, und dass das hier laufen

Den entscheidenden Tipp hast Du doch schon bekommen. Bau eine Schleife ein!

Wenn es dabei konkrete Probleme gibt, stell konkrete Fragen!

Sich hier die Aufgaben lösen lassen, ist aus offensichtlichen Gründen nicht erwünscht.
 
Wie im Quellcode zu sehen ist hole ich mir die Daten aus der Datenbank bereits mit einer While schleife raus
unten habe ich eine For Schleife, die für jeden Wert autoatisch einen Button erzeugt.
Das funktioniert auch, wenn ich in das Array in Zeile 67 einfach drei Personen sammt Koordinate eintrage.

Das Problem was ich habe ist, dass oben die While Schlife zwar durch läuft, aber nur den letzten Wert aus der Datenbank an das Array in Zeile 67 schickt. Somit wird nur ein Button erzeugt...

Was ich nun brauche ist eine Möglichkeit, wie ich die Werte aus der While Schleife ziehen kann sodass kontinuirlich ein neuer Button erzeugt wird mit den jeweiligen Werten
 
Ähm... genau das macht eine Schleife doch... Du hast es nur verbockt, dein gesamter Ablauf ist fürs Klo.

Mach es, wie ein Prof dir hoffentlich beigebracht hat:
Schreib einen verdammten Programmablaufplan, bevor du wild im Code herumstolperst und Murks verzapfst.
 
Ja das hab ich verstanden (ps. die Codevorlage kommt vom Prof und ich habe nur die schleife für den Marker eingefügt)

Was ein Programmablaufplan ist weiß ich net.. das haben wir nicht gemacht.
Wir bekommen den fertigen Code und sollen ihn nur so verändern, bis das raus kommt, was man will

Das problem ist, dass die while schleife durchläuft und schön alle werte aus der DB holt. Das ist auch gut
Aber am ende der While schleife steht in den Variablen nur noch der letzte Wert aus der DB drinne. Somit kann die unten auch nur ein Button erzeugt werden.
Was ich aber will ist
erste Zeile aus der Tabelle auslesen--> Button erzeugen
zweite zeile aus Tabelle auslesen --> Button erzeugen
usw
 
BigJim87 schrieb:
Das problem ist, dass die while schleife durchläuft und schön alle werte aus der DB holt. Das ist auch gut
Aber am ende der While schleife steht in den Variablen nur noch der letzte Wert aus der DB drinne.
Und genau da liegt das Problem. Guck dir genaustens an, was die Schleife, welche dir die Daten aus der DB in die Variablen schreibt, macht und welchen Inhalt die Variablen in jedem Durchlauf haben. Dann solltest du erkennen, warum du nur einen Marker hast.
 
mir ist klar, dass die while schleife durch läuft und in jede Variable den entsprechenden INhalt hinein schreibet. Dann springt sie in die nächste zeile und holt den neuen INhalt raus, den sie wieder in die Variablen schreibt. Das macht sie so lange, bis sie am Ende der Datenbank ist. Somit steht am ende immer der letzte Wert der Datenbank in den Variablen.
Das Problem ist erkannt, aber ich weiß keine Lösung dafür ^^
 
Naja, wie speicherst man denn 3 versch. Datensätze so, dass sie auch nach der Schleife jeweils einzeln vorliegen (können)?
 
Zuletzt bearbeitet:
Ich sitz daran schon seit 8h
ich weiß es einfach nicht...
 
wie erledigt...
 
BigJim87 schrieb:
Ich sitz daran schon seit 8h
ich weiß es einfach nicht...

Du hast da ne Menge Optionen....
1.) Du iterierst über die Ergebnisse der Abfrage an der Stelle, wo du die Daten auch brauchst -> nur eine Schleife -> flott, aber kaum ausbaufähig.
2.) Du baust dir eine eigene Klasse, die sich darum kümmert.
3.) Du verwendest Arrays und denkst daran, dass selbige mehrdimensional sein können.

Aber dass euer Professor euch nie erklärt hat, wie man auf PAPIER programmiert, eben z.B. mit einen Programmablaufplan, das ist mehr als peinlich. Strukturierte Anwendungsentwicklung mit vereinfachten Schemata, idealerweise auf Kritzel-Papier, gehört einfach dazu. Da sieht man viel schnell gravierende Logikfehler.
Und da heutzutage niemand mehr mit Bleistiften umgehen kann... es gibt ja noch den PapDesigner.
 
@Daaron: Es ist natürlich alles richtig, was du schreibst, aber wer weiß, was der TE gerade für eine Ausbildung genießt. Vllt ist es da einfach nicht relevant, auch, wenn solche Grundlagen auch meiner Meinung nach bei einer Ausbildung dazugehört, wenn man nicht Informatik studiert. Selbst ich hatte das damals in der Ausbildung und ich habe nur IT-Systemelektroniker gelernt ^^

@TE: kleiner Tipp: Du hast nur jeweils eine Variable für id, name, lon und lat. Darin kann man nicht 3 verschiedene Datensätze für die spätere for-Schleife speichern ;)

Weiterer Tipp: Wie oft wird deine for-Schleife durchlaufen und warum wird sie so oft durchlaufen?
 
Servus
also erstmal auch ein danke an euch ^^
Ich studiere Vermessungswesen. Da gehört halt so ein winzig kleiner Teil Informatik im Wert von 3 SWS dazu.
Das reicht gerade mal um ein bils rum zu spielen
Also euer Tip war natürlich Gold wert und der Trick war es die Werte in ein Array zu packen.
Bisher klappt das auch sehr gut.
Es werden nun 3 Marker angezeigt.
Aber das Problem was ich noch habe ist, dass ich unten in Zeile 64 ja die Arrays erzeuge, die dann benutzt werden um immer einen neuen Marker zu erzeugen. Aber hier habe ich es noch nicht geschafft, dass er automatisch immer ein neuen Array erzeugt, wo die neuen Werte drinne stehn.
Hintergrund ist ja der, dass ich nun manuel 3 Arrays erzeugt habe, aber ich ja theoretisch nicht weiß, wie viele Freunde in meiner Datenbank stehen. Habt ihr da noch einen Tip?

Hier mal der code
Code:
<!DOCTYPE html>
<html>
    
    <head>
        <link rel="stylesheet" type="text/css" href="leaflet/leaflet.css" />
        <!--[if lte IE 8]>
            <link rel="stylesheet" type="text/css" href=" leaflet/leaflet.ie.css" />
        <![endif]-->
        <script src="leaflet/leaflet-src.js"></script>
        <style>
            html, body, #map {
                height: 100%;
            }
            body {
                padding: 0;
                margin: 0;
            }
        </style>
        <title>Creating markers with popups and handling events</title>
    </head>
    
    <body>
		
<?php

//Auslesen der Koordinaten der ersten Person zum centern
  $verbindung = include ('pgdb.inc.php');
  $table    = "freunde";

  $sql_center = "SELECT lon, lat FROM $table WHERE marker_id = 1";
  $res_center = pg_query($sql_center);

	$row_center = pg_fetch_array($res_center, NULL, PGSQL_ASSOC);
			$lon_center = $row_center["lon"];
			$lat_center = $row_center["lat"];
			
//Auslesen aller Koordinaten um Marker zu erstellen		
  $sql = "SELECT name, lat, lon FROM $table";
  $res = pg_query($sql);

		$array = array();
			for ( $i = 0 ; $i < 99; $i++ ) {
				$array[] = $row = pg_fetch_array($res, NULL, PGSQL_ASSOC );
		}	
				
  pg_close ($verbindung);

 ?>
        <div id="map"></div>
 
        <script type="text/javascript">

									
            var map = L.map('map', {
                center: [<? echo $lon_center;?>, <? echo $lat_center;?>],
                zoom: 16
            });
            L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
                attribution: '&copy; OpenStreetMap contributors'
            }).addTo(map);
           
//Automatisches erstellen mehrer Marker
                
            var markers = [
				["<? echo $array[0]['name'];?>",<? echo $array[0]['lon'];?>,<? echo $array[0]['lat'];?>],
				["<? echo $array[1]['name'];?>",<? echo $array[1]['lon'];?>,<? echo $array[1]['lat'];?>],
				["<? echo $array[2]['name'];?>",<? echo $array[2]['lon'];?>,<? echo $array[2]['lat'];?>],
            ];
            
		for (var i = 0; i < markers.length; i++) {
			marker = new L.marker([markers[i][1],markers[i][2]])
				.bindPopup(markers[i][0])
				.addTo(map);
		}
		
        </script>
    </body>

</html>
 
Zuletzt bearbeitet:
Code:
var markers = [];
<? foreach ($array as $index => $entry): ?>
   markers[<?= $entry['name'] ?>] =  [<?= $entry['lon']?>, <?= $entry['lat']?>]; // John => ['47,25',  '10,59']
<? endforeach; ?>

So ungefähr dürfte es funktionieren.

Du machst folgendes:
DB Werte auslesen und in einen Array komisch packen.
Dieses Array wird wieder in JavaScript ausgelesen (iteriert) und ein JS Array gebildet.
Dieses ließt du nun wieder aus und erstellst deiner Marker.
Tatal unnötig.

Das erste Array ($array) was du bildest kannst du beim erstellen der Marker benutzen.
So sparst du dir unnötige Schleifen und Arrays.

PS: "For" ist wohl die einfachste Schleife aber sicher nicht die beste für deine Bedürfnisse.
 
Zuletzt bearbeitet:
Warum gibst du auch vor, wie groß dein Array wird? Warum baust du for($i...)?
Ein paar Dinge, die du über Arrays wissen solltest...
- $futtermittel[] ="Pudding"; hängt "Pudding" an das Array $futtermittel hinten dran.
- foreach($futtermittel as $lecker){echo $lecker;} einfach mal gucken, was foreach macht.
 
Zurück
Oben