我正在探索Google API,主要是Places API。由于对Google Places API的请求数量限制为100,000,我正在寻找最小化发送到API的请求数量的方法。我正在考虑使用数据库来存储以前收到的响应,因此将来我可以在不向API发出请求的情况下检索它们,只有在以前没有将所需数据存储在我的数据库中的情况下才会请求API
根据Google API使用条款,特别是10.1.3 Restrictions against Copying or Data Export部分,不允许无限期地存储数据,但暂时缓存数据是合法的:
您不得预先获取,缓存或存储任何内容,但您可以存储以下内容:(i)有限数量的内容,以便在您暂时(以及暂时)这样做的情况下提高Maps API实施的效果安全,并且不允许在服务之外使用内容的方式,超过30个日历日没有事件; (ii)Maps API文档特别允许您存储的任何内容标识符或密钥。例如,您不得使用内容来创建“地点”或其他本地列表信息的独立数据库。
我觉得这部分没有得到很好的解释。我可以将API收到的任何数据存储在我的数据库中30天或仅存储地点的ID吗?因为在其他一些情况下我读过它只允许存储id。我这样理解:我可以无限期地存储地点ID,但只能使用整个数据30天。
因为我一直在阅读有关Google API的文章,所以我可能错过了一些使用期限,所以如果你能帮助我,我会非常感激。
如何最大限度地减少对API调用的数量,或者使用这些API分享与真实项目相关的一些经验的任何建议都将非常受欢迎。此外,如果您可以建议我一些可以提供类似功能的替代API将非常有用。
提前谢谢你!
答案 0 :(得分:11)
根据我对Google Places API的使用经验,您的理解是正确的。让我用自己的话解释这两个规定:
i)无需预取或在应用程序之外重新分发,您可以将API结果缓存最多30天。
ii)您可以在应用程序特定数据中使用地点ID或密钥,但没有其他内容(例如,如果您的应用程序允许用户“登记”地点,您可以存储他们曾经在的地方ID列表用户对象并根据ID查找所需位置,但您无法使用Google的名称/详细信息存储所有位置的列表。
为了减少API调用次数并加速我的应用程序,我所做的是将附近的地方调用缓存在一个简单的键值缓存中,其中键是lat-lng对舍入到一定的精度(所以在某个半径范围内调用将触及缓存),该值是整个JSON结果字符串。这是我的代码,它是在Google的App Engine上运行的Java:
// Using 4 decimal places for rounding represents approximately 11 meters of precision
// http://gis.stackexchange.com/questions/8650/how-to-measure-the-accuracy-of-latitude-and-longitude
public static final int LAT_LONG_CACHE_PRECISION = 4;
public static final int CACHE_DURATION_SEC = 24 * 60 * 60; // one day in seconds
...
String cacheKey = "lat,lng:" + round(latitude) + "," + round(longitude);
asyncCache.put(cacheKey, dataJSON, Expiration.byDeltaSeconds(CACHE_DURATION_SEC), MemcacheService.SetPolicy.SET_ALWAYS);
...
private static double round(double value) {
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(LAT_LONG_CACHE_PRECISION, RoundingMode.HALF_UP);
return bd.doubleValue();
}
至于替代API,我建议你看看以下内容:
Yelp API - 提供Google缺少的酒吧/餐厅数据
Facebook API - 如果您已使用Facebook的SDK
,则易于使用Factual: Places Crosswalk - 聚合并规范化来自多个来源的数据,包括Facebook和Yelp,但不包括Google
目前我只使用Google Places API,但我计划稍后添加Yelp或Factual以改善最终用户的结果。