以最近的路线

时间:2018-04-09 03:00:43

标签: php mysql google-maps

第一次在这里发帖,一直在这里找到我的疑问的答案。因此,我需要从最近的路线找到“real” nearest location(坚持医院或商店)从特定点到医院或商店。

到目前为止,我已经使用我的PHP代码中的haversine’s formula作为对我的数据库的查询,并且它以点和坐标的形式返回最近的位置。但我想要的是距离最近的路线最近的,所以它真的是最近的。

我需要最近的查询服务器端。由于最近的数据将传递给Arduino微控制器。 Arduino发送GPS坐标,然后接收最近的store/hospital。这是我遇到的唯一问题。也许我可以通过参考资料获得一些关于如何解决这个问题的建议。谢谢:)

我唯一能想到的可能是在网络/网站上有谷歌地图,然后在那里传递MySQL结果,可能使用距离矩阵或方向API,然后将其返回到PHP文件。

编辑:到目前为止,我已经使用了谷歌地图的Distance Matrix API。现在我的问题是,我如何获得或是否可以将API的结果输出到我的JSON格式的PHP文件中?

喜欢this或类似,所以我可以在我的Arduino UNO和Android应用中解析它。

这是我的PHP文件的代码

<?PHP
//DLSUD
$CrashLat = 14.3234;$CrashLon = 120.959432;
//Pagamutan
$HosLat1 = 14.323003;$HosLon1 = 120.961666;
//St Paul
$HosLat2 = 14.323321;$HosLon2 = 120.962895;
?>

<script>    

    function init() {

    var origin1 = new google.maps.LatLng(parseFloat('<?php echo $CrashLat;? 
    >'), parseFloat('<?php echo $CrashLon;?>'));

    var destinationA = new google.maps.LatLng(parseFloat('<?php echo 
    $HosLat1;?>'), parseFloat('<?php echo $HosLon1;?>'));   

    var destinationB = new google.maps.LatLng(parseFloat('<?php echo 
    $HosLat2;?>'), parseFloat('<?php echo $HosLon2;?>'));   

    var service = new google.maps.DistanceMatrixService();  

    service.getDistanceMatrix(  {       
        origins: [origin1, origin1],        
        destinations: [destinationA, destinationB],     
        travelMode: google.maps.TravelMode.DRIVING,
        unitSystem: google.maps.UnitSystem.METRIC,  
        durationInTraffic: true,
        avoidHighways: false,
        avoidTolls: false   
        }, callback);   
    }

    function callback(response, status) {       
        if (status == 'OK') {           
            var origins = response.originAddresses;         
            var destinations = response.destinationAddresses;       
            for (var i = 0; i < origins.length; i++) {          
                var results = response.rows[i].elements;            
                for (var j = 0; j < results.length; j++) {              
                    var element = results[j];               
                    var distance = element.distance.text;               
                    var duration = element.duration.text;               
                    var from = origins[i];              
                    var to = destinations[j];           
                }       
            }
            console.log(results[0].distance);
        }   
    }    

</script>    
<script async defer src="https://maps.googleapis.com/maps/api/js? 
key=API_KEY&callback=init">
</script>

1 个答案:

答案 0 :(得分:0)

似乎回答了我自己的问题。这是代码。

<?PHP
//DLSUD
$CrashLat = 14.3234;$CrashLon = 120.959432;
//Pagamutan
$HosLat1 = 14.323003;$HosLon1 = 120.961666;
//St Paul
$HosLat2 = 14.323321;$HosLon2 = 120.962895;

$APIrequest="https://maps.googleapis.com/maps/api/distancematrix/json? 
units=metric&origins=".$CrashLat.",".$CrashLon."&destinations=".$HosLat1.
",".$HosLon1."|".$HosLat2.",".$HosLon2."&mode=walking&key=API_KEY";

$DistanceMatrixResult = file_get_contents($APIrequest);

$Object = json_decode($DistanceMatrixResult, true);

$HospitalDistance1 = $Object['rows'][0]['elements'][0]['distance']['value'];
$HospitalDistance2 = $Object['rows'][0]['elements'][1]['distance']['value'];

if ($HospitalDistance1 > $HospitalDistance2) {
    echo $HospitalDistance2;
}
else {
    echo $HospitalDistance1;
}

?>

只需将医院的分配替换为数据库的SQL查询(使用Harvesine公式,然后设置LIMITS并对结果进行排序)。

注意:mode = driving(默认)是一种错误,在某些情况下会产生很长的不必要路线。更好地使用mode = walking / transit。