2013-03-22 157 views
0

我是OpenStreetMap的相對新手,並且想知道是否有人在給定經度和緯度的圖像切片中生成地圖縮略圖?作爲悉尼的一個例子,澳大利亞可以在lat. 33.8683long. 151.2086找到。我希望能夠從特定縮放級別的圖像切片中爲這些座標生成128x128 png。使用OpenStreetMap生成地圖縮略圖

我以前用過ArcGIS,它有一個專門的服務來完成這樣的任務。我谷歌搜索了很多,目前還沒有發現任何東西OpenStreetMap

我正在使用Java,因此可能想要部署Web服務等功能。

謝謝。

編輯:我應該補充一點,我使用switch2osm.org上的指令來運行我自己的磁貼服務器。

回答

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生成128×128縮略圖大小:

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

快樂的日子。

+0

它會發現瓷磚,但是如何處理座標可能非常接近邊界的事實? – Bulwersator 2014-02-17 16:09:26