使用OpenStreetMap生成地图缩略图

时间:2013-03-22 00:57:42

标签: java openstreetmap

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

我之前使用过ArcGIS,它为此类任务提供了专门的服务。我已经搜索过相当多的内容,但OpenStreetMap尚未找到任何内容。

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

感谢。

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

1 个答案:

答案 0 :(得分: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"));

快乐的日子。