PHP 版本 7.4
我目前正在開發一個小型 php 程式來接收某些貨物并將它們的順序優化到最有效的路線。到目前為止一切順利,它可以通過以下方式與 google maps api 一起使用:
$url = "https://maps.googleapis.com/maps/api/directions/json?";
$url .= "origin=".urlencode($this->startPoint);
$url .= "&destination=".urlencode($this->endPoint);
$url .= "&waypoints=".urlencode("optimize:true")."|";
$x = 0;
foreach($ordersadress as $order){
if($x != 0){
$url .= urlencode("|");
}
$url .= urlencode($order["address"]);
$x ;
}
$url .= "&key=".$conf->global->GOOGLE_MAPS_API_KEY;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$resp = curl_exec($ch);
$json = json_decode($resp);
現在,為了知道哪個 Shipment 實際先到,我通過 json 回應并將我的貨件的地址與回應中的每個航路點進行比較,以查看哪個地址先到,依此類推。這是我的問題,在回應中地址沒有寫出,它們被縮短了。例如,對于德國地址,我添加到 api 呼叫的發貨地址是“Kirchenplatz 4”。在谷歌的回應中,他們將其縮短為“Kirchenpl. 4”。我認為英語中的等效項是將“Road”更改為“Rd”。(我會在最后放一個示例請求,以防你不知道它是什么樣子,不過你確實需要一個 Google API 密鑰。)
現在,我正在按照以下方式進行操作:
foreach($json->routes[0]->legs as $leg){
if($iterator != 0){
foreach($ordersadress as $order){
$addy = explode(",", $leg->start_address);
$oa = explode(",", $order["address"]);
//Here I compare if the returned address is the same as the one on the shipment, needs to be a 1:1 match, this is my issue
if(strpos($oa[0], $addy[0]) !== false){
$lat = $leg->start_location->lat;
$lon = $leg->start_location->lng;
$co = $order["object"];
$this->orders[] = ["rowid" => $co->id, "sortorder" => $sortnum, "notes" => "", "tourdate" => $tourdate->format("d.m.Y"), "address" => $leg->start_address, "drivetime" => $leg->duration->value, "object" => $co, "lat" => $lat, "lon" => $lon];
$this->kmAll = round($leg->distance->value/1000, 2);
$sortnum ;
foreach($leg->steps as $step){
$polyline .= $step->polyline->points;
}
break;
}
}
unset($order);
}
此示例僅適用于精確的 1:1 匹配,這在現實世界的場景中當然是不可行的,因為我客戶的作業人員將無法始終以與谷歌回傳地址完全相同的方式輸入地址,此外,還有已經是數以千計的貨物的資料,必須更改。
我想到了以下解決方案:
獲取所有被谷歌縮短的單詞串列,然后將其發送到我的地址。但是我找不到串列。我的第二個解決方案是對 2 個地址進行百分比匹配,匹配度最高的地址將位于 google 回傳的位置。有了這個解決方案,老實說,我并沒有真正理解這個similar_text功能以及它是如何作業的,我不確定在我的情況下它是否是一個好的解決方案。
我對您可能有的任何想法和建議持開放態度。
谷歌 API 請求示例:
https://maps.googleapis.com/maps/api/directions/json?origin=Lange G. 20, 2700 Wiener Neustadt&destination=Ruckergasse 42, 1120 Wien&waypoints=optimize:true|Brauhausgasse 6|Hauptpl. 1, Graz|Kirchenpl. 4, Gänserndorf|Südtiroler Pl. 1, Salzburg|Unter dem Rucker 14|Vivenotgasse 3/6 13, Wien&key=YOUR_API_KEY
uj5u.com熱心網友回復:
在嘗試了一段時間并詢問了一些朋友后,我得出了使用模糊邏輯匹配地址的解決方案。幸運的是,已經有一個這種邏輯方法的實作,levenshtein($string1, $string2)
我建議在這里閱讀它:https ://www.php.net/manual/de/function.levenshtein.php
示例 1 基本上是我對問題的解決方案,并且到目前為止一直沒有問題。不過要小心!正如下面的評論中解釋的那樣,使用 UTF-8 的示例 1 會導致問題!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/479755.html
