【问题标题】:Can I translate a geojson file into rasterized tiles for consumption by leaflet?我可以将 geojson 文件转换为光栅化图块以供传单使用吗?
【发布时间】:2020-06-18 13:07:16
【问题描述】:

我构建了一个非常简单的地图图块服务器,它提供预渲染的栅格化地图图块,并与传单一起使用:

    [HttpGet]
    public IActionResult GetTile(int z, int x, int y)
    {
        var mainFolder = "C:\\maptiles\\";
        var image = System.IO.File.OpenRead(mainFolder + string.Format("{0}\\{1}\\{2}.png", z, x, y));
        return File(image, "image/png");
    }

我现在需要创建一个单独的端点,它将基于 geojson 文件而不是预渲染的位图将动态生成的位图图块发送回客户端。像这样的:

    [HttpGet]
    public IActionResult GetGeoJsonTile(int z, int x, int y)
    {
        var geoJsonFilePath = "C:\\geojsontiles\\coverage-area.geojson";
        var geoJsonObj = JsonConvert.DeserializeObject(File.ReadAllText(geoJsonFilePath));
        Byte[] imageBytes;

        //RASTERIZE ENTIRE GEOJSON TO BITMAP HERE
        //...

        //CROP AND ZOOM RASTERIZED BITMAP TO FIT x,y,z PARAMS
        //...

        return File(imageBytes, "image/png");
    }

光栅化部分应该相当简单(我认为)。但我挂断的部分是裁剪和缩放。我知道 geojson 文件本质上是一个带有纬度/经度坐标参考的矢量图。我不明白这些纬度/经度坐标如何转换为基于用户与客户端地图交互输入的 x、y、z 坐标。有没有一种方法可以将 geojson 文件中的纬度/经度信息与 x、y、z 输入结合使用来确定缩放的距离以及在哪里裁剪输出的光栅化图像?

另外,我确实意识到传单(和其他客户端)直接支持 geojson 文件。但这不是我的选择。我们使用的 geojson 文件非常大且复杂,在客户端机器上使用时会导致严重的滞后问题。

【问题讨论】:

  • 您找到什么好的解决方案了吗?我现在也有同样的问题

标签: c# image-processing geojson


【解决方案1】:

简答:查看 XYZ 和 TMS 切片编号方案

如果您使用 Leaflet 显示平铺地图,我假设您使用的是 L.tileLayer 对象。在这种情况下,与(x, y, z) 元组对应的实际坐标由"XYZ standard" 给出(如果设置tms: true,则由TMS standard 给出,这只是翻转y 轴)。

From Wikipedia,这个瓷砖系统背后的基本思想是这样的:

  • 图块为 256x256 像素
  • 在最外层的缩放级别为 0 时,整个世界都可以在单个地图图块中呈现。
  • 每个缩放级别在两个维度上都翻倍,因此在放大时单个图块被 4 个图块替换。这意味着对于大多数实际用途而言,大约 22 个缩放级别就足够了。
  • 使用 Web 墨卡托投影,纬度限制在 85 度左右。

The OpenStreetMap Wiki 包含计算图块对应坐标窗口的数学公式,以及多种编程语言(包括 C#)的示例实现。

但请考虑改用现有解决方案

“手工制作”瓷砖切割代码的场景数量有限。如果可以,请尝试使用 GDAL 库(及其随附的 CLI 命令)中的 gdal2tiles.py 命令,方法是从 C# 代码中调用它。您也可以考虑将切片直接托管在单独的“地理空间服务器”中,例如 Geoserver

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 2017-07-25
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    相关资源
    最近更新 更多