google-maps-api-3 - 查找当前在 Google map v3 map 的视口(viewport)中可见的图 block

标签 google-maps-api-3

我正在尝试在一些 Google Maps v3 网络 map 中构建对平铺矢量数据的支持,但我很难弄清楚如何找出当前 map 视口(viewport)中可见的 256 x 256 平铺图 block 。我知道如果您创建如下所示的 google.maps.ImageMapType ,则可以找到解决此问题所需的信息: Replacing GTileLayer in Google Maps v3, with ImageMapType, Tile bounding box? ,但我这样做显然不是为了引入传统的预渲染 map 图 block 。

所以,一个由两部分组成的问题:

  1. 找出哪些图 block 在当前视口(viewport)中可见的最佳方法是什么?
  2. 获得此信息后,将其转换为可用于请求必要数据的纬度/经度边界框的最佳方法是什么?我知道我可以将这些信息存储在服务器上,但如果有一种简单的方法可以在客户端上进行转换,那就太好了。

最佳答案

这是我在文档( http://code.google.com/apis/maps/documentation/javascript/maptypes.html ,特别是“ map 坐标”部分)和许多不同来源的帮助下得出的结论:

function loadData() {
    var bounds = map.getBounds(),
        boundingBoxes = [],
        boundsNeLatLng = bounds.getNorthEast(),
        boundsSwLatLng = bounds.getSouthWest(),
        boundsNwLatLng = new google.maps.LatLng(boundsNeLatLng.lat(), boundsSwLatLng.lng()),
        boundsSeLatLng = new google.maps.LatLng(boundsSwLatLng.lat(), boundsNeLatLng.lng()),
        zoom = map.getZoom(),
        tiles = [],
        tileCoordinateNw = pointToTile(boundsNwLatLng, zoom),
        tileCoordinateSe = pointToTile(boundsSeLatLng, zoom),
        tileColumns = tileCoordinateSe.x - tileCoordinateNw.x + 1;
        tileRows = tileCoordinateSe.y - tileCoordinateNw.y + 1;
        zfactor = Math.pow(2, zoom),
        minX = tileCoordinateNw.x,
        minY = tileCoordinateNw.y;

    while (tileRows--) {
        while (tileColumns--) {
            tiles.push({
                x: minX + tileColumns,
                y: minY
            });
        }

        minY++;
        tileColumns = tileCoordinateSe.x - tileCoordinateNw.x + 1;
    }

    $.each(tiles, function(i, v) {
        boundingBoxes.push({
            ne: projection.fromPointToLatLng(new google.maps.Point(v.x * 256 / zfactor, v.y * 256 / zfactor)),
            sw: projection.fromPointToLatLng(new google.maps.Point((v.x + 1) * 256 / zfactor, (v.y + 1) * 256 / zfactor))
        });
    });
    $.each(boundingBoxes, function(i, v) {
        var poly = new google.maps.Polygon({
            map: map,
            paths: [
                v.ne,
                new google.maps.LatLng(v.sw.lat(), v.ne.lng()),
                v.sw,
                new google.maps.LatLng(v.ne.lat(), v.sw.lng())
            ]
        });

        polygons.push(poly);
    });
}
function pointToTile(latLng, z) {
    var projection = new MercatorProjection();
    var worldCoordinate = projection.fromLatLngToPoint(latLng);
    var pixelCoordinate = new google.maps.Point(worldCoordinate.x * Math.pow(2, z), worldCoordinate.y * Math.pow(2, z));
    var tileCoordinate = new google.maps.Point(Math.floor(pixelCoordinate.x / MERCATOR_RANGE), Math.floor(pixelCoordinate.y / MERCATOR_RANGE));
    return tileCoordinate;
};

解释:基本上,每次平移或缩放 map 时,我都会调用 loadData 函数。该函数计算哪些图 block 位于 map View 中,然后迭代已加载的图 block 并删除不再位于 View 中的图 block (我取出了这部分代码,因此您不会在上面看到它)。然后,我使用存储在boundingBoxes数组中的LatLngBounds从服务器请求数据。

希望这对其他人有帮助......

关于google-maps-api-3 - 查找当前在 Google map v3 map 的视口(viewport)中可见的图 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5054276/

相关文章:

javascript - 范围错误: Maximum call stack size exceeded - Google Maps Api

android - 如何在 kml url 中为 Google Map 中的路径传递源和目的地纬度和经度之间的航路点?

javascript - Google map 隐藏小屏幕上的控件

javascript - 自定义 Google 标记

javascript - 通过 AJAX 加载 Google Maps API,控制台错误

javascript - 如何在左侧显示侧面板并在右侧显示 Google maps api Canvas ,填充页面的其余部分?

jquery - 如何删除谷歌地图 API 3 的折线

google-maps - Google map 地点 : Why do I need an API key?

javascript - 在多个标记之间绘制折线

javascript - gmap3 在信息窗口中显示地址