Fahrzeit zwischen mehreren Punkte als PHP

Hallo,

ich stehe total auf dem Schlau.
Ich Brauche z.b. die Fahrzeiten zwischen drei Orten und das per PHP da diese Info in einer E-Mail verschickt werden soll.
Von den Orten habe ich auch noch die Koordinaten in einer DB (API GoogleMaps) aber nul ahnung wie ich das anstellen kann das mir egal wer sagt das die Fahrzeit z.b a-b 1:12h und b-c 0:45h ist und das dann als PHP Variable für die E-Mail.
Google geht wohl nicht da API ja eigentlich JS ist und die paar XML schnitstellen können das wohl nicht.
Ich habe das auch schon bei anderen diensten versucht aber ich komme einfach nicht weiter bzw. finde keinen ansatz um anzufangen :O).

Luftlinie km ist kein Problem mit OpengeoDB aber ist halt keine Fahrzeit und 20km autobahn sind ja nicht gleich wie 20km Berlin :O)

Hat vielleicht einer von ein idee?

Chffchen

Sowas geht nur mit entsprechenden Straßendaten. Also in welcher Straße welche Bedingungen für welche Fahrzeuge herrschen. Sowas kannst Du nicht selbst programmieren, außer Du nimmst Dir mehrere Jahre Zeit und sammelst persönlich die Daten zusammen.

Du kennst schon GoogleMaps API. Diese kannst Du auch verwenden um solche Daten abzufragen. Siehe:
Google Maps Javascript API V3 Services - Google Maps JavaScript API V3 - Google Code

Hallo,

ok habe mich mich nun doch wieder mit Google beschäftigt und eine abfrage bekommen hin erstmal mit ein alert aber leider keine schleife da ich ca. 3-4 Strecken in einem rutsch brauche um diese dann irgend wie, wie noch keine ahnung, an eine php Datei schicken muss.

Mein versuch war den js code unten in eine php schleife zu packen wo dann immer die Adressdaten aus der DB geändert werden, funzt aber aber fast logisch nicht, habe ich schon geschrieben das javascript nul ahnung :O).

Hier mal der der komplette Code, kann mir da mal ein prof helfen:

[HTML]

Test
[/HTML]

Cheffchen

Du kannst den nötigen JavaScript-Code auch über php generieren.

Beispiel:

[code][/code]

Müsstest Du natürlich nach deinen Wünschen anpassen …

Hallo threadi,

es tut mir echt leid, aber ich stell mich total nacklich an. dein Code läuft zwar fehlerfrei durch aber die berechnete Ausgabe (Weg/Zeit) ist immer der letzte array.
Egal was ich versuche ich zerstöre immer den js code und nichts läuft mehr.

Hier der code noch mal mit eigentlich kaum änderungen von mir ausser das halt zum test der richtungen array schon drin ist.

Sonnst reicht mir ja immer ein schubs aber diesmal bin ich wohl angenagelt :O)
[PHP]

Test

</head>
<body onload="load()" onunload="GUnload()">
    <div id="directions"></div>
</body>
[/PHP] Cheffchen

Die Herausforderung bei Nutzung der Google Maps JavaScript API ist immer das JavaScript selbst. Man muss sich damit ebenso gut auskennen wie die Programmierer der API :wink:

Bei deinem Problem hängt es an eben soetwas würde ich sagen. Ich habe Directions noch nicht verwendet, würde dir aber raten mal in der Referenz der API nachzuschauen womit die Richtung konkret gezeichnet wird. Das müsstest Du für jeden der Einträge ausführen.

Ist jetzt wie gesagt primär ein JavaScript-Problemchen.

OpenStreetMap
lässt sich als xml-datei exportieren, was aus den daten zu lesen ist und ob die strecke enthalten ist, weiss ich nicht, aber die api-beschreibung (xml beschreibung) sollte dort auch zu finden sein

Hallo threadi,
Herausforderung bei Nutzung der Google Maps JavaScript API, das ist gut, so vornehm hätte ich mich nicht ausgedrückt. Ich kämpfe jedesmal und habe bis jetzt immer gewonnen und diesmal auch wieder hände in die höhe:O)
Habe jetzt das fertig, is zwar ein JS fehler drin aber läuft durch und wird alles in einem alert ausgegeben. Jetzt brauch ich die ergebnisse (strecke/zeit) bloss wieder in PHP rüberkriegen und dann kann ich damit machen was ich eigentlich will.

Als info falls das auch mal einer braucht (mehrer Strecken berechnen Weg/Fahrzeit):
Der Code hat noch ein kleinen fehler wenn ein Adresse Fehlerhaft ist und Google die nicht zuordnen kann wird gar keine Adresse/ergebnisse ausgegeben.
(Ist Aktuell für mich uninteressant da ich Daten aus meiner DB hole mit Koordinaten.)

[PHP]

Test

[/PHP] Danke threadi, der schubs hat zum umfallen gereicht :O).

Cheffchen

Sehr schön. Und gut zu wissen, dass das funktioniert. Kann ich sicher auch mal gebrauchen :slight_smile:

PHP ist nicht nötig:
in der map.js ist die Einbindung von google Maps, mittels document.write() undder Zuweisung onload = load

[CODE]

Test
[/CODE]

[FONT=Calibri]Hallo struppi,[/FONT]
[FONT=Calibri]bekommen in eine fehlermeldung. [/FONT][FONT=Calibri]Objekt unterstützt diese Eigenschaft oder Methode nicht[/FONT]
[FONT=Calibri]richtungen.forEach( function(item, idx) { [/FONT]
[FONT=Calibri][/FONT]
[FONT=Calibri]Wie schon gesagt habe ich kaum bis keine js ahnung, was meinst mit map.js, document.write, onload?[/FONT]
[FONT=Calibri]ich habe den api schlüssel oben eingefügt und ein onload im body tag eingefügt, ist wohl falsch :O).[/FONT]
[FONT=Calibri][/FONT]
[FONT=Calibri]wie bekomme ich bei deiner Version an eine andere Datei übergeben (verarbeitung.php?ergebnisse=xxxx)[/FONT]
[FONT=Calibri][/FONT]
[FONT=Calibri]Cheffchen[/FONT]

Du benutzt den IE? Der kann Array.forEach nicht.

Du kannst eine Hilfsfunktion einbauen (von https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/ForEach )

[CODE]if (!Array.prototype.forEach)
{
Array.prototype.forEach = function(fun /, thisp/)
{
var len = this.length >>> 0;
if (typeof fun != „function“)
throw new TypeError();

var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
  if (i in this)
    fun.call(thisp, this[i], i, this);
}

};
}
[/CODE]

und die map.js sieht bei mir so aus:

[CODE]document.write(

‚</script>‘

);

window.onload = function() {

if(!GBrowserIsCompatible()) return;



if(typeof load == 'function') load();

}[/CODE]

Dein anschliessendes Problem ist wohl die Übergabe des Arrays richtungen aus PHP, wenn du das dynamisch machen willst, kommt da durchaus PHP Code rein. In etwa (ich kann nur rudiementär PHP)
[PHP]
// erst der JS Code
var richtungen = [

<?php $richtungen=array( "from: Rostock to: Berlin", "from: 54.0902349, 12.1329501 to: 52.5234051, 13.4113999", "from: Berlin to: Hamburg", "from: Hamburg, Am Rathaus 1 to: Buxtehude"); echo implode(",", $richtungen); ?>

];
[/PHP]

Hallo struppi,
läuft jetzt super auch im IE.

Nun habe ich leider das nächste Problem, das nicht mehr als 10 strecken berechnet werden können sonnst kommt kein ergebnis.
Jetzt ist die frage, blockt maps das generell oder kann man das mit einer kleinen verzögerung im script umgehen das maps das als eigenschutz hat.
Tja und da kommt meine unwissenheit wieder ins Spiel, mit PHP wurde ich einfach mal ein sleep(1); in der 10 Schleife reinmachen aber javascript gibt das wohl sowas nicht, habe zumindestens nichts gefunden bei Onkel Google :O).

Das habe ich dank dir soweit und geht nicht da 11 Strecken und eine einfache pause/sleep bekomme ich nicht hin nach der 9 strecke :O(.

Kannst mir noch mal Helfen, mehr kommt dann bestimmt nicht mehr.

[PHP]

Test


[/PHP]

Cheffchen

Ja, richtig. Hier mal eine Änderung die dir den Statuscode anzeigt:
und dann schau hier, was der Statuscode 620 bedeutet: Google Maps API Reference - Google Maps API - Google Code

// davor bleibt alles beim alten
	var callback = function(i) {
		return function(d) {
			if(d.getDistance()) 
			dist[i] = d.getDistance(); 
			else 
			dist[i] = {html: 'Fehler: ' + d.getStatus().code}; 
			
			// http://code.google.com/intl/de-DE/apis/maps/documentation/javascript/v2/reference.html#GGeoStatusCode
			
			if(++count == richtungen.length) ready(richtungen);
		};
	};
	for(var i = 0; i < richtungen.length; i++){
		var gdir = new GDirections();
		GEvent.addListener(gdir , "load", callback(i));
		GEvent.addListener(gdir , "error", callback(i));
		gdir.load(richtungen[i]);
	}
	// und danach auch keine Änderungen	

Eine Lösung des Problem’s wäre die request nicht parallel zu senden, sondern nacheinander.

[CODE]function load() {
var richtungen = [
„from: Rostock to: Berlin“,
„from: 54.0902349, 12.1329501 to: 52.5234051, 13.4113999“,
„from: Berlin to: Hamburg“,
„from: Hamburg, Am Rathaus 1 to: Buxtehude“,
„from: Rostock to: Berlin“,
„from: 54.0902349, 12.1329501 to: 52.5234051, 13.4113999“,
„from: Berlin to: Hamburg“,
„from: Hamburg, Am Rathaus 1 to: Buxtehude“,
„from: Rostock to: Berlin“,
„from: 54.0902349, 12.1329501 to: 52.5234051, 13.4113999“,
„from: Berlin to: Hamburg“,
„from: Hamburg, Am Rathaus 1 to: Buxtehude“
];

function send_request (dir) {
	var gdir = new GDirections();
	GEvent.addListener(gdir , "load", callback(dir));
	GEvent.addListener(gdir , "error", callback(dir));
	gdir.load(dir);
};
function callback(txt) {
	return function(d) {
		if(d.getDistance()) 
			show( txt + d.getDistance().html)
		else 
			show( txt + ' Fehler: ' + d.getStatus().code); 
			// http://code.google.com/intl/de-DE/apis/maps/documentation/javascript/v2/reference.html#GGeoStatusCode
		next();
	};
};
var count = 0;
function next() {
	if(count < richtungen.length)  send_request(richtungen[count++]);
	
}
function show(txt) {
	var o = document.getElementById("out");
	
	o.innerHTML += txt  + '<br>';
}
// Start
next();

}
[/CODE]

Hallo struppi,

scheisse bist du gut :O).
läuft jetzt super ohne Fehler.
Das jetzt in ein Imput feld und verschicken lassen bekomme ich selber hin, das ich die Daten als PHP Variable habe.
Ich habe 1 Woche gebraucht um zu verzweifeln und Du :O).

Besten Dank
Cheffchen

Danke.

Das mit den Callback Funktionen ist halt sehr JS typisch, mit sowas tut man sich als PHP Programmierer schwer, da das dort eher selten vorkommt.
Ich muste aber auch ein bisschen in der Doku schauen Google Maps API Reference - Google Maps API - Google Code - die aber eigentlich übersichtlich ist.