谷歌地图API V3-防止ImageMapType包装
Google Maps API V3 - Prevent ImageMapType from wrapping
请注意:
这个问题和我在stackoverflow上发现的这个问题非常相似。
Google Maps v3 ImageMapType阻止包装
然而,上面的问题和答案不适用于我的示例/问题,因为我需要能够在任何缩放级别查看我的所有图像,更重要的是,我需要绘图工具才能正确工作。
我的场景:
我有一个使用ImageMapType
的自定义谷歌地图,它还有DrawingManager
库和工具。
我的问题:
乍一看,一切都很好,但如果你要绘制任何标记或多边形,然后平移地图,标记/多边形会在视图中的地图区域重复或移动。
在地图上绘制大型多边形时也会出现同样的问题,在绘制多边形时,您会注意到所绘制的线会突然捕捉到多边形的错误一侧。
我的问题:
如何防止包裹问题,使所有标记不会移动或重复,并使绘图工具在不捕捉到多边形另一侧的情况下工作?
在线示例:
http://jsbin.com/ecujug/5/edit#javascript,实时
问题视频:
https://dl.dropbox.com/u/14037764/Development/stackoverflow/map-drawing/issue.html
期望效果:
http://www.maplib.net/map.php?id=1236
不应使用1-3
缩放级别,而应使用更高级别,并为图像选择(0,0)
平铺之外的其他原点。您所需要的只是简单的数学。默认情况下,您的地图将以LatLng(0,0)
点为中心(正如您在MapOptions
中所提到的),计算将围绕该点执行。
理论
在任何缩放下,总共有2^zoom x 2^zoom
瓦片:
zoom
_______________________ 2
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|_|
zoom
2
由于LatLng(0,0)
是中心GPS点,因此包含该点的瓦片应该是tile-sheet
:的中心瓦片
zoom
_______________________ 2
| |
| |
| | zoom
| | 2 zoom-1
| o----------|-------* ------ = 2
| |_| | 2
| | |
| | |
| | |
|__________|__________|
zoom |
2 | zoom-1
* 2
因此,在任何zoom
级别上,中心瓦片都具有(2^(zoom-1), 2^(zoom-1))
坐标。该瓦片将是映射的origin
。通过从当前瓦片的坐标中减去原点坐标,我们将获得coordinate-space
,就像我们在1-3
缩放级别中工作时以及原点为(0,0)
瓦片时一样。
实施
首先,选择更高的缩放级别,例如:
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"
};
现场演示
看起来很明显——谷歌地图认为这是一个完整的地球,所以它是圆形的。为什么要使用最小(地球范围)缩放级别?让谷歌地图认为这只是一小块不超过1°的土地,你就完了。
- 如何将函数包装在函数中以避免代码重复
- 同位素库错误:未捕获错误无布局模式包装生产线8
- 为什么要包装每一个原型“;类“;JS中具有匿名函数的对象
- 在'物品包装'
- 如何在jQuery中包装两个元素的组
- 如何在包装功能中咕哝concat
- 用类javascript包装span标记中字符串中的字符索引
- 在jquery$({})中包装纯javascript对象
- 从工作日结束到下一个工作日开始的完整日历JS包装时间
- 如何制作href链接和<李>在一个包装中
- jquery在元素中查找文本节点,并使用标记进行连接和包装
- 如何使用图表包装函数有条件地格式化谷歌可视化表单元格
- Cordova包装应用程序内部链接加载在应用程序中,外部链接加载在浏览器中
- 如何在每个动态创建的ImageButton周围包装超链接?Visual Studio
- 使用Javascript设置库中图像包装器的宽度
- 使用服务工作者动态缓存HTTP URL的包装器
- 如何使图像适合TD,而不需要包装在不同的屏幕分辨率上
- 将setTimeout()包装器实现为Element.prototype中的方法
- 如何在输入中选择的文本周围包装html标记
- 谷歌地图API V3-防止ImageMapType包装