你应该在更高的缩放级别工作,并选择除了 (0,0)
瓦片以外的其他起点来处理图像,而不是使用 1-3
缩放级别。你所需要的只是简单的 数学。默认情况下,您的地图将以 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"
};