【问题标题】:Is it possible to call a Google API and get the map image and save the image in somewhere是否可以调用 Google API 并获取地图图像并将图像保存在某处
【发布时间】:2016-04-01 02:25:05
【问题描述】:

我目前正在通过 html 电子邮件发送谷歌地图图像。

目前我正在使用static-maps-api 来完成我的任务。我将调用静态地图 api 并将图像 URL 设置为 src 在图像标签中。

<img src="https://maps.googleapis.com/maps/api/staticmap?markers=icon:http://mailadapterdev.vanapi.com/static/start.png|13.82,100.54&markers=icon:http://mailadapterdev.vanapi.com/static/waypt1.png|13.80,100.54&markers=icon:http://mailadapterdev.vanapi.com/static/waypt2.png|13.81,100.52&markers=icon:http://mailadapterdev.vanapi.com/static/waypt3.png|13.79,100.54&markers=icon:http://mailadapterdev.vanapi.com/static/dest.png|13.79,100.53&path=weight:3|color:blue|enc:cfjsAqvsdRnAMd@MZpDLpATpB?HGLMX?VV`CTjBr@L|ATlDf@hBXGl@CPTDtAR~Et@jF`AnLbBvKdB~@JbAR`BTdDd@pDj@l@H`Cb@vALFOJIr@yCxAgHPYTOREV?N@ZHrIxD|HjD~CxAxAn@j@XHDZy@hAoCdCiG~B{Gj@gBXeALWNU@[A[OWi@m@_@_@i@w@O[o@SSKK?}A]sBy@wBeAvBdArBx@|A\J?JOIsCJgC?[Io@KQ^Nn@TLDUfDC`AFp@RfAj@dAl@p@n@n@DHDN?TC`@IFW^MVYdAKZMb@uBdGaDfIiAnC[x@B@RHpCnAnAh@jChAnVrK|@`@Uh@iChG{D~J}B~Fe@tAq@fCcBfG_ApDMd@AXO`@Q^GCu@S{AAyIByEAaABc@@}A@kACeDImKWcKSmAGgAEoCCqECI?LlCH~DI_EMmCH?|@BdA?lA?nCBfADlAFrDHnEH|ELtIRjAB|AAb@A`ACxE@xICzA@l@Oh@a@p@}BhDoMd@yA~AcE`AiCtDsJhCeGHSHs@b@_Ej@cGbAuJ\mC|@sGb@gENoBF]XkAZuBX}CLoA@CbAJbDXl@Fm@GcDYcAKABMnAOzAI`AKr@_@pBQx@OnBUdCYbCk@tDCR~@VTL~@t@xBz@|GrB`I`CYnA_BpH{A`H&key=MY_API_KEY=400x400" >

在调用静态地图 api 之前,我将调用 directions-api 使用 lat long 并获取折线,使用从调用路线 API 获取的折线,我将调用静态地图 API。

我的问题是

当路点数增加(通常超过5个)时,折线变得很大,URL会变长,如果大于2048个字符,我就无法查看我的地图。 google 不会将其识别为有效的 URL。所以很明显。

我的问题是

  1. 有没有办法减小策略线的大小?
  2. 无论如何调用 Google API 并获取图像并将其保存在我的服务器中。
  3. 如果我能做到第二点,将谷歌地图保存在我的服务器中,而不是每次我想要的时候调用谷歌服务器来获取图像是非法的。
  4. 我还有其他方法可以完成我的任务吗?

我在这个问题上被困了两个多星期了。我几乎尝试了一切。请帮我解决这个问题。

提前谢谢你。

【问题讨论】:

    标签: javascript node.js google-maps google-static-maps google-directions-api


    【解决方案1】:

    我会在线回答你:

    1. 有没有办法减小折线的大小?
      是的,Google 使用编码折线,here 你可以找到创建折线的过程。您还可以找到Interactive Polyline Encoder Utility,也可以考虑使用名为Geometry 的Google 库及其方法encodePath()。查找参考here
    2. 是否可以调用 Google API 并获取图像并将其保存在我的服务器中。
      ,如 xomena 所述

    3. 如果我能做到第二点,在我的服务器中保存谷歌地图而不是每次我想要的时候调用谷歌服务器来获取图像是违法的吗?
      ,如xomena 所述

    4. 我还有其他方法可以完成我的任务吗?
      是的,正如我在回答您的第一个问题时所述,您可以使用 Google's Geometry library

    【讨论】:

      【解决方案2】:

      我会回答我自己的问题 - 仅适用于第 1 部分

      减小折线大小的一种方法是使用polyline encoding。 要查看它是如何工作的,您可以使用this interactive sample

      对于 node.js,我使用 simplify-pathpolyline 模块来实现这一点。

      步骤

      1. 使用您的经纬度数据校准Directions API 并获取概述折线
      2. 使用polyline 模块解码策略线
      3. 使用simplify-path 模块简化路径。
      4. 最后使用 polyline 模块中的编码对您从第三步获得的详细信息进行编码

      例子

      var simplify_path = require("simplify-path");
      var polyline      = require("polyline");
      
      var poly_line = "overview polyline from directions API";
      
      var path = polyline.decode(poly_line);
      var tolerance = 10;
      
      path = simplify_path(path, tolerance)
      var new_polyline = polyline.encode(path);
      
      console.log("old_plyline "+JSON.stringify(poly_line));
      console.log("new_polyline "+JSON.stringify(new_polyline));
      

      所以你会得到一个简化的相对较短的策略线。

      看起来很简单:D

      【讨论】:

      • 如果您在使用路线中的overview_polyline 时仍然需要它,我会感到惊讶,您正在使用它吗?那个已经简化了。
      【解决方案3】:

      解决问题 2 和 3。您无法在服务器上保存图像。服务条款禁止这样做。

      查看 ToS 的第 10.1 (a) 段

      只能通过服务访问 API 或内容。除非通过服务,否则您将无法访问 Maps API 或内容。例如,您不得通过 Maps API 以外的接口或渠道(包括未记录的 Google 接口)访问地图图块或图像。

      https://developers.google.com/maps/terms#10-license-restrictions

      【讨论】:

      • 但是在同一部分 (10.5): >您不会预取、缓存、索引或存储任何要在服务之外使用的内容,除非您可以单独存储有限数量的内容出于网络延迟提高 Maps API 实施性能的目的...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      相关资源
      最近更新 更多