使用 Bing Maps Quadkeys 作为 Openlayers 3 Tile 源

2023-12-04

我有许多图块源,它们在旧的 Silverlight 应用程序中使用 Bing Maps 的 Quadkey 系统,我想在新的 Openlayers 3 地图中使用它们。

我找到了几个函数示例,这些函数会将这些源转换为 Leaflet.js,但 OL3 的语法有些不同,阅读 API 文档表明有一个 ol.Tile.coord 类,但如果我理解正确的话,这是一个实验性的功能,并且可能需要从源代码进行自定义构建。

GitHub 页面上有对此类功能的引用,但我不知道是否必须使用此源编译构建:https://github.com/openlayers/ol3/blob/5c5364bbb7e8df76f18242ad665c87ca08a76e76/src/ol/source/bingmapssource.js

任何人都可以提供这种类型转换的示例,或者确实有人知道最新(3.8.2)版本的 OL3 是否支持四键方法?

这是传单示例:

var BingLayer = L.TileLayer.extend({
getTileUrl: function (tilePoint) {
    this._adjustTilePoint(tilePoint);
    return L.Util.template(this._url, {
        s: this._getSubdomain(tilePoint),
        q: this._quadKey(tilePoint.x, tilePoint.y, this._getZoomForUrl())
    });
},
_quadKey: function (x, y, z) {
    var quadKey = [];
    for (var i = z; i > 0; i--) {
        var digit = '0';
        var mask = 1 << (i - 1);
        if ((x & mask) != 0) {
            digit++;
        }
        if ((y & mask) != 0) {
            digit++;
            digit++;
        }
        quadKey.push(digit);
    }
    return quadKey.join('');
}
});

这是现有的 Silverlight 代码:

public override Uri GetUri(int x, int y, int zoomLevel, bool getPrintLink)
    {
        Uri uri = null;
        if (this.Covers(x, y, zoomLevel))
        {
            QuadKey qk = new QuadKey(x, y, zoomLevel);
            if (getPrintLink)
            {
                uri = new Uri(this.CurrentHostURL + "/tiles/NL/" + zoomLevel.ToString() + "/" + qk.Key + ".ipic", UriKind.RelativeOrAbsolute);
            }
            else
            {
                uri = new Uri("http://tileserver.satmap.com/NL/" + zoomLevel.ToString() + "/" + qk.Key + ".ipic", UriKind.RelativeOrAbsolute);
            }
        }
        return uri;
    }

任何见解将不胜感激,因为我已经浏览了许多论坛和无数页的搜索结果,但没有找到解决方案。


据我所知,您的 _quadKey 函数是正确的。可能出现的问题是理解ol.TileCoord提供给 URL 函数。

在 OpenLayers 3.7 及更高版本中,所有TileCoords 以左上角为原点计算。此外,X和Y坐标都会自然增加,因此TileCoord的X和Y坐标对应于二维轴的正常概念。

给定缩放级别的左上角图块将始终具有 X=0 和 Y=-1。下面的图块将具有 X=0 和 Y=-2; Y 永远为负数。

某些地图应用程序(例如 Bing)也使用左上角作为图块原点,但让Y坐标向下增加。左上角的图块将是 X=0 和 Y=0,而下面的图块将是 X=0 和 Y=1。

为了计算四键,必须反转 Y 坐标并调整 1。这应该有效:

// this is unchanged from the question
var quadkey = function (x, y, z) {
    var quadKey = [];
    for (var i = z; i > 0; i--) {
        var digit = '0';
        var mask = 1 << (i - 1);
        if ((x & mask) != 0) {
            digit++;
        }
        if ((y & mask) != 0) {
            digit++;
            digit++;
        }
        quadKey.push(digit);
    }
    return quadKey.join('');
};

var quadKeyLayer = new ol.layer.Tile({
    source: new ol.source.XYZ({
        maxZoom: 19,
        tileUrlFunction: function (tileCoord, pixelRatio, projection) {
            var z = tileCoord[0];
            var x = tileCoord[1];
            var y = -tileCoord[2] - 1;
            return "//example.com/r" + quadkey(x, y, z);
        }
    })
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Bing Maps Quadkeys 作为 Openlayers 3 Tile 源 的相关文章

  • 使用 Bing Maps Quadkeys 作为 Openlayers 3 Tile 源

    我有许多图块源 它们在旧的 Silverlight 应用程序中使用 Bing Maps 的 Quadkey 系统 我想在新的 Openlayers 3 地图中使用它们 我找到了几个函数示例 这些函数会将这些源转换为 Leaflet js 但
  • Bing 地图 V8 - 未捕获的引用错误:Microsoft 未定义

    我在我的应用程序中使用 bing 地图进行搜索 必应地图V8控件 我用过这个CDN 之后当我尝试使用 Microsoft Maps 时 它是在说 Uncaught ReferenceError Microsoft is not define
  • 清单引用文件“Bing.Maps.dll”,该文件不是有效负载的一部分

    错误 1 清单引用文件 Bing Maps dll 该文件不是有效负载的一部分 C Users xxx Desktop xxx Applicationxx Applicationxx Package appxmanifest Applica
  • 在 Windows Phone 8 中使用 Google 地图

    可以在 Windows Phone 8 中使用 Google 地图吗 这个问题可能看起来很奇怪 因为互联网上有很多关于这个问题的帖子 但在实践中 我遇到了现实的问题 我知道使用 Google 地图 使用 MapTileLayer TileS
  • 将平铺 Google 地图与 OpenLayers 3 结合使用

    如何将 google 地图与 OpenLayers 3 一起使用 我想从 OpenLayers 2 迁移到 3 这是一个例子 谷歌地图与 OpenLayers 集成示例 http openlayers org en v3 0 0 examp
  • Bing 地图 Ajax API - 从地址获取位置

    我正在使用 Microsoft Maps API AJAX 控件 v 7 我想显示地址的 pin 当我使用时 var loc new Microsoft Maps Location 47 592 122 332 var pOptions i
  • ol.interaction.Select 在 ol.source.VectorTile 上给出错误

    我试图在选择 VectorTile 图层后更改该功能的样式 但是 第一次触发选择交互时 控制台会报告错误 Uncaught TypeError feature getId is not a function at ol source Vec
  • 图钉调整绑定缩放级别大小

    我将 WinRT 与 bing 地图结合使用 并尝试在缩放地图时设置 以编程方式 图钉的 RenderTransform 值 我试过这个Solution http social msdn microsoft com Forums en US
  • 解构 Open Layers 3 地图

    所以 我使用 Open Layers 3 和 Ember js 来制作仪表板 并且我已经动态加载地图 但我希望它在我离开路线时被销毁 我发现的唯一东西是 map destroy 但它是针对旧版本的API 新版本中似乎没有 进入地图页面几次后
  • WP7,将服务引用添加到 Visual Studio 2010 后如何使用服务引用

    我按照以下示例连接到 Bing 地图地理编码服务 Link https learn microsoft com en us archive blogs dragoman wp7 code reverse geocoding with the
  • div 下面仍然触发 click 事件

    这是我正在构建的 PhoneGap 应用程序 我正在我的笔记本电脑上进行测试 然后使用 PhoneGap cli 在 iPhone 上进行测试 我有一个 openlayers 3 地图 上面记录了点击事件 我还有一个 div 当菜单显示时
  • Bing 地图 - 悬停时突出显示带有多边形的国家/地区

    我正在使用 silverlight Bing 地图控件 我想在用鼠标光标悬停它后突出显示国家 大陆 除了提供多边形坐标之外 还有更好的方法吗 如果我想强调世界上所有国家 那就太费功夫了 我认为应该有某种现成的解决方案 但我找不到 不 除了提
  • 在 XAML 中绑定 MapIcon

    我正在尝试使用 MapControl 显示当前查看位置的 MapIcon 在我的 XAML 中 我有
  • Openlayers 3 将 EPSG:4326 矢量重新投影到 EPSG:3857

    我需要将 GeoJSON 矢量数据从 EPSG 4326 转换为 EPSG 3857 我有一张地图 var olMapDiv document getElementById olmap control map new ol Map targ
  • 纯Python四叉树实现

    All 有一些使用 Python 实现四叉树的示例 但我的问题是 有谁知道用纯 python 编写的类 在单个 py 文件中 我可以轻松地将其包含在我的项目中 这里列出了三个最受欢迎的软件包这些四叉树库中的任何一个都好吗 https sta
  • 四叉树和Kd树

    我有一组不同位置的纬度和经度 也知道我当前位置的纬度和经度 我必须找出距离当前位置最近的地方 Kdtree 和四叉树中哪种算法最适合从纬度和经度集合中找出邻居位置 一种相对于另一种有什么优势 我们如何在 C 中将这些实现到算法中以实现上述目
  • 如何根据纬度和经度获取国家名称

    如何使用 C 从纬度和经度获取国家 地区名称 我正在使用 Bing Map API Location location12 new Location location Latitude location Longitude MapLayer
  • 如何在 OpenLayers 3 中删除监听器

    我做了一个copy https gis stackexchange com questions 178222 how to delete a listener in openlayers 3我在 stackoverflow 上提出的问题 因
  • 使用canvas.toDataURL时如何设置crossOrigin属性?

    因此 我尝试为我正在构建的 OpenLayers 3 应用程序创建打印地图函数 我知道他们example http openlayers org en v3 8 2 examples export map html但每当我尝试使用它时 我都
  • iPhone 中使用 Bing 地图的方向和路线

    我们可以在 iPhone 中加载 Bing 地图并通过一些航点显示源点和目的地点之间的路线吗 查看route me 项目 route me http code google com p route me 这支持各种地图 包括Bing地图 的

随机推荐