-1

バッチリクエストには本当にクリーンな方法はないと聞いたreferenced hereからGooglePlacesAPIへ。理解された。GoogleプレイスApiバッチリクエストJavascript

しかし、回避する必要があります。

const retrievePlaces = (google, map, request) => { 
    var places = []; 
    var newPlaces = [] 
    var service = new google.maps.places.PlacesService(map); 

    return new Promise(function(resolve, reject) { 
    service.nearbySearch(request, function(results, status){ 

    if(status == "OK"){ 
     for (var i = 0; i < results.length; i++) { 
      var place = results[i]; 
      places.push(place); 
     } 
     resolve(places); 
     } 
    }); 
    }); 
} 

私は上記の機能を使用して、まず自分の場所を取得します(これは問題ありません)。そして、私が使用します。

const retrieveDetails = (google, map, places) => { 

    var gmap = { 
    map: map, 
    google: google 
    }; 

    var placeIds = places.map(function(place){ 
    return { placeId: place.place_id } 
    }); 

    var promiseArray = placeIds.map(place => getPlaceDetailsPromise(place, gmap) 
             .then( res => ({res})) 
             .catch(err => ({err}))); 

    Promise.all(promiseArray) 
    .then(results => { 
     console.log(results); 
    }); 

} 

と:

const getPlaceDetailsPromise = (obj, gmap) => new Promise((resolve, reject) => { 
    var service = new gmap.google.maps.places.PlacesService(gmap.map); 

    service.getDetails(obj, (place, status) => { 
    if (status === google.maps.places.PlacesServiceStatus.OK) { 
     console.log(" Status OK", place); 
     resolve(place); 
    } else { 
     console.log("Not OK"); 
    } 
    }); 
}); 

PlaceDetailsAPIからすべての場所の詳細を取得しようとします。それは実際にはある程度までは機能するが、それは常に9つの応答しか返しません。さらに、それらは順不同です。

どのように各場所の詳細を取得することができるかもしれないかについての洞察はありますか?

答えて

0

地図JavaScript APIクライアント側のサービスにはセッションごとの制限があります。これは、ドキュメントの次のセクションに記載されている:ユーザー・セッションごとに適用

https://developers.google.com/maps/documentation/javascript/geocoding#UsageLimits

レートリミットは、関係なく、同じプロジェクトを共有するどのように多くのユーザーの。

セッションごとのレート制限により、バッチ・ジオコーディングなどのバッチ要求にクライアント・サイド・サービスを使用できなくなります。バッチリクエストの場合は、Google Maps Geocoding API Webサービスを使用します。

残念ながら、ドキュメンテーションはドキュメントの場所ライブラリ部分にこの通知を含んでいませんが、同じように動作します。

私が知る限り、最初は10個のバケットがあります。バケットが空になるとリクエストは拒否されます。バケットは1秒あたりの要求1で再充填されます。そのため、セッションごとの制限内で滞在するために、場所の詳細のリクエストを抑制する必要があります。または、50個のQPS(クエリ/秒)の制限があるサーバー側でバッチ場所の要求を実装することもできます。

0

ありがとう@xomenaこの質問につきものになるかもしれない他の人にとっては、それを行う方法があり、それは以前に言及した@xomenaを含んでいます。それは少し汚れて、おそらく非常に非効率ですが、私はそれが必要なのですか?

私は少し問題を解決し、私が持っていたCORSの問題を回避するために少しのアヤックス/カールの開始をしました。私はフォーマットされたGoogleのapiリクエストuri(私の関数の1つからajaxを介して送られた)を取得し、詳細オブジェクトを返すサーバー側のプロキシを作った。

その後、すべてが魅力的に機能しました。更新されたコードは以下の通りです。

const retrievePlaces = (google, map, request) => { 
    var places = [], 
     newPlaces = [], 
     service = new google.maps.places.PlacesService(map); 

    return new Promise(function(resolve, reject) { 
    service.nearbySearch(request, function(results, status){ 
     if(status == "OK"){ 
     for (var i = 0; i < results.length; i++) { 
      var place = results[i]; 
      places.push(place); 
     } 
     resolve(places); 
     } 
    }); 
    }); 
} 

const retrieveDetails = (google, map, places, api) => { 

    var gmap = { map: map, google: google, api_key: api }, 
     placeDetails = [], 
     placeIds = places.map(getPlaceIds), 
     promiseArray = placeIds.map(getPlaceDetails); 

    function getPlaceIds(place){ 
    return { placeId: place.place_id } 
    } 

    function getPlaceDetails(place){ 
    getPlaceDetailsPromise(place, gmap) 
     .then( res => ({res})) 
     .catch(err => ({err})); 
    } 

    return Promise.all(promiseArray); 

} 

const getPlaceDetailsPromise = (obj, gmap) => new Promise((resolve, reject) => { 

    var url = `https://maps.googleapis.com/maps/api/place/details/json?placeid=${obj.placeId}&key=${gmap.api_key}`, 
     qsObj = Qs.parse({ url: url }), 
     qsString = Qs.stringify(qsObj), 
     headerConfig = { 
     headers: { 
      "Content-Type": "application/x-www-form-urlencoded" 
     } 
     }; 

    function resolveDetails(res){ 
    var result = res.data; 
    resolve($.parseJSON(result)); 
    } 

    axios.post('/a/random/path', qsString, headerConfig).then(resolveDetails); 

}); 

そしてPHPでプロキシ:あなたはプラグインとあなたのコードにそれを果たしたが、アイデアがある場合はもちろん、

<?php 
/* proxy.php */ 
$url = $_POST["url"]; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec ($ch); 
curl_close ($ch); 

$result = json_encode($result); 

echo $result; 

die(); 
?> 

が、これは動作しません。もし誰かがあなたがそれをやったのを見たいと思うより良い方法を見つけたら、将来知っているのは良いことでしょう。

関連する問題