javascript – Google Maps API V3 – 防止ImageMapType包装

前端之家收集整理的这篇文章主要介绍了javascript – Google Maps API V3 – 防止ImageMapType包装前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
请注意:

这个问题与我在stackoverflow上发现的这个问题非常相似.

Google Maps v3 ImageMapType Prevent Wrapping

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

我的场景:

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

我的问题:

乍一看,所有的工作都很好,但是如果要绘制任何标记或多边形,然后平移地图,标记/多边形将重复或移动到视图中的地图区域.

当在绘制多边形时绘制大多边形时也会出现同样的问题,您将注意到,绘制的线将突然捕捉到多边形的错误边.

我的问题:

如何避免包装问题,以便所有的标记都不会移动或重复,以便绘图工具不会碰到多边形的另一面呢?

在线示例:

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).你需要的只是简单的数学.默认情况下,您的地图将以LatLng(0,0)点为中心(如您在MapOptions中提到的),计算将围绕这一点进行.

理论

在任何缩放,总共有2 ^ zoom x 2 ^ zoom tiles:

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

由于LatLng(0,0)是中心GPS点,所以包含该点的瓦片应该是瓦片的中心瓦片:

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

因此,在任何缩放级别,中心平铺具有(2 ^(zoom-1),2 ^(zoom-1))坐标.该图块将是映射的起源.通过从当前图块的坐标中减去原点坐标,我们将拥有像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"
};

Live demo

原文链接:https://www.f2er.com/js/151422.html

猜你在找的JavaScript相关文章