【问题标题】:Which Google places API query results are allowed to be stored in a database?哪些 Google Places API 查询结果允许存储在数据库中?
【发布时间】:2015-03-30 08:04:22
【问题描述】:

我正在探索 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,那将非常有帮助。

提前谢谢你!

【问题讨论】:

    标签: google-api google-places-api


    【解决方案1】:

    根据我使用 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 以改善最终用户的结果。

    【讨论】:

    • 我偶然发现了你的答案。我需要显示离用户位置最近的地点列表,并且需要存储 LAT/LNG 坐标。通常,我会使用 Places API 来获取这些信息。我不允许将这些存储在数据库中以供以后排序或距离算法使用。但是,我是否可以在我的“自己的”网格上“表示”地理编码,所以使用一次结果,计算我的网格上的位置,并保存该数据?
    • 我已经很长时间没有使用 Google Places API 了,所以对此持保留态度,但听起来你想做的事情可能是不允许的。您可以将原始响应缓存 30 天,因此如果您的用户在同一个位置,您可以访问缓存以获取结果。不过,您绝对不应该预取或创建自己的地点数据库。
    • @Riël 我也有类似的情况,你能分享一下你用的是什么方法吗? stackoverflow.com/questions/42235025/…
    • cloud.google.com/maps-platform/terms 中的最新政策更改在“3.2.4 禁止滥用服务的限制”中声明“禁止抓取”、“禁止缓存”和禁止创建内容。所以我猜30天的事情也被删除了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2019-12-29
    相关资源
    最近更新 更多