gpt4 book ai didi

google-maps - 静态 map : Drawing polygons with many points.(2048 个字符限制)

转载 作者:行者123 更新时间:2023-12-04 18:44:58 25 4
gpt4 key购买 nike

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

特别是如果您尝试在一张 map 上绘制许多复杂的多边形。
如果您使用 Google Maps API,您将没有问题 - 它运行良好!
但我想要一个图像(jpg 或 png)...

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

谢谢!

最佳答案

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

一个额外的警告是(据我所知)静态 map API 只允许在 map 上绘制单个编码折线(这看起来像一个多边形,如果你自己关闭它或填充它,但它仍然是折线,而不是多边形)。

简化多段线的一种选择是 Douglas Peucker算法。下面是一个扩展 google.maps.Polyline 的实现带有 simplify 的对象方法。

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

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;

};

这是在几个示例( herehere )的帮助下拼凑起来的。

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

这样的事情应该工作:
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;
}

关于google-maps - 静态 map : Drawing polygons with many points.(2048 个字符限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16517339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com