0

私の会社は、私の前任者が開発した機能を使用して住所リストの位置を特定しています。しかし、先週以降、返された結果は数メートルではなく、数十キロ、さらには数百キロも不正確になっています。

PlaceFinder で Yahoo BOSS API を使用することが決定されました。関数は次のとおりです。

function geocode_yahoo($address,$city,$state,$country) {
    $url = "http://yboss.yahooapis.com/geo/placefinder";  
    $cc_key  = "***masked for security reason ***";  
    $cc_secret = "***masked for security reason ***";     
    $consumer = new OAuthConsumer($cc_key, $cc_secret);  
    $address = array($address, $city, $state, $country);
    $address = array_filter($address);
    $args = array();  
    $args["q"] = rawurlencode(implode(' ', $address));
    $args["flags"] = "CJ";
    $request = OAuthRequest::from_consumer_and_token($consumer, NULL,"GET", $url,$args);  
    $request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, NULL);  
    $url = sprintf("%s?%s", $url, OAuthUtil::build_http_query($args));  
    $ch = curl_init($url);  
    $headers = array($request->to_header());  
    curl_setopt($ch,CURLOPT_ENCODING , "gzip");   
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
    curl_setopt($ch, CURLOPT_URL, $url);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
    $rsp = curl_exec($ch);
    if ($rsp != '') {
        $data = json_decode($rsp);
        if ($data && $data->bossresponse->responsecode == '200' && intval($data->bossresponse->placefinder->count)>0) {
            return (object) array('lat'=>$data->bossresponse->placefinder->results[0]->latitude, 'lng'=>$data->bossresponse->placefinder->results[0]->longitude); 
        }
    }
return false;

}

使用されているすべてのアドレスはカナダ人であり、クラス Oauth を正しく使用しています。先週以来、返された結果は意味がありません。

たとえば、住所を入力すると、5275 Griffith Road, Vanderhoof, BC, Canada と入力すると、Yahoo BOSS から次のように返されます。

5275 Griffith Road, Vanderhoof, BC, CANADA

{"bossresponse":{"responsecode":"200","placefinder":{"start":"0","count":"8","request":"flags=CJ&locale=CA&q=5275%2520Griffith%2520Road%252C%2520Vanderhoof%252C%2520BC%252C%2520CANADA","results":

[{"quality":"59","latitude":"-36.71462","longitude":"139.989586","offsetlat":"-36.714619","offsetlon":"139.989578","radius":"64700"},
{"quality":"59","latitude":"47.5714","longitude":"8.115335","offsetlat":"47.5714","offsetlon":"8.11533","radius":"2100"},
{"quality":"59","latitude":"51.667509","longitude":"5.375125","offsetlat":"51.667511","offsetlon":"5.37512","radius":"3900"},
{"quality":"59","latitude":"-30.832686","longitude":"-66.089954","offsetlat":"-30.832689","offsetlon":"-66.089951","radius":"30000"},
{"quality":"59","latitude":"45.965999","longitude":"14.02893","offsetlat":"45.966","offsetlon":"14.11538","radius":"13000"},
{"quality":"59","latitude":"-32.82341","longitude":"28.05365","offsetlat":"-32.82341","offsetlon":"28.05365","radius":"11200"},
{"quality":"59","latitude":"33.824049","longitude":"35.677601","offsetlat":"33.824051","offsetlon":"35.677601","radius":"1000"},
{"quality":"39","latitude":"54.014011","longitude":"-124.012894","offsetlat":"54.014011","offsetlon":"-124.012894","radius":"9600"}]}}}

ご覧のとおり、Yahoo BOSS は何か (コード 200) を検出しました。品質の結果は低く、59 以下です。実際、それらはすべて間違っています。住所はブリティッシュ コロンビアにありますが、一部の結果はメキシコから取得されています。最も近い結果は最後の結果で、結果は 39 です。正しい都市が得られますが、正確さは十分ではありません。無効な結果があるのはこれだけではありません。同じ結果が得られる他のアドレスも多数あります。

郵便番号を入力しようとしましたが、検索を locale=CA に制限し、住所の形式を変更しましたが、何も結果を改善できませんでした。変数を $args["q"] から $args["location"] に変更しようとしましたが、結果に違いはありません。キーを再確認しましたが、すべて正常のようです。最近 API に変更があったかどうかを確認するために Yahoo BOSS サイトをチェックしましたが、何もありませんでした。BOSS に関連する Yahoo グループに問い合わせましたが、回答がありません。私は少し必死なので、どんな助けも大歓迎です!

4

1 に答える 1

0

OK、Yahoo BOSS API では不要になった rawurlencode から問題が発生していたようです。彼らは私たちに答えることはありませんでしたが、API の変更によってこのエンコードが役に立たなくなったのではないかと思います。

于 2013-10-25T19:50:54.840 に答える