gpt4 book ai didi

javascript - Google Maps API V3 - 防止 ImageMapType 换行

转载 作者:可可西里 更新时间:2023-11-01 02:57:29 25 4
gpt4 key购买 nike

请注意:

这个问题与我在 stackoverflow 上找到的这个问题非常相似。

Google Maps v3 ImageMapType Prevent Wrapping

但是,上述问题和答案不适用于我的示例/问题,因为我需要能够在任何缩放级别查看我的所有图像,更重要的是我需要绘图工具才能正常工作。


我的场景:

我有一个使用 ImageMapType 的自定义谷歌地图,它还有 DrawingManager 库和工具。

我的问题:

乍一看一切都很好,但是如果您要绘制任何标记或多边形然后平移 map ,则标记/多边形会重复或移动到 View 中的 map 区域。

在 map 上绘制大多边形时会出现同样的问题,当您绘制多边形时,您会注意到正在绘制的线会突然捕捉到多边形的错误一侧。

我的问题:

如何防止出现环绕问题,以便所有标记都不会移动或重复,并且绘图工具可以在不捕捉到多边形另一侧的情况下工作?


在线示例:

http://jsbin.com/ecujug/5/edit#javascript,live

问题视频:

https://dl.dropbox.com/u/14037764/Development/stackoverflow/map-drawing/issue.html

期望的效果:

http://www.maplib.net/map.php?id=1236

最佳答案

您应该在更高级别工作,而不是 1-3 缩放级别,并为图像选择 (0,0) 平铺之外的另一个原点。您需要的只是简单的数学。默认情况下,您的 map 将以LatLng(0,0) 点为中心(正如您在MapOptions 中提到的那样),计算将围绕该点进行。

理论

在任何缩放下,总共有 2^zoom x 2^zoom 个图 block :

                           zoom
_______________________ 2
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
zoom
2

由于 LatLng(0,0) 是中心 GPS 点,包含该点的图 block 应该是 tile-sheet 的中心图 block :

                           zoom
_______________________ 2
| |
| |
| | zoom
| | 2 zoom-1
| o----------|-------* ------ = 2
| |_| | 2
| | |
| | |
| | |
|__________|__________|
zoom |
2 | zoom-1
* 2

因此,在任何缩放 级别,中央图 block 都有(2^(zoom-1), 2^(zoom-1)) 坐标。该图 block 将是映射的原点。通过从当前图 block 的坐标中减去原点坐标,我们将得到这样的坐标空间当我们在 1-3 缩放级别工作并且原点是 (0,0) tile 时。

实现

首先,选择较高的缩放级别,例如:

var MIN_ZOOM = 11,
MAX_ZOOM = 13;

映射将由 getNormalizedCoord 函数完成:

function getNormalizedCoord(coord, zoom) {
//Amount of total tiles:
// MIN_ZOOM -> 1 tile
// MIN_ZOOM+1 -> 2 tiles
// MIN_ZOOM+2 -> 4 tiles
var totalTiles = 1 << (zoom - MIN_ZOOM),
y = coord.y,
x = coord.x;
var originx = 1 << (zoom-1),
originy = 1 << (zoom-1);

if(y < originx || y >= originx + totalTiles ||
x < originx || x >= originx + totalTiles){
return null;
}

x -= originx;
y -= originy;

return { x:x, y:y };
}

最后,ImageMapOptions 应该是:

var siteMapOptions = {
getTileUrl: function (coord, zoom) {
var normalizedCoord = getNormalizedCoord(coord, zoom);
if (normalizedCoord) {
return 'https://edocstorage.blob.core.windows.net/siteimages/2fa9fc72-23a7-41ed-86a1-b83a3ba04790/_siteTiles/tile_' +
(zoom-MIN_ZOOM) + '_' +
normalizedCoord.x + '-' +
normalizedCoord.y + '.png';
} else {
return 'content/tilecutter/empty.jpg';
}
},
tileSize: new google.maps.Size(256, 256),
maxZoom: MAX_ZOOM,
minZoom: MIN_ZOOM,
radius: 1738000,
name: "Site Plan"
};

Live demo

关于javascript - Google Maps API V3 - 防止 ImageMapType 换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11411246/

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