0

我是OpenStreetMap的相对新手,想知道是否有人有从给定纬度和经度的图像图块生成地图缩略图的经验?例如,可以在lat. 33.8683和找到澳大利亚悉尼long. 151.2086。我希望能够从图像图块中为特定缩放级别的坐标生成 128x128 png。

我以前用过ArcGIS,它有专门的服务来完成这样的任务。我已经用谷歌搜索了很多,但还没有找到任何关于OpenStreetMap.

我正在使用 Java,因此可能希望将此类功能部署为 Web 服务。

谢谢。

编辑:我应该补充一点,我正在运行我自己使用switch2osm.org上的说明构建的磁贴服务器。

4

1 回答 1

2

OpenStreetMap在发现如何存储它的瓷砖后,我想出了这个。基本情况是:

  • 瓷砖是 256 × 256 像素的 PNG 文件
  • 每个缩放级别是一个目录,每一列是一个子目录,该列中的每个图块都是一个文件
  • 访问文件使用http://localhost/osm/${z}/${x}/${y}.png
  • ${z} ${x} and ${y}根据纬度和经度计算值。

OpenStreetMap Wiki上有一些关于此主题的优秀文档,包括用于计算图块名称的各种语言的代码块。我需要一个 Java 解决方案,所以我最终使用的代码是:

public class Mapper
{
    public static void main(String[] args)
    {
        int zoom = 11;
        double lat = -33.77651d;
        double lon = 150.94712d;
        System.out.println("http://localhost/osm/"
            + getTileNumber(lat, lon, zoom) + ".png");
    }

    public static String getTileNumber(double lat, double lon, int zoom)
    {
        int xtile = (int)Math.floor((lon + 180) / 360 * (1<<zoom));
        int ytile = (int)Math.floor((1 - Math.log(Math.tan(Math.toRadians(lat))
            + 1 / Math.cos(Math.toRadians(lat))) / Math.PI) / 2 * (1<<zoom));
        return ("" + zoom + "/" + xtile + "/" + ytile);
    }
}

这将返回所需图像块的 URL,例如:http://localhost/osm/11/1882/1228.png然后您可以使用它来获取图像。然后我使用Thumbnailator生成 128x128 的缩略图大小:

Thumbnails.of(new File("tile.png"))
  .size(128, 128)
  .toFile(new File("thumbnail.png"));

快乐的时光。

于 2013-03-22T22:20:23.200 回答