【问题标题】:Google Maps API v3 ImageMapType谷歌地图 API v3 ImageMapType
【发布时间】:2014-08-01 13:55:08
【问题描述】:

我在这里关注 Google Maps API v3 ImageMapType 示例:https://developers.google.com/maps/documentation/javascript/examples/maptype-image

但是,我没有从文档中清楚地了解磁贴/缩放的工作原理。现在,我只是想让它使用 0 缩放。一旦我解决了这个问题,我就可以弄清楚缩放部分。

我的图像是 2000 像素 X 2000 像素。我已将其以 250 像素 X 250 像素/图块分割成 8 个图块乘 8 个图块。

我正在 getTileUrl 上执行 console.log。我期待看到我的所有 64 个图块从 0-0.png 加载到 7-7.png 但是,我看到 0-0.png 尝试加载九次。

我创建了这个http://jsfiddle.net/2N2sy/1/(下面的代码)来模拟我的代码。

非常感谢您帮助解开瓷砖/缩放!

function getNormalizedCoord(coord, zoom) {
    var y = coord.y;
    var x = coord.x;

    // tile range in one direction range is dependent on zoom level
    // 0 = 1 tile, 1 = 2 tiles, 2 = 4 tiles, 3 = 8 tiles, etc
    var tileRange = 1 << zoom;

    // don't repeat across y-axis (vertically)
    if (y < 0 || y >= tileRange) {
        return null;
    }

    // repeat across x-axis
    if (x < 0 || x >= tileRange) {
        x = (x % tileRange + tileRange) % tileRange;
    }

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

var map;

function initMaps() {

    $.getScript("http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobox/src/infobox.js").done(function (script, textStatus) {

        var customMapTypeOptions = {
            getTileUrl: function (coord, zoom) {
                var normalizedCoord = getNormalizedCoord(coord, zoom);
                if (!normalizedCoord) {
                    return null;
                }
                var bound = Math.pow(2, zoom);
                console.log('http://img.photobucket.com/albums/v229/s15199d/ + normalizedCoord.x + '-' + (bound - normalizedCoord.y - 1) + '.png');
                return 'http://img.photobucket.com/albums/v229/s15199d/ + normalizedCoord.x + '-' + (bound - normalizedCoord.y - 1) + '.png';
            },
            tileSize: new google.maps.Size(250, 250),
            maxZoom: 0,
            minZoom: 0,
            radius: 1738000,
            name: 'custom map'
        };

        var customMapType = new google.maps.ImageMapType(customMapTypeOptions);

        var latlng = new google.maps.LatLng(0, 0), // center point

        mapOptions = {
            zoom: 0,
            center: latlng,
            draggable: true,
            scrollwheel: false,
            mapTypeControl: false,
            panControl: false,
            scaleControl: false,
            zoomControl: true,
            zoomControlOptions: {
                style: google.maps.ZoomControlStyle.LARGE,
                position: google.maps.ControlPosition.RIGHT_TOP
            },
            streetViewControl: false,
            streetViewControlOptions: {
                position: google.maps.ControlPosition.RIGHT_TOP
            },        
            mapTypeControlOptions: {
                mapTypeIds: ['custom map']
            }
        };

        map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);

        map.mapTypes.set('custom map', customMapType);
        map.setMapTypeId('custom map');

    });
}

$(function () {
    if (window.google && google.maps) {
        //alert("Map script is already loaded. Initializing");
        initMaps();
    } else {
        //alert("Lazy loading Google map...");
        lazyLoadGoogleMap();
    }

});

function lazyLoadGoogleMap() {
    $.getScript("http://maps.google.com/maps/api/js?sensor=true&callback=initMaps")
    .done(function (script, textStatus) {
        //alert("Google map script loaded successfully");
    })
    .fail(function (jqxhr, settings, ex) {
        //alert("Could not load Google Map script: " + jqxhr);
    });
}

【问题讨论】:

  • @geocodezip 感谢您修复我的 jsfiddle!由于 jsfiddle 输出窗口的宽度,您只能看到 3 倍的 console.log。如果您将窗口扩大,您将看到更多的 console.log 迭代
  • 小提琴链接不正确。
  • 只是通过打击和试验。这个小提琴链接有效:jsfiddle.net/2N2sy/1

标签: jquery google-maps google-maps-api-3


【解决方案1】:

您是在告诉它这样做。如果您查看getNormalizedCoord 函数,您会发现您期望tileRange 为1。然后您检查x 坐标与tileRange。由于它是 1,所有大于或等于 1 的值都将被归一化(只有一个选项小于 1,并且为零)。

如果你遵循它的逻辑,它会这样做:

  1. x 设置为1 % 1(即为0)
  2. x 设置为0 + 1(即1)
  3. x 设置为1 % 1(又是0)

因此,在您选择的缩放级别,该函数总是返回 0。如果您尝试更大的缩放级别,您会注意到它确实会加载您的其他图块。

您犯的一个错误(我认为)是您将缩放级别倒退:0 完全缩小,9 完全放大。您使用的示例基于单个概览图像进行缩放级别 0 和每一步进一步放大的更小的块。因此,您应该期望以缩放级别 0 加载一个图块 (0, 0)。要加载所有 64 个图块,您将需要更高的缩放级别。对同一个 url 的多次调用只是 API 使用其缓存来填充切片。如果你看一下这个例子,它只是在那里沿 X 轴重复相同的图像。


回顾 cmets 中讨论的内容,使用的标准化函数将加载所有图块的缩放级别为 3。现在,加载图块时 y 轴翻转。要解决此问题,您必须将 getTileUrl 中的以下行从 (bound - normalizedCoord.y - 1) 更改为 (normalizedCoord.y - 1)

在 Google 地图中进行缩放的整个想法是基于为相同的平铺网格加载具有更高细节级别的图像,从而提供进一步放大的想法。为此,您需要生成额外的图像。

如果您没有/不需要具有额外细节的图像,您可以选择将缩放级别固定为 3(​​无论如何没人会注意到)并像这样部署或清理(甚至可能删除)规范化代码以满足您的需求。目前,该功能负责在 X 轴上重复相同的图像,而在 Y 轴上完全不重复。对于 X 轴上的重复,它会查看缩放级别以确定在再次环绕到 0 之前应该加载多少块。

从问题中,我无法推断您是需要包装还是只是从示例中选择了包装。我也无法判断您是否有更多图像。因此我不能给你任何现成的代码,因为我没有任何规范可以使用。


如果你不需要包装,让它像处理 Y 坐标一样处理 X 坐标:

function getNormalizedCoord(coord, zoom) {
    var y = coord.y;
    var x = coord.x;

    // tile range in one direction range is dependent on zoom level
    // 0 = 1 tile, 1 = 2 tiles, 2 = 4 tiles, 3 = 8 tiles, etc
    var tileRange = 1 << zoom;

    // don't repeat across y-axis (vertically)
    if (y < 0 || y >= tileRange) {
        return null;
    }

    // don't repeat across x-axis (horizontally)
    if (x < 0 || x >= tileRange) {
        return null;
    }

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

(请注意,这两个 if 语句可以合并为一个,我只是想方便注意哪些更改会影响此行为)

【讨论】:

  • @SSA 主要问题是没有人可以真正“修复”缩放,因为我们不知道哪些图像可用。现在,它只是在不同缩放级别上跳过整体图像的一部分。由于他以 8x8 的形式将其切碎,因此归一化功能表明缩放级别 3 是显示全图的级别。但是,由于提供的图像的 Y 轴方向错误,所以看起来很时髦。
  • @gpgekko 感谢您的解释。增加默认缩放和最小/最大缩放实际上会加载更多我的图块,但它们的顺序不正确。我将我的 64 个标题从 0-0.png 标记为 7-7.png,其中 0-0 是左上角,7-7 是右下角。为了使我的地图正常工作,我缺少什么?
  • @gpgekko 你是说我的 x/y 在我的标题命名中被翻转了吗?
  • @s15199d 实际上,(0,0) 在左上角,(7,7) 在右下角。但是,这些图像似乎是倒置的。
  • @s15199d 它实际上是翻转事物的示例代码。将(bound - normalizedCoord.y - 1) 的行更改为(normalizedCoord.y - 1)(也将缩放固定为3),它看起来已经好多了(我会发布一个小提琴,但似乎jsfiddle 已关闭)。
【解决方案2】:

您似乎遇到了缩放级别问题。通过将 customMapTypeOptions 对象中的 minZoom 和 maxZoom 分别更改为“0”和“2”,并将 mapOptions 对象中的起始缩放设置为“1”,应用程序将图像称为“0-1”、“0-0”、 1-1' 和 '1-0' 加载。

在调查了您列出的 Google 示例后,我注意到当您为他们的地图图块添加 URL 时,会在 url 中包含缩放级别。以下是缩放级别为 0 时调用的一个图块的示例:

http://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/clem_bw/0/0/0.jpg

注意最后三个数字,“.../0/0/0.jpg”。在我放大到缩放级别 1 后,调用的前两个地图图块具有 url:

http://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/clem_bw/1/0/1.jpg
http://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/clem_bw/1/0/0.jpg

注意最后三个数字是如何变化的。我相信第一个数字是图像应显示的缩放级别,然后是地图图块网格中图像位置的 x 和 y。

根据示例代码中的注释:

// tile range in one direction range is dependent on zoom level
// 0 = 1 tile, 1 = 2 tiles, 2 = 4 tiles, 3 = 8 tiles, etc
var tileRange = 1 << zoom;

您将为缩放级别 0 使用单个图像文件(这就是为什么 0-0 是您加载的唯一图像的原因),为缩放级别 1 使用 2 个图像,为缩放级别 2 使用 4 个图像,依此类推。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    相关资源
    最近更新 更多