2016-09-14 72 views
2

需要一些帮助。 所以我使用Google API Snap To Road。 这里是我的代码:从捕捉道路获取结果API

<?php 
set_time_limit(0); 
$jsonarr = array(); 
$today=date("Y-m-d"); 

$ACCOUNT=$_GET['ACCOUNT']; 
$ticket_no=$_GET['ticket_no']; 
require_once("config/msdb_connect.php"); 

$query = mssql_query("SELECT * FROM TblGps WHERE DOOR = '".$ticket_no."' AND  DATETIME BETWEEN '".$today." 00:00:00' AND '".$today." 23:59:59' ORDER BY DATETIME DESC"); 
while($row = mssql_fetch_array($query)) 
{ 
    //parameters 
    $lng=$row['LONG']; 
    $lat=$row['LAT']; 
    //$data = array('lat'=>$lat,'lng'=>$lng); 
    //echo $latlng = GetArray($data); 

$jsonarr[] = array(
         'id' => $row['ID'], 
         'account' => $row['ACCOUNT'], 
         'datetime' =>date("m/d/Y  H:i:s",strtotime($row['DATETIME'])), 
         'loc' => $row['LOCATION'], 
         // 'speed' => $row['SPEED'], 
         'longi' => $lng, 
         'lat' => $lat, 
         'lac' => $row['LAC'], 
         'cid' => $row['CID'], 
         // 'engine' => $row['ENGINE'], 
         'remarks' => $row['REMARKS'] 
        ); 
} 

$path = GetArray($jsonarr); 
$snailtrail=GetSnailTrail($path); 

function GetArray($array){ 

    $stringdata = ""; 
    for($i = 0 ; $i <= count($array) - 1 ; $i++){ 
    $rows = (object)$array[$i]; 
    if($i == count($array) - 1) $stringdata .= $rows->lat.','.$rows->longi; 
    else $stringdata .= $rows->lat.','.$rows->longi.'|'; 
    } 
    return $stringdata; 
} 
function GetSnailTrail($path){ 
    $key='AIzaSyDRlfacNyHn7ZOsC0FzufqZ_rtQYfZD6wA'; 
    $url='https://roads.googleapis.com/v1/snapToRoads?path='.$path.'&interpolate=true&key='.$key.' '; 

    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST,"POST"); 
    // curl_setopt($curl, CURLOPT_POSTFIELDS, $json); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 

    $api_response = curl_exec($curl); 
    curl_close($curl); 
    $result = json_decode($api_response); 

    $result = (object)$result; 
    $result = (object)$result->location; 

    return $result; 
    } 

所以我从我的DATABSE获取经度和纬度。 然后,我将使用我的函数GetArray将其组合为GetSnailTrail函数中参数路径的多个记录。

因此,这将是这个样子的发送API之前:

https://roads.googleapis.com/v1/snapToRoads?path=14.567467,121.030726|14.566950,121.030497|14.567447,121.031204|14.566947,121.030520|14.566947,121.030520|14.567590,121.031181|14.567590,121.031181|14.567377,121.031236|14.566947,121.030520|14.567447,121.031204|14.566947,121.030520|14.566947,121.030520|14.566947,121.030520|14.566947,121.030520|14.567590,121.031181|14.567377,121.031236|14.567447,121.031204|14.567377,121.031236|14.567377,121.031236|14.567377,121.031236|14.567377,121.031236|14.567377,121.031236|14.567377,121.031236|14.567590,121.031181|14.567377,121.031236|14.567590,121.031181|14.567377,121.031236|14.567447,121.031204|14.567377,121.031236|14.567447,121.031204|14.567377,121.031236|14.567466,121.030726|14.567377,121.031236|14.567377,121.031236|14.567377,121.031236|14.567447,121.031204|14.567377,121.031236|14.567056,121.030569|14.567012,121.030539|14.567049,121.030568|14.567009,121.030545|14.567468,121.030728|14.567031,121.030549|14.567007,121.030545|14.567098,121.030403|14.567037,121.030548|14.567178,121.030624|14.566899,121.030486|14.566946,121.030520|14.567056,121.030569|14.567056,121.030569|14.567056,121.030569|14.566946,121.030520|14.566947,121.030522|14.566947,121.030522|14.566947,121.030522|14.567103,121.030594|14.566946,121.030520|14.566947,121.030522|14.566947,121.030524|14.567028,121.030556|14.566780,121.030502|14.566780,121.030502|14.567103,121.030594|14.567103,121.030594|14.566947,121.030522|14.566946,121.030520|14.566946,121.030520|14.566946,121.030520|14.566947,121.030524|14.566947,121.030524&interpolate=true&key=AIzaSyDRlfacNyHn7ZOsC0FzufqZ_rtQYfZD6wA 

后,该API将返回这样的结果:

{ 
    "snappedPoints": [ 
    { 
     "location": { 
     "latitude": 14.567361300000002, 
     "longitude": 121.03068420000001 
     }, 
     "originalIndex": 0, 
     "placeId": "ChIJF6oagKzJlzMRlFWOLr4F1SI" 
} 

出于某种原因,我不能呼应或获得在我的$jsonarr上输入它的响应。 得到回应后该怎么办? 谢谢

+0

卷曲没有提供任何错误?请参阅:[curl_error](http://php.net/manual/en/function.curl-error.php)。和'var_dump($ api_response)'。 – Jigar

+0

是的,它显示411错误 –

回答

1

给出的URL和相关数据返回浏览器来访问返回的数据的每一部分我发现这个工作确定,假设$data分配来自卷边请求的响应。

curl请求是使用GET而不是POST和在函数之外解码的响应完成的。以前你的代码试图访问$result->location〜而应该是$result->snappedPoints

function GetSnailTrail($path=false){ 
     if(!$path)return false; 
     $key='AIzaSyDRlfacNyHn7ZOsC0FzufqZ_rtQYfZD6wA'; 
     $url='https://roads.googleapis.com/v1/snapToRoads?path='.$path.'&interpolate=true&key='.$key.' '; 

     $curl = curl_init(); 
     curl_setopt($curl, CURLOPT_URL, $url); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 

     $result = curl_exec($curl); 
     curl_close($curl); 

     return $result; 
    } 

    $path='14.567467,121.030726|14.566950,121.030497|14.567447,121.031204|14.566947,121.030520|14.566947,121.030520|14.567590,121.031181|14.567590,121.031181|14.567377,121.031236|14.566947,121.030520|14.567447,121.031204|14.566947,121.030520|14.566947,121.030520|14.566947,121.030520|14.566947,121.030520|14.567590,121.031181|14.567377,121.031236|14.567447,121.031204|14.567377,121.031236|14.567377,121.031236|14.567377,121.031236|14.567377,121.031236|14.567377,121.031236|14.567377,121.031236|14.567590,121.031181|14.567377,121.031236|14.567590,121.031181|14.567377,121.031236|14.567447,121.031204|14.567377,121.031236|14.567447,121.031204|14.567377,121.031236|14.567466,121.030726|14.567377,121.031236|14.567377,121.031236|14.567377,121.031236|14.567447,121.031204|14.567377,121.031236|14.567056,121.030569|14.567012,121.030539|14.567049,121.030568|14.567009,121.030545|14.567468,121.030728|14.567031,121.030549|14.567007,121.030545|14.567098,121.030403|14.567037,121.030548|14.567178,121.030624|14.566899,121.030486|14.566946,121.030520|14.567056,121.030569|14.567056,121.030569|14.567056,121.030569|14.566946,121.030520|14.566947,121.030522|14.566947,121.030522|14.566947,121.030522|14.567103,121.030594|14.566946,121.030520|14.566947,121.030522|14.566947,121.030524|14.567028,121.030556|14.566780,121.030502|14.566780,121.030502|14.567103,121.030594|14.567103,121.030594|14.566947,121.030522|14.566946,121.030520|14.566946,121.030520|14.566946,121.030520|14.566947,121.030524|14.566947,121.030524'; 

    $data=GetSnailTrail($path); 

    if($data) { 

     $json=json_decode($data,true); 
     $points=$json['snappedPoints']; 

     foreach($points as $key => $value){ 
      $obj=(object)$value; 
      $lat=$obj->location['latitude']; 
      $lng=$obj->location['longitude']; 
      $index=property_exists($obj,'originalIndex') ? $obj->originalIndex : 'n/a'; 
      $id=$obj->placeId; 
      echo 'id:'.$id.' index:'.$index.' lat:'.$lat.' lng:'.$lng.'<br />'; 
     } 
    } 

你可以进一步简化代码最初构建路径时。而不是如果你要构建的阵列,并在while循环像这样与纬度/经度填充的复杂函数来处理$jsonarr数据:

$pathdata=array(); 

while($row = mssql_fetch_array($query)){ 
    $jsonarr[] = array(
     'id'  => $row['ID'], 
     'account' => $row['ACCOUNT'], 
     'datetime' => date("m/d/Y H:i:s", strtotime($row['DATETIME'])), 
     'loc'  => $row['LOCATION'], 
     'longi'  => $row['LONG'], 
     'lat'  => $row['LAT'], 
     'lac'  => $row['LAC'], 
     'cid'  => $row['CID'], 
     'remarks' => $row['REMARKS'] 
    ); 
    $pathdata[]="{$row['LAT']},{$row['LONG']}"; 
} 

$path=implode('|',$pathdata); 

然后,可以implode使用所选择的定界符的数据(|)实现一连串的要点。

使用JavaScript,你可以发挥一下有以下处理此:

echo " 
<script type='text/javascript'> 
    /* \$data is already a json object, echo it in javascript and process */ 
    var path={$data}; 

    function processpath(path){ 
     var json=path.snappedPoints; 
     for(var o in json){ 
      try{ 
       var point=json[ o ]; 
       if(typeof(point)!='undefined'){ 

        var lat=point.hasOwnProperty('location') && point.location.hasOwnProperty('latitude') ? point.location.latitude : false; 
        var lng=point.hasOwnProperty('location') && point.location.hasOwnProperty('longitude') ? point.location.longitude : false; 
        var index=point.hasOwnProperty('originalIndex') ? point.originalIndex : 'n/a'; 
        var id=point.hasOwnProperty('placeId') ? point.placeId : 'n/a'; 

        if(lat && lng) console.log('id:%s, index:%s, lat:%s, lng:%s', id, index, lat, lng); 
       } 
      }catch(err){ 
       console.warn(err); 
       continue; 
      } 
     } 
    } 
    processpath(path); 
</script>"; 
+0

谢谢你的回答。请问如何摆脱'BR'? –

+0

哦,对不起 - BR'是一个本地定义的常量 - 我总是忘记删除,当发布的答案...这是'
' – RamRaider

+0

谢谢...但我怎么能把它放在$ jsonarray这将是得到我的JavaScript显示?而不是从数据库的长经度? –