2010-07-23 5 views
1

Est-ce que quelqu'un a fait ça ou a une idée?cron job - champ d'adresse de géocode à lat & long dans la base de données mySQL

J'ai un script immobilier qui, pour une raison ou une autre (google mapping limits, script lui-même) n'obtient que les coordonnées pour la moitié des listings. Je veux exécuter un script que le long champ & sont vides le script utilisera l'adresse, la ville, l'état pour peupler les champs longs lat &.

Atténuation?

Edit:

est ici un code de Google, qui ne vous permet géocodage pour une base de données: http://code.google.com/apis/maps/articles/phpsqlgeocode.html

<?php 

require ("phpsqlgeocode_dbinfo.php");

define ("MAPS_HOST", "maps.google.com"); define ("KEY", "abcdefg"); // Ouvre une connexion à un serveur MySQL $ connection = mysql_connect ("localhost", $ nom d'utilisateur, $ mot de passe); if (! $ Connection) { die ("Non connecté:". Mysql_error()); }

// Définir la base de données MySQL active $ db_selected = mysql_select_db ($ database, $ connection); if (! $ Db_selected) { die ("Impossible d'utiliser db:". Mysql_error()); // Sélectionnez toutes les lignes de la table de marqueurs $ query = "SELECT * FROM marqueurs WHERE 1"; $ resultat = mysql_query ($ query); if (! $ Result) { die ("Requête invalide:". Mysql_error()); }

// Initialiser le retard dans la vitesse de géocodage $ delay = 0; $ base_url = "http: //". MAPS_HOST. "/ maps/geo? output = xml". "& key =". CLÉ;

// Itérer à travers les lignes, géocodage chaque adresse while ($ row = @mysql_fetch_assoc ($ result)) {$ geocode_pending = true;

while ($ geocode_pending) { $ adresse = $ row ["adresse"]; $ id = $ row ["id"]; $ request_url = $ base_url. "& q =". urlencode (adresse $); $ xml = simplexml_load_file ($ request_url) ou die ("url not loading");

$status = $xml->Response->Status->code; 
if (strcmp($status, "200") == 0) { 
    // Successful geocode 
    $geocode_pending = false; 
    $coordinates = $xml->Response->Placemark->Point->coordinates; 
    $coordinatesSplit = split(",", $coordinates); 
    // Format: Longitude, Latitude, Altitude 
    $lat = $coordinatesSplit[1]; 
    $lng = $coordinatesSplit[0]; 

    $query = sprintf("UPDATE markers " . 
     " SET lat = '%s', lng = '%s' " . 
     " WHERE id = '%s' LIMIT 1;", 
     mysql_real_escape_string($lat), 
     mysql_real_escape_string($lng), 
     mysql_real_escape_string($id)); 
    $update_result = mysql_query($query); 
    if (!$update_result) { 
    die("Invalid query: " . mysql_error()); 
    } 
} else if (strcmp($status, "620") == 0) { 
    // sent geocodes too fast 
    $delay += 100000; 
} else { 
    // failure to geocode 
    $geocode_pending = false; 
    echo "Address " . $address . " failed to geocoded. "; 
    echo "Received status " . $status . " 

\ n "; } usleep (retard de $); } } >

Je ne sais pas où commencer à obtenir que cela fonctionne avec ma base de données et mon lat &? longues rangées (declat et declong)

Toute aide serait appréciée Merci!

+0

Vraiment - Je ne peux pas obtenir de l'aide ici? – Jason

Répondre

0

J'ai eu la même exigence et obtenu ce travail par la suite:

Ce GÉOCODES les adresses:

<?php 
require("database.php"); 
function parseToXML($htmlStr) 
{ 
$xmlStr=str_replace('<','&lt;',$htmlStr); 
$xmlStr=str_replace('>','&gt;',$xmlStr); 
$xmlStr=str_replace('"','&quot;',$xmlStr); 
$xmlStr=str_replace("'",'&#39;',$xmlStr); 
$xmlStr=str_replace("&",'&amp;',$xmlStr); 
return $xmlStr; 
} 
// Opens a connection to a MySQL server 
$connection=mysql_connect (localhost, $username, $password); 
if (!$connection) { 
    die('Not connected : ' . mysql_error()); 
} 
// Set the active MySQL database 
$db_selected = mysql_select_db($database, $connection); 
if (!$db_selected) { 
    die ('Can\'t use db : ' . mysql_error()); 
} 
// Select all the rows in the markers table 
$query = "SELECT * FROM markers WHERE 1"; 
$result = mysql_query($query); 
if (!$result) { 
    die('Invalid query: ' . mysql_error()); 
} 
header("Content-type: text/xml"); 
// Start XML file, echo parent node 
echo '<markers>'; 
// Iterate through the rows, printing XML nodes for each 
while ($row = @mysql_fetch_assoc($result)){ 
    // ADD TO XML DOCUMENT NODE 
    echo '<marker '; 
    echo 'name="' . parseToXML($row['name']) . '" '; 
    echo 'address="' . parseToXML($row['address']) . '" '; 
    echo 'lat="' . $row['lat'] . '" '; 
    echo 'lng="' . $row['lng'] . '" '; 
    echo 'type="' . $row['type'] . '" '; 
    echo '/>'; 
} 
// End XML file 
echo '</markers>'; 
?> 

Et cela génère la carte (que je CLUSTER aussi, mais vous devriez être en mesure de prendre que sur):

<script type="text/javascript"> 
    //<![CDATA[ 

    var customIcons = { 
     restaurant: { 
     icon: 'http://labs.google.com/ridefinder/images/mm_20_blue.png', 
     shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png' 
     }, 
     bar: { 
     icon: 'http://labs.google.com/ridefinder/images/mm_20_red.png', 
     shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png' 
     } 
    }; 

    function load() { 
     var cluster = []; 
     var map = new google.maps.Map(document.getElementById("map"), { 
     center: new google.maps.LatLng(53.4788, -3.9551), 
     zoom: 6, 
     mapTypeId: 'roadmap' 
     }); 
var infowindow = new google.maps.InfoWindow(); 

     // Change this depending on the name of your PHP file 
     downloadUrl("<?php bloginfo('stylesheet_directory'); ?>/phpsqlajax_genxml.php ", function(data) { 
     var xml = data.responseXML; 
     var markers = xml.documentElement.getElementsByTagName("marker"); 
     for (var i = 0; i < markers.length; i++) { 
      var name = markers[i].getAttribute("name"); 
      var address = markers[i].getAttribute("address"); 
      var type = markers[i].getAttribute("type"); 
      var point = new google.maps.LatLng(
       parseFloat(markers[i].getAttribute("lat")), 
       parseFloat(markers[i].getAttribute("lng"))); 
      var html = "<b>" + name + "</b> <br/>" + address; 
      var icon = customIcons[type] || {}; 
      var marker = new google.maps.Marker({ 
      map: map, 
      position: point, 
      icon: icon.icon, 
      shadow: icon.shadow 
      }); 
      google.maps.event.addListener(marker, 'click', (function(marker, i) { 
         return function() { 
          infowindow.setContent(markers[i].getAttribute("name")); 
          infowindow.open(map, marker); 
         } 
        })(marker, i)); 
      cluster.push(marker); 
     } 
     var mc = new MarkerClusterer(map,cluster); 
     }); 
    } 

    function bindInfoWindow(marker, map, infoWindow, html) { 
     google.maps.event.addListener(marker, 'click', function() { 
     infoWindow.setContent(html); 
     infoWindow.open(map, marker); 
     }); 
    } 

    function downloadUrl(url, callback) { 
     var request = window.ActiveXObject ? 
      new ActiveXObject('Microsoft.XMLHTTP') : 
      new XMLHttpRequest; 

     request.onreadystatechange = function() { 
     if (request.readyState == 4) { 
      request.onreadystatechange = doNothing; 
      callback(request, request.status); 
     } 
     }; 

     request.open('GET', url, true); 
     request.send(null); 
    } 

    function doNothing() {} 

    //]]> 
    </script> 
1

La meilleure approche est l'analyse de toute évidence la réponse et la recherche du code d'erreur renvoyé.

La raison la plus courante pour ce qui se passe est

  • Les demandes vont trop vite (ajouter un peu de limitation à votre script)

  • caractères Unicode comme AOU trémas codé à tort

soit dit en passant, ce que vous faites peut être une violation des conditions d'utilisation de Google:

Note: l'API de géocodage ne peut être utilisé en conjonction avec une carte Google; géocodage des résultats sans les afficher sur une carte est interdite. Pour plus d'informations sur l'utilisation autorisée, consultez les restrictions de licence de l'API Google Maps.

+0

Eh bien, en toute justice, les résultats sont affichés sur une carte. Pour chaque adresse géocodée, lat & long est ajouté à la base de données et affiché sur le frontend avec une liste. – Jason

+0

Voir ci-dessus modifier - google offre réellement un fichier php pour faire ce dont j'ai besoin - géocoder des adresses dans une base de données. J'ai juste besoin d'aide pour trouver comment le faire fonctionner avec ma base de données – Jason

+0

@Jason Tout le monde me répétait que c'était contre les TOS de Google mais ils offrent un tutoriel sur la façon de le faire à mes yeux, ils donnent le feu vert. – Rob

0

Vous avez droit à 2500 géocodes par jour. C'est un montant raisonnable, mais vous ne pouvez pas bombarder le service avec vos demandes. Vous devez fournir un délai entre chaque demande, sinon il commencera à bloquer le service.

Une fois que vous géocodez, vous devez stocker la valeur dans la base de données et la marquer comme géocodées, de sorte que vous ne devez pas demander à nouveau. Ensuite, vous pouvez simplement géocoder le reste au fil du temps.

+0

c'est exactement ce que je veux faire - j'ai 300 propriétés sur mon site. La plupart des lat & long sont stockés - cependant il y a des entrées qui n'ont pas de lat & long que je veux lancer un script pour remplir les valeurs manquantes – Jason

Questions connexes