2013-07-31 46 views
1

我正在改變如何從Google Maps API獲取地圖圖像到使用OpenStreetMap Data的MapQuest託管的地圖圖塊。我從谷歌地圖切換,因爲我達到了我沒有預料到的每日請求限制,並且我沒有使用OpenStreet api,因爲雖然他們的數據是免費的,但它們的圖塊有限制,我只需要一張圖片。因此,我在這裏使用MapQuest託管的地圖圖塊。有沒有OpenStreetMap/MapQuest託管的地圖瓷磚屬性我不知道?

我想我明白這一點,但有些事情我希望能夠做到,但無法找到任何文檔。例如,如果可能的話,我希望圖像大小爲500x300,或者至少爲512 * 512(雙面256 * 256,這就是瓷磚的出現)。我也想能夠顯示一個標記。這可能嗎?

我用這個代碼中發現here到我的緯度和經度數據轉換爲x和y座標:

public class slippy { 
public static void main(String[] args) { 
int zoom = 9; 
double lat = 42.8549; 
double lon = -78.863; 
System.out.println("http://otile1.mqcdn.com/tiles/1.0.0/map/" + getTileNumber(lat, lon, zoom) + ".png"); 
} 
public static String getTileNumber(final double lat, final double lon, final 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); 
} 
} 

我用這個代碼來生成兩個鏈接到地圖水牛的;一個放大9,here,一個10,here,中心似乎有所不同。這是使用開源數據的結果還是有我可以使用的屬性?

+1

我認爲混淆是返回地圖圖像的API和返回地圖圖塊的API之間的混淆。目的是用戶(你)將把這些「瓷磚」拼接在一起,例如在一張可愛的地圖上。 @scai建議使用Leaflet等,這將在web上下文中爲您完成。不知道是否有API提供任意大小的圖像... –

+0

@DanS * WMSs *提供此功能。在閱讀您的評論之前,我沒有想過他們。 – scai

回答

5

當然,中心不同。從一個縮放級別到下一個縮放級別,一個tile被「分割」爲四個其他的圖塊。因此,單個瓦片的中心將位於四個瓦片的角落處。使用上述公式,您將始終獲得包含座標的圖塊。但由於瓷磚的性質,它不一定會在瓷磚的中心。對於每個特定的座標,在包含它的給定縮放級別上只有一個圖塊。因此座標可以位於瓦片上的任何位置,而不一定位於中心。

儘管如此,我不太清楚你實際上想要達到什麼。對於displaying tiles (and markers),您只需使用LeafletOpenLayers(或任何其他支持tile概念的庫)。

請注意,MapQuest也有terms of use

編輯:

另一種方法是使用WMS服務,而不是一個TMS這確實瓷磚爲你的大小調整和級聯。使用WMS,您只需定義圍繞您的中心的邊界框和圖像大小。生成的圖像將始終以座標爲中心。 OSM wiki有一個list of OSM WMS servers

不要忘記了解您選擇的WMS服務的使用政策。

+1

感謝您的回答,您的解釋和消息來源幫助我瞭解瓷磚的工作原理。 –