# google maps geocoding in sql speichern



## sandroP (4. August 2009)

Hallo,

Ich möchte die Kooridinaten aus der Google Maps geocoding Funktion in
eine SQL Datenbank speichern. 
- Wie bekomme ich diese aus dem Javascript?


```
function showAddress() {  
    var address = '88353 Kisslegg, Hauptstrasse';
     
     geocoder.getLatLng(    
       address,    
       function(point) 
       );
      }
```

In Point müsste ja nun ltd und lng enthalten sein.
Wie bekomme ich nun ltd und lng in eine eine Variable, so daß ich diese
mittels php in die sql schreiben kann?


----------



## Sven Mintel (4. August 2009)

Moin Sandro,

eine Variable hast du ja schon(point)...du benötigst wahrscheinlich einen String, da könntest du bspw.
*point.toUrlValue()* nehmen.


----------



## sandroP (4. August 2009)

Ich steh gerade voll auf dem Schlauch!

ich brauche was in dieser Richtung:

$laenge =  pointx
$breite = pointy


----------



## Sven Mintel (4. August 2009)

Das:

```
laenge = point.lng();
breite = point.lat();
```
?

Das müsstest du halt für PHP verfügbar machen, bspw. indem du es per AJAX an ein PHP-Skript sendest.


----------



## sandroP (4. August 2009)

ja genau, das brauche ich.

Es gibt da nur 3 Probleme!
1.) Ich habe von Javascript keine Ahnung
2.) von Ajax gar kein Ahnung
3.) und von PHP gefährliches Halbwissen

Wie bekomme ich das verfügbar gemacht? bzw wie schicke ich das per
ajax?

Hast mir bitte nen tipp oder ne Seite wo ich mich schlau lesen kann?


----------



## Sven Mintel (4. August 2009)

Das ginge so:

```
var AJAX=GXmlHttp.create();
AJAX.open('POST','phpskript.php',true);
AJAX.send('lat='+point.lat()+'&lng='+point.lng());
```

In phpskript.php hast du dann die Werte über $_POST['lat'] und $_POST['lng'] verfügbar.


----------



## sandroP (4. August 2009)

ICH bin zu doof!  

es geht halt einfach nicht...:suspekt:

```
<script type="text/javascript">


    //<![CDATA[

   var map = null;
    var geocoder = null;

    function load() {
      if (GBrowserIsCompatible()){
        map = new GMap2(document.getElementById("map"));
		map.setMapType(G_HYBRID_MAP);
        
        geocoder = new GClientGeocoder();
      }
    }
    
    function showAddress() {  
    var address = '<?PHP
$kundennummer = isset($_GET["kundennummer"]) ? $_GET["kundennummer"] : null;
include "zugang/inc.php";
$sqlab = "SELECT * FROM gastgeber";
$sqlab .= " WHERE kundennummer = '".$kundennummer."'";
$res = mysql_query($sqlab);
   while ($zeile = mysql_fetch_assoc($res))
    echo "$zeile[strasse] $zeile[hausnr], $zeile[plz] $zeile[aort], $zeile[land]" 
	?>';
     
     geocoder.getLatLng(    
       address,    
       function(point) 
	   
	   {      
          
 var AJAX=GXmlHttp.create();
AJAX.open('POST','geo1.php',true);
AJAX.send('lat='+point.lat()+'&lng='+point.lng()); 
    
          
        }  
       );
      }    
     
    //]]>
    </script>

</head>

<body onload="load(); showAddress();"onunload="GUnload();" >


	<? 
	$laenge = isset($_POST["lat"]) ? $_POST["lat"] : null;
	$breite = isset($_POST["lng"]) ? $_POST["lng"] : null;
	echo "$laenge <br> $breite";
	?>


  </body>
```

Hallo,

so langsam bekomme ich Eckige Augen.
Ich habe in dem obigen Code jetzt diverses versucht, aber mein
monitor bleibt leider leer. 

Hilfe!


----------



## Sven Mintel (5. August 2009)

Naja.... mal den zeitlichen Ablauf dessen, was da vor sich geht, sollte klar sein, warum du nichts siehst.

JS arbeitet clientseitig, also mit dem, was PHP ihm liefert.

Du kannst nicht erwarten, dass PHP nach Auslieferung des Dokumentes noch auf clientseitige Aktionen reagiert.
Dass aber sehr wohl eine POST-Anfrage per AJAX gesendet wird(falls der ganze Code da hinhaut), könntest du anhand deiner Logfiles prüfen.

Aber so wie es aussieht, brauchst du da AJAX/Javascript überhaupt nicht.
Du benötigst ja keine Adresseingabe vom Clienten, also kannst du gleich per PHP bei Google anfragen und dir so einen Schritt sparen.

Hier mal ne simple Klasse dafür:
	
	
	



```
<?php
 class GM_geocoder
 {
  var $key;
  var $google='http://maps.google.com/maps/geo';  
  
  function __construct($key)
  {
    $this->key=$key;
  }
  
  function request($adress,$callback='cbf',$output='csv',$sensor=false)
  {
    $data=array(
                'key'=>$this->key,
                'q'=>$adress,
                'output'=>$output,
                'sensor'=>($sensor)?'true':'false'
               );
               
    $url=$this->google.'?'.http_build_query($data, '','&');
    
    if($response=@file_get_contents($url))
    {
      return $this->{$callback}($response,$url);
    }
    else
    { 
      return $this->error($url);
    }
    
  }
  
  function cbf($strData,$url)
  {
    $arrData=explode(',',$strData);
    
    if($arrData[0]==200 && count($arrData)==4)
    {
      return(array('lat'=>$arrData[2],'lng'=>$arrData[3]));
    }
    
    return $this->error($url);
  }
  
  function error($url)
  {
    return 'Anfrage an ['.$url.'] fehlgeschlagen';
  }
  
 }
 
 //Objekt instanziieren, als Argument wird der Google-Key erwartet
 $geocoder=new GM_geocoder('deinKey');
 
 //mal testen                       
 var_export($geocoder->request('88353 Kisslegg, Hauptstrasse'));
 
 
?>
```

GM_geocoder::request() liefert im Erfolgsfall einen Array mit lat+lng, andernfalls eine Fehlermeldung.


----------



## sandroP (5. August 2009)

Vielen Dank erst mal für die Antwort,

leider verstehe ich nur nicht wie ich damit weiter machen soll.
liegt vermutlich auch an meinem eingeschränkten wissen.


----------



## arkanoid (5. August 2009)

Eine voll funktionierende Alternative habe ich hier:

```
$ad = urlize($strasse).", ".$postleitzahl." ".urlize($ort).", Germany";
$f = file_get_contents('http://maps.google.com/maps/geo?q='.urlencode($ad).'&output=csv&key='.$google_api_key);
$koords = explode(",",$f);
if($koords[2]!=0 && $koords[3] !=0) {
    $lat = $koords[2];
    $lon = $koords[3];
} else {
    $lat = "";
    $lon = "";
}

function urlize($str){
    return urlencode(strtr(strtolower($str),array('.'=>'', ')'=>'', '('=>'', ' '=>'-','ü'=>'ue','ö'=>'oe','ä'=>'ae','ß'=>'ss','/'=>'-','&'=>'und','@'=>'(_at_)')));
}
```


----------



## sandroP (5. August 2009)

wo muss ich den code denn einfügen?


----------



## Sven Mintel (5. August 2009)

sandroP hat gesagt.:


> Vielen Dank erst mal für die Antwort,
> 
> leider verstehe ich nur nicht wie ich damit weiter machen soll.
> liegt vermutlich auch an meinem eingeschränkten wissen.



Bei meinem Beispiel rufst du $geocoder->request() mit der gewünschten Adresse auf.
Ist der Rückgabewert ein Array, dann beinhaltet er die Elemente lat und lng, welche du in die DB eintragen kannst.

Bei arkanoid's Version erstellst du die Variablen strasse, $postleitzahl und $ort.

Danach fügst du seinen Code ins Skript ein...hast du dies getan, existieren im Skript 2 Variablen $lat und $lon, welche du in die DB eintragen kannst.


----------

