在發現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生成128×128縮略圖大小:
Thumbnails.of(new File("tile.png"))
.size(128, 128)
.toFile(new File("thumbnail.png"));
快樂的日子。
它會發現瓷磚,但是如何處理座標可能非常接近邊界的事實? – Bulwersator 2014-02-17 16:09:26