哪些Google处API查询结果允许存储在数据库中?

Which Google places API query results are allowed to be stored in a database?

我正在探索 Google API,主要是地点 API。因为对 Google 地点 API 的请求数量限制为 100,000,我正在寻找方法来尽量减少发送到 API 的请求数量。我正在考虑使用数据库来存储以前收到的响应,因此将来我可以在不向 API 发出请求的情况下检索它们,并且仅在需要数据的情况下才会向 API 发出请求以前没有存储在我的数据库中。

根据Google API使用条款,特别是10.1.3 Restrictions against Copying or Data Export部分,不允许无限期地存储数据,但临时缓存是合法的:

You must not pre-fetch, cache, or store any Content, except that you may store: (i) limited amounts of Content for the purpose of improving the performance of your Maps API Implementation if you do so temporarily (and in no event for more than 30 calendar days), securely, and in a manner that does not permit use of the Content outside of the Service; and (ii) any content identifier or key that the Maps APIs Documentation specifically permits you to store. For example, you must not use the Content to create an independent database of "places" or other local listings information.

我发现这部分没有很好地解释。我可以将 API 收到的任何数据存储在我的数据库中 30 天或仅存储地点 ID 吗?因为在其他一些情况下,我读到只允许存储 ID。我是这样理解的:我可以无限期地存储地点 ID,但只能使用整个数据 30 天。

因为我只读了几天有关 Google API 的文章,所以我可能漏掉了一些使用条款,如果您能帮助我,我将不胜感激。

任何有关如何最大程度地减少对 API 的调用次数的建议,或分享与使用这些 API 的实际项目相关的一些经验,我们将不胜感激。另外,如果您可以向我推荐一些可以提供类似功能的 API 替代方案,那将非常有帮助。

提前致谢!

根据我在 Google 个地点 API 的经验,您的理解几乎是正确的。我用自己的话解释一下这两个规定:

i) 无需预取或在您的应用程序外部重新分发,您最多可以缓存 API 结果 30 天。

ii) 您可以在您的应用程序特定数据中使用地点 ID 或密钥,但不能使用其他任何东西(例如,如果您的应用程序允许用户使用 "check-in" 个地点,您可以在他们使用过的地方存储地点 ID 列表一直在用户对象上并根据 ID 查找所需的地点,但您无法存储具有 Google 的 names/details).

的所有地点的列表

为了减少 API 调用次数并加速我的应用程序,我所做的是将附近的地点调用缓存在一个简单的键值缓存中,其中键是四舍五入的经纬度对达到一定的精度(以便在一定半径内的调用将命中缓存)并且该值是整个 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 - 提供 bar/restaurant 数据 Google 缺少

Facebook API - 如果您已经在使用 Facebook 的 SDK,则易于使用

Factual: Places Crosswalk - 聚合和规范化来自许多来源的地点数据,包括 Facebook 和 Yelp,但不包括 Google

目前我只使用 Google Places API,但我计划稍后添加 Yelp 或 Factual 以改善最终用户的结果。