2015-03-07 2 views
0

У меня есть база данных, в которой хранятся клиенты и сотрудники. Передняя часть для этой базы данных использует очень старое программное обеспечение (закодированное в vb6 с конца 90-х годов, поэтому я не могу просто геокодировать адреса для вставки при записи, если только я не хочу делать какую-нибудь причудливую работу sql). Я создаю еще более надежное программное обеспечение для передачи данных. Я хочу включить функции карты google в программное обеспечение, которое показывает, где живут клиенты и сотрудники. Когда создается список текущих сотрудников или клиентов, я также хочу, чтобы он проверял новые добавления, а затем геокодировал их адреса в таблицу базы данных, чтобы я мог ссылаться на них в последующих отчетах. У меня нет проблем с распознаванием новых записей или геокодированием их местоположений.Возврат результатов javascript для использования в php

Как работает скрипт php, он проверяет, есть ли у клиентов информация о широте и долготе, а если нет, получите файл lat/lng, а затем вставьте его в базу данных. Если есть несколько новых клиентов/сотрудников, я хочу, чтобы он прошел через результирующий набор и вставлял относительную информацию. Проблема заключается в том, что google api получает lat/lng через javascript, поэтому я не могу передать эту информацию обратно в php-скрипт, чтобы сохранить его в базе данных, и я действительно не хочу использовать javascript для его вставки.

Так что мне интересно, как это сделать. Я изучаю и тестирую пару часов. Я решил, что могу, вероятно, передать переменные с помощью методов ajax, но разве это не вызовет проблему, когда вы делаете это в середине цикла?

Вот пример кода, и я приношу свои извинения за такой нарисованный вопрос!

Javascript фрагмент Геокодировать:

function codeAddress(address) { 

    geocoder.geocode({ 'address': address}, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     var newlat = results[0].geometry.location.lat(); 
     var newlng = results[0].geometry.location.lng(); 
     alert(results[0].geometry.location); 


    } else { 
     alert('Geocode was not successful for the following reason: ' + status); 
    } 
    }); 

PHP фрагмент:

$address = ""; 
$num = 0; 
//Google geocode limits requests to 10 per second, limit to 5 total requests at a time. 
//If more theres more than 10 clients who have yet to be geocoded, running the database insertion code 
//---should provide long enough delay to geocode again and not hit the overflow limit 


while ($row = mssql_fetch_array($result) and $num < 5) { 
    if ($row['lat'] == "") { 
     //Create address string 
     $address = $row['Address1'] . " " . $row['City'] . ", NY " . $row['Zip']; 
     $address = str_replace("'", "", $address); 
     //Test to show addresses without lat/lng were pulled 
     echo "<script>codeAddress('" . $address . "');</script>" . $address . "<br />"; 
     $num = $num + 1; 
     } 

    } 
+0

Почему вы говорите «поэтому я не могу передать эту информацию обратно в php-скрипт, чтобы сохранить его в базе данных»? – geocodezip

+0

Поскольку я понимаю, что php сначала запускается на стороне сервера, поэтому его запуск выполняется до кода javascript, который затем запускается после. Поэтому я не могу просто сказать javascript, чтобы вставить «этот кусок php-кода», а затем продолжить скрипт php. Разве это не так? – jfive

+0

Это правда, но вы можете отправить результаты на PHP-скрипт на своем сервере и использовать этот скрипт для публикации данных в своей базе данных (как вы говорите в своем сообщении, я не считаю это «использованием методов AJAX», если вы не используют XML, и вы не возвращаете результат клиенту ...). Вы можете решить проблему «loop», включив в возвращаемые данные идентификатор. – geocodezip

ответ

1

Вот код для преобразования адреса в geocoordinates (лат, Ланг):

<?php 
     $Address = urlencode($Address); 
     $request_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=".$Address."&sensor=true"; 
     $xml = simplexml_load_file($request_url) or die("url not loading"); 
     $status = $xml->status; 
     if ($status=="OK") { 
      $Lat = $xml->result->geometry->location->lat; 
      $Lon = $xml->result->geometry->location->lng; 
      $LatLng = "$Lat,$Lon"; 
     } 
    ?> 

Вы можете сохраните эти Lat Lng в базе данных с помощью простого SQL-запроса, а затем верните его для отображения на карте. Для этого вам нужно отобразить карту. Смотрите следующий код д.о.о., что:

<!DOCTYPE html> 

<html lang="en"> 
    <head> 
     <meta charset="utf-8" /> 
     <title>Google Maps Example</title> 
     <style type="text/css"> 
      body { font: normal 14px Verdana; } 
      h1 { font-size: 24px; } 
      h2 { font-size: 18px; } 
      #sidebar { float: right; width: 30%; } 
      #main { padding-right: 15px; } 
      .infoWindow { width: 220px; } 
     </style> 
     <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
     <script type="text/javascript"> 
     //<![CDATA[ 

     var map; 

     // Ban Jelačić Square - Center of Zagreb, Croatia 
     var center = new google.maps.LatLng(45.812897, 15.97706); 

     function init() { 

      var mapOptions = { 
       zoom: 13, 
       center: center, 
       mapTypeId: google.maps.MapTypeId.ROADMAP 
      } 

      map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); 

      var marker = new google.maps.Marker({ 
       map: map, 
       position: center, 
      }); 
     } 
     //]]> 
     </script> 
    </head> 
    <body onload="init();"> 

     <h1>Places to check out in Zagreb</h1> 

     <section id="sidebar"> 
      <div id="directions_panel"></div> 
     </section> 

     <section id="main"> 
      <div id="map_canvas" style="width: 70%; height: 500px;"></div> 
     </section> 

    </body> 
</html> 

Чтобы получить данные из базы данных:

<?php 

$server  = 'localhost'; 
$username = 'root'; 
$password = 'YOUR_PASSWORD'; 
$database = 'YOUR_DATABASE'; 

$dsn  = "mysql:host=$server;dbname=$database"; 

Теперь создать свой собственный файл, который будет возвращать фактические данные.

<?php 

    require 'config.php'; 

    try { 

     $db = new PDO($dsn, $username, $password); 
     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $sth = $db->query("SELECT * FROM locations"); 
     $locations = $sth->fetchAll(); 

     echo json_encode($locations); 

    } catch (Exception $e) { 
     echo $e->getMessage(); 
    } 

Для отображения местоположения на карте, вы должны сделать AJAX запросы:

function makeRequest(url, callback) { 
    var request; 
    if (window.XMLHttpRequest) { 
     request = new XMLHttpRequest(); // IE7+, Firefox, Chrome, Opera, Safari 
    } else { 
     request = new ActiveXObject("Microsoft.XMLHTTP"); // IE6, IE5 
    } 
    request.onreadystatechange = function() { 
     if (request.readyState == 4 && request.status == 200) { 
      callback(request); 
     } 
    } 
    request.open("GET", url, true); 
    request.send(); 
} 

Определите функцию инициализации(), который будет иметь ответ JSON:

var map; 

// Ban Jelačić Square - City Center 
var center = new google.maps.LatLng(45.812897, 15.97706); 

var geocoder = new google.maps.Geocoder(); 
var infowindow = new google.maps.InfoWindow(); 

function init() { 

    var mapOptions = { 
     zoom: 13, 
     center: center, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 

    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); 

    makeRequest('get_locations.php', function(data) { 

     var data = JSON.parse(data.responseText); 

     for (var i = 0; i < data.length; i++) { 
      displayLocation(data[i]); 
     } 
    }); 
} 

Наконец, вам нужно для отображения местоположений на карте вы можете добавить информационное окно, подобное этому:

function displayLocation(location) { 

    var content = '<div class="infoWindow"><strong>' + location.name + '</strong>' 
        + '<br/>'  + location.address 
        + '<br/>'  + location.description + '</div>'; 

    if (parseInt(location.lat) == 0) { 
     geocoder.geocode({ 'address': location.address }, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 

       var marker = new google.maps.Marker({ 
        map: map, 
        position: results[0].geometry.location, 
        title: location.name 
       }); 

       google.maps.event.addListener(marker, 'click', function() { 
        infowindow.setContent(content); 
        infowindow.open(map,marker); 
       }); 
      } 
     }); 
    } else { 
     var position = new google.maps.LatLng(parseFloat(location.lat), parseFloat(location.lon)); 
     var marker = new google.maps.Marker({ 
      map: map, 
      position: position, 
      title: location.name 
     }); 

     google.maps.event.addListener(marker, 'click', function() { 
      infowindow.setContent(content); 
      infowindow.open(map,marker); 
     }); 
    } 
} 

Надеюсь, что это поможет!

+1

Большое спасибо AniV. Благодаря предложению Стива, я смог настроить свой код, чтобы просто вытащить lat/lng через php как объект json, но это фантастическая ссылка для любого, поскольку она показывает всю картину, так что с удовольствием вам. – jfive

Смежные вопросы