• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Fahrzeit zwischen mehreren Punkte als PHP

Cheffchen

Senior HTML'ler
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
 
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:
 <html>
<head>
<title>Test</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAIBlfPcR43RwgLRxQKjAy2xRzxUU7HWfUhvWvbguoaaquJfPF1RQR1WAEgPwjeFfjvNmou0qqiz48MA" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function load() {
if (GBrowserIsCompatible()) {
// hier wollte ich die PHP schleife beginnen
var map;
var directions;
directions = new GDirections(null, document.getElementById("directions"));
directions.load("from: 500 Memorial Drive, Cambridge, MA to: 4 Yawkey Way, Boston, MA 02215 (Fenway Park)");
//Hier Ausgabe veranlassen
directions.getDistance(); //object->meters
directions.getDuration(); //obejct->secondes
GEvent.addListener(directions, "load", function() {
alert( directions.getDistance().meters + ' m ' + directions.getDuration().seconds +' sec'); });
// hier wollte ich die PHP schleife ende
}
}
//]]>
</script>
 
</head>
<body onload="load()" onunload="GUnload()">
<div id="directions"></div>
</body>
</html>

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

Beispiel:
Code:
<script type="text/javascript">
//<![CDATA[
function load() {
if (GBrowserIsCompatible()) {
// hier wollte ich die PHP schleife beginnen
var map;
var directions;
directions = new GDirections(null, document.getElementById("directions"));
<?php
// hier irgendein PHP-Code über den Du die Richtungen einliest, vlt. in einer Schleife:
for(x=0;x<count($richtungen);x++)
{
 ?>
  directions.load("<?php echo $richtungen[$x]; ?>");
  //Hier Ausgabe veranlassen
  directions.getDistance(); //object->meters
  directions.getDuration(); //obejct->secondes
  GEvent.addListener(directions, "load", function() {
  alert( directions.getDistance().meters + ' m ' + directions.getDuration().seconds +' sec'); } );
 <?php
}
?>
</script>

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:
<html>
    <head>
        <title>Test</title>
        <script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAIBlfPcR43RwgLRxQKjAy2xRzxUU7HWfUhvWvbguoaaquJfPF1RQR1WAEgPwjeFfjvNmou0qqiz48MA" type="text/javascript"></script>
 
 <script type="text/javascript">
 //<![CDATA[
 function load() {
 if (GBrowserIsCompatible()) {
 var directions;
 directions = new GDirections(null, document.getElementById("directions"));
 <?php
 // hier irgendein PHP-Code über den Du die Richtungen einliest, vlt. in einer Schleife:
         $richtungen=array("from: Hamburg to: Berlin","from: Berlin to: Potsdam","from: Potsdam to: München");
          for($x=0;$x < count($richtungen);$x++)
          {
                    ?>
                     directions.load("<?php echo $richtungen[$x]; ?>");
                     //Hier Ausgabe veranlassen
                     directions.getDistance(); //object->meters
                     directions.getDuration(); //obejct->secondes
                     GEvent.addListener(directions, "load", function() {
                     alert( directions.getDistance().meters + ' m ' + directions.getDuration().seconds +' sec \n <?php echo $richtungen[$x]; ?>');
                             } );
           <?php
          }
          ?>
          }
          }
 </script>
 
    </head>
    <body onload="load()" onunload="GUnload()">
        <div id="directions"></div>
    </body>
</html>
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 ;)

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:
<html>
<head>
<title>Test</title>
<script src=" http://maps.google.com/?file=api&amp;v=2.x&amp;key=ABQIAAAAIBlfPcR43RwgLRxQKjAy2xRzxUU7HWfUhvWvbguoaaquJfPF1RQR1WAEgPwjeFfjvNmou0qqiz48MA" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
var gdir;
function load() {
 if (GBrowserIsCompatible()) {
 <?php
 // hier irgendein PHP-Code über den Du die Richtungen einliest, vlt. in einer Schleife:
         $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");
          for($x=0;$x < count($richtungen);$x++)
          {
                    ?>
          gdir<?php echo $x; ?>  = new GDirections(null, document.getElementById("directions")); //map oder null
          GEvent.addListener(gdir<?php echo $x; ?> , "load", onGDirectionsLoad);
          gdir<?php echo $x; ?> .load("<?php echo $richtungen[$x]; ?>");
          gdir<?php echo $x; ?> .getDistance(); //object->meters
          gdir<?php echo $x; ?> .getDuration(); //obejct->secondes
          <?php
          }
          ?>
 }
}
 
function onGDirectionsLoad() {
          //Um an Informationen der load()-Funktion heranzukommen.
          //Bei Nichtverwendung nicht loeschen!
          alert(<?php for($x=0;$x < count($richtungen);$x++){ ?> '<?php echo $richtungen[$x]; ?>\n' + gdir<?php echo $x; ?>.getDistance().meters + ' m ' + gdir<?php echo $x; ?>.getDuration().seconds +' sec \n'+ <?php } ?> gdir0.getStatus().code);
    }
//]]>
</script>
</head>
<body onload="load()" onunload="GUnload()">
 <div id="directions" style="display:none"></div>
</body>
</html>
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 :)
 
PHP ist nicht nötig:
in der map.js ist die Einbindung von google Maps, mittels document.write() undder Zuweisung onload = load

Code:
<!doctype html>
<html>
<head>
<title>Test</title>
<script src="map.js" type="text/javascript"></script>
<script type="text/javascript">

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"
	];
	var dist = [];
	var count = 0;
	var txt = '';
	var callback = function(i) {
		return function(d) {
			dist[i] = d.getDistance().html;
			if(++count == richtungen.length) ready();
		};
	};
	for(var i = 0; i < richtungen.length; i++){
		var gdir = new GDirections();
		GEvent.addListener(gdir , "load", callback(i));
		gdir.load(richtungen[i]);
	}
	
	function ready() {
		var o = document.getElementById("out");
		richtungen.forEach( function(item, idx) {
			o.innerHTML += item + '='+ dist[idx] + '<br>';
		})
	}
}

</script>
</head>
<body>

 <div id="out" ></div>
</body>
</html>
 
Hallo struppi,
bekommen in eine fehlermeldung. Objekt unterstützt diese Eigenschaft oder Methode nicht
richtungen.forEach( function(item, idx) {

Wie schon gesagt habe ich kaum bis keine js ahnung, was meinst mit map.js, document.write, onload?
ich habe den api schlüssel oben eingefügt und ein onload im body tag eingefügt, ist wohl falsch :O).

wie bekomme ich bei deiner Version an eine andere Datei übergeben (verarbeitung.php?ergebnisse=xxxx)

Cheffchen
 
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);
    }
  };
}

und die map.js sieht bei mir so aus:
Code:
document.write(

'<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=...."><\/script>'

);



window.onload = function() {

	if(!GBrowserIsCompatible()) return;



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

}

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);
?>
];
 
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:
<!doctype html>
<html>
<head>
<title>Test</title>
<script src="map.js" type="text/javascript"></script>

<script type="text/javascript">
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"
         ];
 var dist = [];
         var disz = [];
 var count = 0;
 var txt = '';
 var callback = function(i) {
  return function(d) {
   dist[i] = d.getDistance().meters;
                         disz[i] = d.getDuration().seconds;
   if(++count == richtungen.length) ready();
  };
 };
 for(var i = 0; i < richtungen.length; i++){
  var gdir = new GDirections();
  GEvent.addListener(gdir , "load", callback(i));
  gdir.load(richtungen[i]);
 }
 function ready() {
          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);
              }
            };
          }
  var o = document.getElementById("out");
  richtungen.forEach( function(item, idx) {
   o.innerHTML += item + ' = '+ dist[idx] +'m '+ disz[idx] + 'sec<br>';
                         document.form1.inhalt.value += (item + ' = '+ dist[idx] +'m '+ disz[idx] + 'sec -');
                         document.form1.area.value += (item + ' = '+ dist[idx] +'m '+ disz[idx] + 'sec -');
  })

 }
}
</script>
</head>
<body>
 <div id="out" ></div>
 <form name="form1" method="get">
 <input type="text" name="inhalt">
<br>
<textarea cols="100" rows="10" name="area"></textarea>
<br>
 </form>
</body>
</html>

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

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();
}
 
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
 
Zurück
Oben