静态地图:绘制具有多个点的多边形。 (2048 个字符限制)

2023-12-21

由于 get 请求中存在 2048 个字符的限制,因此您无法使用 Google Static Maps 生成包含具有大量多边形点的多边形的图像。

特别是当您尝试在一张地图上绘制许多复杂的多边形时。 如果您使用 Google Maps API,那么您将没有任何问题 - 它运行得非常好! 但我想要一张图片(jpg或png)......

那么,是否有机会通过 Google Maps API 创建图像?或者有什么办法可以“欺骗”2048 个字符的限制?

Thanks!


无法“欺骗”字符限制,但可以简化折线以使编码的折线字符串低于字符限制。这可能会也可能不会产生适合您需要的保真度的多边形。

另一个需要注意的是(据我所知)静态地图 API 只允许在地图上绘制单个编码折线(如果您自己关闭它或填充它,这可能看起来像一个多边形,但它仍然是折线,而不是多边形)。

简化折线的一种选择是道格拉斯·普克 http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm算法。下面是一个扩展的实现google.maps.Polyline对象有一个simplify method.

这依赖于加载 Google Maps JS API,如果您使用静态地图,您可能不希望加载,但下面的代码可以轻松重写。

google.maps.Polyline.prototype.simplify = function(tolerance) {

    var points = this.getPath().getArray(); // An array of google.maps.LatLng objects
    var keep = []; // The simplified array of points

    // Check there is something to simplify.
    if (points.length <= 2) {
        return points;
    }

    function distanceToSegment(p, v, w) {

        function distanceSquared(v, w) {
            return Math.pow((v.x - w.x),2) + Math.pow((v.y - w.y),2) 
        }
        function distanceToSegmentSquared(p, v, w) {

            var l2 = distanceSquared(v, w);
            if (l2 === 0) return distanceSquared(p, v);

            var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;
            if (t < 0) return distanceSquared(p, v);
            if (t > 1) return distanceSquared(p, w);
            return distanceSquared(p, { x: v.x + t * (w.x - v.x), y: v.y + t * (w.y - v.y) });
        }

        // Lat/Lng to x/y
        function ll2xy(p){
            return {x:p.lat(),y:p.lng()};
        }

        return Math.sqrt(distanceToSegmentSquared(ll2xy(p), ll2xy(v), ll2xy(w))); 
    }

    function dp( points, tolerance ) {

        // If the segment is too small, just keep the first point. 
        // We push the final point on at the very end.
        if ( points.length <= 2 ) {
            return [points[0]];
        }

        var keep = [],  // An array of points to keep
            v = points[0], // Starting point that defines a segment
            w = points[points.length-1], // Ending point that defines a segment
            maxDistance = 0, // Distance of farthest point
            maxIndex = 0; // Index of said point

        // Loop over every intermediate point to find point greatest distance from segment
        for ( var i = 1, ii = points.length - 2; i <= ii; i++ ) {
            var distance = distanceToSegment(points[i], points[0], points[points.length-1]);
            if( distance > maxDistance ) {
                maxDistance = distance;
                maxIndex = i;
            }
        }

        // check if the max distance is greater than our tollerance allows 
        if ( maxDistance >= tolerance ) {

            // Recursivly call dp() on first half of points
            keep = keep.concat( dp( points.slice( 0, maxIndex + 1 ), tolerance ) );

            // Then on second half
            keep = keep.concat( dp( points.slice( maxIndex, points.length ), tolerance ) );

        } else {
            // Discarding intermediate point, keep the first
            keep = [points[0]];
        }
        return keep;
    };

    // Push the final point on
    keep = dp(points, tolerance);
    keep.push(points[points.length-1]);
    return keep;

};

这是在几个例子的帮助下拼凑起来的(here https://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment and here https://gist.github.com/adammiller/826148).

现在,您可以获取原始多段线并通过此函数以增加容差的方式将其输入,直到生成的编码多段线低于 URL 长度限制(这将取决于您传递给静态地图的其他参数)。

像这样的东西应该有效:

var line = new google.maps.Polyline({path: path});
var encoded = google.maps.geometry.encoding.encodePath(line.getPath());
var tol = 0.0001;
while (encoded.length > 1800) {
    path = line.simplify(tol);
    line = new google.maps.Polyline({path: path});
    encoded = google.maps.geometry.encoding.encodePath(path);
    tol += .005;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态地图:绘制具有多个点的多边形。 (2048 个字符限制) 的相关文章

  • Google Fusion Tables With Maps - 将表字段链接到地图信息窗口

    我几乎是使用 Google Fusion Tables maps 的新手 我们有一个包含公司名称和地址的企业名录 我可以获得每个位置的地理编码地图标记 与表 设施名称 列并排显示 如何对设施名称进行编码 以便用户可以单击公司 设施名称并跳转
  • Google Places API:如何使用多种类型?

    我需要一个返回评级 照片 开放 关闭时间等的 POI API 我认为 Google Places API 似乎可以满足我的要求 但我在过滤方面遇到了一些麻烦 我想使用多种类型的自动完成功能过滤 这是我所拥有的 var map var sel
  • 谷歌地图及其标记

    我有一个标记位置的 JSON 数组被拉入 Google 地图 这工作正常 我还将 infoWindows 链接到每个标记 这些也工作得很好 但是 当我单击标记 在任何浏览器中 时 信息窗口仅出现在最后添加的标记上方 这是一个小提琴 http
  • 从 google 地图 api v3 获取英文地址

    我使用谷歌地图 API v3 来获取某个点的坐标和地址 但谷歌返回法语地址 这是我用来获取地址的脚本 如何强制谷歌地图以英语返回结果 var map var geocoder var mapOptions center new google
  • Google 地图信息窗口根据内部内容调整大小

    我正在使用此方法创建自定义信息窗口 UIView mapView GMSMapView mapView markerInfoWindow GMSMarker marker基于UIStoryboard使用自动布局 我预计一些内部视图将被调整大
  • 如何在pyqt5中创建小部件来显示谷歌地图

    如何从用户那里获取纬度和经度并在 pyqt5 小部件的地图上显示该位置 我的操作系统是Windows 我找到了这个链接 https github com eyllanesc qMap https github com eyllanesc q
  • 谷歌地图 API 的替代品 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • Google Maps API v3 在地图加载后不会禁用滚轮

    我正在网站上实现谷歌地图 一切都工作得很好 除了地图加载后我似乎无法禁用滚轮 如果我在地图加载之前将选项设置为scrollwheel false 则滚轮将被禁用 但如果我稍后尝试执行此操作 我有一个启用 禁用滚轮的复选框 以下是我在页面加载
  • GoogleMaps iOS SDK 1.5 无法加载

    所以我开始研究使用 GoogleMaps iOS SDK 我按照说明进行操作 在控制台中启用适用于 iOS 的 Google Maps SDK 设置 API 密钥并添加捆绑 ID 我使用演示项目 Google Supplies 更新了常量
  • 无法使用 Salesforce Crypto Class for Google Maps API 生成 HMac

    我的公司最近注册了 Google Maps API for Business 要使用该 API 我需要生成 HMac SHA1 签名 并将其添加到我的 HTTP 请求中 不幸的是 不知何故 我无法生成正确的签名 为了进行测试 我使用谷歌提供
  • 更新标记文本谷歌地图API

    因此 我在我的网站上使用 Google 地图 API 并且希望标记文本等于另一个 html 元素的值 这里有人知道如何更新 google 地图 API 中标记的文本属性的值吗 这是我关于该问题的代码 var map marker var i
  • Flex 相当于 Google Visualization Geomap(等值线地图)?

    The 谷歌可视化地理地图 http code google com apis visualization documentation gallery geomap html Overview组件是一个等值线地图 http en wikip
  • 以编程方式设置谷歌地图片段可见性(API2)

    xml
  • 标记聚类在 Android 中不显示标记?

    我在 Android 的 PagerFragment 中设置了 MapView 我按照 Google 示例进行操作 但使用 V2 API 设置带有群集标记的地图 它向我显示了一张没有标记的黑色地图 我哪里做错了 import android
  • Google 使用折线和标记绘制地图性能

    我们正处于决策点 哪种技术将用于我们的高负载航班优惠地图 有一个简单的测试 http buruki com gmap http buruki com gmap但如果我选择伦敦或莫斯科 他们有约 200 300 个航班目的地 大多数浏览器 当
  • infoWindow(谷歌地图)捕获关闭窗口的事件

    当信息窗口关闭时 您触发操作的方式是什么 我找不到任何听众 我正在考虑运行一些后台 Runnable 检查marker isInfoWindowShown 是否 我想要做的 在我的地图上显示按钮 当用户单击点 出现信息窗口 时 屏幕底部也有
  • 在 Google 地图中映射 400MB KML 数据 - 如何?

    Re 我有一个 400MB 大的 KML 文件 1 周的旅行和 5000 公里的记录 它已经去除了非必要的数据 压缩后的 GPX 文件大小约为 80MB 或 2 5MB KML 文件大约 30MB 我不确定有多少个航点 但肯定有数十万个 我
  • 谷歌地图在网络应用程序中离线

    如何下载谷歌地图中的所有图像以在网络应用程序中永久使用离线访问 我可以使用以下命令执行在线操作 src maps googleapis com maps api js sensor false language en 但我需要通过在线下载所
  • 在单页应用程序上重用 Google Maps API 实例

    假设我有一个单页应用程序 Angular JS 应用程序 并且我在元素 id 上绘制一个 Google 地图实例googleMap var mapInstance new google maps Map document getElemen
  • 将其从 Google Maps API v2 转换为 v3

    这适用于 Google Maps API v2 现在如何将其转换为 API v3 谢谢 Radar 1 Overlay Tiles var radar layer new GTileLayer new GCopyrightCollectio

随机推荐

  • 多行 WPF FormattedText 中特定字符的坐标

    如何获取多行 WPF FormattedText 中特定字符的位置 x y 坐标 我的文本可能包含斜体部分 粗体部分 不同字体 不同字体大小 不同对齐方式等 并且我需要获取第 30 个字符 可能位于第 3 行 的坐标 通过使用我可以从 Fo
  • 在 onclick 中声明一个变量?

    当有人点击某个东西然后声明一个变量时 如何在 JavaScript 中声明一个 var 具体取决于函数将返回的内容 即 true 或 false 值 就像是 onclick var varable somefunction 然后我将比较 o
  • PyDev 控制台工作目录

    当我打开 PyDev 控制台时 当前工作目录是我的 Eclipse 文件夹 如何配置控制台以使用项目文件夹作为当前工作目录 可以在工作区范围内设置吗 这个问题 https stackoverflow com questions 103199
  • Drupal:添加新节点时自动添加菜单项

    在Drupal中向页面添加节点时可以自动添加菜单项吗 换句话说 我可以将菜单父级与节点内容类型相关联 然后在添加新节点时自动添加子级吗 thanks 您可以使用 Drupal 7 上的规则来完成此操作 该模块 http drupal org
  • 为什么“删除[][]...多维数组;” C++中不存在运算符

    我一直想知道标准C 语言中是否有删除多维数组的运算符 如果我们创建了一个指向一维数组的指针 int array new int size 删除看起来像 delete array 那太棒了 但是如果我们有二维数组 我们就不能这样做 delet
  • python导入语句

    我已经开始使用 Python 大约一个月了 我遇到了一些我想更好地理解的事情 跟进口有关系 所以我有一个模块 根 核心 连接性 现在在这个模块中我定义了一个类 Connectivity 该模块还有一个 main 仅用于测试目的 不确定这是否
  • MYSQL - 将数据拆分为多行

    我使用一个应用程序导入了一些数据 该应用程序从 IMDB 收集信息并将其传输到 MYSQL 数据库中 这些字段似乎尚未标准化 并且 1 个字段中包含许多值 例如 Table Movie MovieID Movie Title Written
  • 删除div之间的空白

    我在两个 div 之间发现了一些奇怪的空白 每个div都有css属性display inline block每个都有固定的高度和宽度 我找不到空白在哪里 这是一个小提琴 http jsfiddle net RVAQp 1 那里有空格 因为
  • 如何使用 TypeScript 从 npm 扩展模块?

    我在用着joi https github com hapijs joi blob master API md and 类型 joi https github com DefinitelyTyped DefinitelyTyped tree
  • 无法获得 D-Bus 连接:不允许操作

    我正在尝试在 docker centos7 映像上安装 ambari 2 6 但在 ambari 设置步骤中以及在初始化 postgresql 数据库时 我收到此错误 无法获得 D Bus 连接 不允许操作 每次我尝试在 Docker 映像
  • swagger 正在添加上下文根两次

    我正在使用 swagger 3 0 0 SNAPSHOT 和 spring data rest 我的应用程序属性文件中有上下文配置 server servlet context path sample 我的swagger配置如下 Confi
  • 在 DataGridTemplateColumn 内的 TextBlock 上复制 ContextMenu 上的命令

    想问一下 因为以前从未在 TextBlock 上这样做过 我无法复制 DataGridTemplateColumn 的内容 其中有一个 TextBlock 并且我已为其分配了一个上下文菜单 复制的内容是空白的 当我在 MS Word 中尝试
  • Python BeautifulSoup:解析具有相同类名的多个表

    我正在尝试解析 wiki 页面中的一些表格 例如http en wikipedia org wiki List of Bollywood films of 2014 http en wikipedia org wiki List of Bo
  • 如何在不使用异常的情况下检查 constructor() 中的失败?

    我正在处理的所有类都有 Create Destroy 或 Initialize Finalized 方法 Create 方法的返回值为bool像下面这样 bool MyClass Create 所以我可以从返回值中检查实例的初始化是否成功
  • Aeson:将动态键解析为类型字段

    假设有一个像这样的 JSON bob id name bob age 20 jack id name jack age 25 是否可以将其解析为 Person with Person定义如下 data Person Person id Te
  • php 正则表达式 utf-8 中的单词边界匹配

    我在 utf 8 php 文件中有以下 php 代码 var dump setlocale LC CTYPE de DE utf8 German Germany utf 8 de DE german var dump mb internal
  • 如何定义常量值 - 最佳实践

    我有两种定义常量的方法 第一个在类中保存一堆静态最终 DataType 变量 另一个使用 Enum 这是拳头类型 public class TipTipProperties public static final String MAX WI
  • 动态创建 QML ListElement 和内容

    所以我试图在 a 中动态创建 ListElementsListModel 在我尝试在 ListElements 中写入一些要动态加载的内容之前 这种方法工作得很好 我尝试用以下命令创建一个自己的文件ListElement在 和 小时内作为属
  • Jackson:名称为“defaultReference”的多个反向引用属性

    我正在尝试将 json 字符串格式 映射到对象 但出现以下错误 com fasterxml jackson databind JsonMappingException 多个 名称为 defaultReference 的反向引用属性 这是 j
  • 静态地图:绘制具有多个点的多边形。 (2048 个字符限制)

    由于 get 请求中存在 2048 个字符的限制 因此您无法使用 Google Static Maps 生成包含具有大量多边形点的多边形的图像 特别是当您尝试在一张地图上绘制许多复杂的多边形时 如果您使用 Google Maps API 那