使用 EPSG:25832 投影在 Leaflet 中垂直对齐 TMS 图块

2024-02-05

我使用 Leaflet 和 Proj4Leaflet 来处理 25832 中的图块。该应用程序相当简单:我尝试将 EPSG:25832 中的图块叠加到全比例底图上。我已从瓷砖地图元信息中复制了各个分辨率和来源。我面临的问题是地图未对齐,一旦我放大,图块就不会按正确的顺序放置。我很感激这里的任何形式的支持(顺便说一下,this https://www.bmvi.de/DE/Themen/Digitales/Breitbandausbau/Breitbandatlas-Karte/start.html是一个使用 openlayers 的工作示例)。

我想我在这里做错了什么:

// Set resolutions
var resolutions = [156367.7919628329,78183.89598141646,39091.94799070823,19545.973995354114,9772.986997677057,4886.4934988385285,2443.2467494192642,1221.6233747096321,610.8116873548161,305.40584367740803,152.70292183870401,76.35146091935201,38.175730459676004,19.087865229838002,9.543932614919001,4.7719663074595005,2.3859831537297502,1.1929915768648751];

// Define CRS
var rs25832 = new L.Proj.CRS(
    'EPSG:25832',
    proj4rs25832def, 
    {
        origin: [ 273211.2532533697, 6111822.37943825 ],
        resolutions: resolutions
    }
);

...使用来自的瓷砖信息https://mapproxy.bba.atenekom.eu/tms/1.0.0/privat_alle_50_mbit/germany https://mapproxy.bba.atenekom.eu/tms/1.0.0/privat_alle_50_mbit/germany .

然后我添加一个平铺层

var url = 'https://mapproxy.bba.atenekom.eu/tms/1.0.0/privat_alle_50_mbit/germany/{z}/{x}/{y}.png';  

var tileLayer = L.tileLayer(
    url, 
    {
        tms: true,
        crs: rs25832,
        continuousWorld: true,
        maxZoom: resolutions.length
    }
);

并将它们添加到地图中..

// Setup map
var map = L.map('map', {
    crs: rs25832,
    center: [ 50.8805, 7.3389 ],
    zoom:5,
    maxZoom: resolutions.length,
    layers: [ baseWms, tileLayer ]
});

最少的代码可以在这里找到:https://jsfiddle.net/6gcam7w5/8/ https://jsfiddle.net/6gcam7w5/8/


这归结为 Y 坐标如何TMS https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification瓷砖是倒置的(向北时它会变得更高,而不是默认的TileLayers,其中Y坐标向南变大)。

看看处理此特定功能的传单代码 https://github.com/Leaflet/Leaflet/blob/master/src/layer/tile/TileLayer.js#L177-L183将阐明这个问题:

    if (this._map && !this._map.options.crs.infinite) {
        var invertedY = this._globalTileRange.max.y - coords.y;
        if (this.options.tms) {
            data['y'] = invertedY;
        }
        data['-y'] = invertedY;
    }

这里有两件事对于计算图块的正确 Y 坐标至关重要:

  • CRS 必须是有限的(它必须有界限)
  • 必须有一个有限的全局图块范围(在 Leaflet 中是最终定义 https://github.com/Leaflet/Leaflet/blob/e8c28b996179373447dde1df479898576a508579/src/layer/tile/GridLayer.js#L609受 CRS 限制,而不是TileLayer bounds)

长话短说,您的 CRS 应该以已知的界限来定义。对于这种特殊情况,从TMS 能力文档 https://mapproxy.bba.atenekom.eu/tms/1.0.0/privat_alle_50_mbit/germany...

<BoundingBox minx="273211.2532533697" miny="5200000.0" maxx="961083.6232988155" maxy="6111822.37943825"/>

……然后变成了L.Bounds定义Leaflet CRS时的定义,例如...

// Define CRS
var rs25832 = new L.Proj.CRS(
    'EPSG:25832',
    proj4rs25832def, 
    {
        origin: [ 273211.2532533697, 6111822.37943825 ],
        resolutions: resolutions,
        bounds: [[273211.2532533697, 5200000],[961083.6232988155, 6111822.37943825]]
    }
);

东西应该可以正常工作(不需要将 CRS 传递给tilelayers,因为它们都会使用地图),如下所示工作示例 https://jsfiddle.net/qzLhax5r/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 EPSG:25832 投影在 Leaflet 中垂直对齐 TMS 图块 的相关文章

随机推荐

  • 使用 gcc 编译 DLL

    Sooooo我正在写一个脚本解释器 基本上 我希望将一些类和函数存储在 DLL 中 但我希望 DLL 在链接到它的程序中查找函数 例如 program dll send code to dll gt parse code v code co
  • 使用 C# 配置 Wifi 设置

    如何使用 C 紧凑框架 为 Win Mobile 应用程序配置 Wifi 设置 所以交易是 配置网络 隐藏APP的SSID 使用 TKIP 进行 WPA 身份验证 强制用户和密码 不会提示最终用户进行身份验证 看看智能设备框架 http w
  • Android Studio 3 中的“将项目与 gradle 文件同步”按钮在哪里?

    This button disappeared from a new 3 1 version of AS Toolbar Before it showed as 现在不见了 EDIT 他们喜欢继续使用工具栏 从 Android Studio
  • Alertmanager,不同的警报规则有不同的间隔

    我正在使用alertmanager来获取prometheus指标的警报 我对不同的指标有不同的警报规则 是否可以为每个警报规则设置不同的时间间隔 例如对于metric1 我有rule1 我需要每天检查此规则间隔 对于 metric2 我有规
  • EAV 数据库架构

    我有一个包含超过 100K 条记录的数据库 很多类别和很多项目 每个类别具有不同的属性 一切都存储在 EAV 中 如果我尝试打破这个方案并为任何类别创建一个唯一的表 我必须避免什么吗 是的 我知道我可能会有很多表 并且需要更改它们 如果我想
  • Genymotion 错误:在 Yosemite 上“无法加载 VirtualBox 引擎”。已安装 VirtualBox

    我有一台配备 OS X Yosemite 的 Macbook Pro 13 英寸 内存 8 GB 显卡 Intel Iris Graphics 6100 1536 MB 我正在尝试将 Genymotion 设置为 Android 模拟器 我
  • 将一列 int64 (YYYYMMDDHHMMSS) 转换为不带分隔符的 datetime64

    这是我的 pandas 数据框中的数据 我想转换dateTime列成日期时间64这样我就可以检查是否重复fileName存在然后找到最新的文件dateTime 正如你所看到的 这里的日期时间格式是YYYYMMDDDHHMMSS没有分隔符 f
  • jQuery 创建整个 DOM 结构

    TOP TABLE var divTop div className dynamicTableTop html p options name p appendTo obj Create div var divAO div className
  • Chrome 扩展程序——我的源代码可供用户使用吗?

    我即将向 Chrome 网上商店发布我的第一个 Chrome 扩展 他们希望将代码压缩并上传 一旦通过批准 如果我理解正确的话 它将作为 crx 文件提供给用户 但这些 crx 文件是带有 crx 扩展名的简单 zip 文件 对吧 如果这样
  • 在传递给 google.setOnLoadCallback() 的函数中使用参数;

    我正在尝试使用 Google Visualization API 来显示从 MySQL 服务器收集的数据 我想使用 PHP 获取数据 然后将其传递到 javascript 函数调用中以创建图表 当我这样做时 我在将参数传递给传递给 goog
  • 如何使用 Core Graphics 和 CALayer 绘制更精确的线条

    您好 我很难让这个 UI 元素看起来像我想要的那样 看截图 http www study en0de com good not so good jpg 请注意右侧的图像 与左侧的图像 恰好是 safari 的屏幕截图 相比 线条宽度和暗度看
  • 点击 Google Contacts API 时出现“连接被同行重置”错误

    我正在尝试使用 Google Contacts API 将 Google Contacts 拉入 Rails 应用程序 我已完成 Oauth2 握手 现在使用我的访问令牌请求受保护的资源 这是代码 uri URI https www goo
  • 为什么我们需要错误类?

    We have Throwable类是其基类Error类 对于无法恢复的错误 和Exception类 对于可恢复的 errors So 1 gt we can throw一个实现的对象error类 虽然实现没有意义Error类因为我们有Ex
  • 如何在流星中的 DOM 准备好后执行辅助函数

    我有一个清单 li 如下所示 使用 Meteor startup 用 find 填充 然后我得到这些的所有数据属性 li li 使用 data 并将其放入一个对象中并尝试 return console log 它 以便我可以查看它是否有效
  • 使用MPMusicPlayerController,设置musicPlayer.currentPlaybackTime进行seek但需要秒才能生效

    我有一个 UISlider 充当洗涤器 当拖动拇指时 我执行以下操作 void seekTo double playbackTime mPlayer currentPlaybackTime playbackTime 效果很好 音乐寻求前进
  • 无法捕获托管代码中的本机异常

    我有一个混合的 NET 和本机代码控制台应用程序 由于 Visual C 运行时库致命错误 应用程序进程被终止 即使我使用以下内容 托管代码也不会捕获本机异常 尝试 捕获块 AppDomain UnHandledExption 标记Runt
  • C++ 中的内存栅栏/屏障:boost 或其他库有它们吗?

    这些天我正在阅读有关内存栅栏和屏障的内容 作为同步多线程代码和避免代码重新排序的一种方法 我通常在 Linux 操作系统下使用 C 进行开发 并且使用boost大量的库 但我找不到任何与之相关的类 你知道boost中是否存在栅栏的内存屏障或
  • Heroku on Rails - DATABASE_URL 无效

    编辑 一般建议是使用CEDAR stack 对于 RoR Gems Heroku 和 Git 来说还很陌生 以下教程 http ruby railstutorial org book ruby on rails tutorial http
  • 通过 FontAwesome 进行星级评定的 CSS

    我已经通过不同的方法尝试了 CSS 星级评定的一些变体 并且尝试通过 FontAwesome 而不是使用精灵来实现以下内容 我希望能够理想地包含半星 但这就是下面的示例失败的地方 这是我到目前为止所尝试过的 我无法让半 部分星在这里正常工作
  • 使用 EPSG:25832 投影在 Leaflet 中垂直对齐 TMS 图块

    我使用 Leaflet 和 Proj4Leaflet 来处理 25832 中的图块 该应用程序相当简单 我尝试将 EPSG 25832 中的图块叠加到全比例底图上 我已从瓷砖地图元信息中复制了各个分辨率和来源 我面临的问题是地图未对齐 一旦