Cesium中文網(wǎng):http://cesiumcn.org/ | 國內(nèi)快速訪問:http://cesium.coinidea.com/
Cesium中文網(wǎng)的朋友們的其中一個主題是:自己獨(dú)立開發(fā)一款地圖(瓦片圖)下載工具。
這個主題會以拆分若干期以博客文章[所有用戶]+視頻[付費(fèi)用戶]的形式介紹給大家。其中源碼會不斷的提交與更新,Github地址:https://github.com/hujiulin/MapDownloader。源代碼對所有用戶開放,如果大家覺得有益,請輕輕地給一個star進(jìn)行鼓勵。
重劍無鋒,大巧不工。
工具最重將以C#和JavaScript的形式呈現(xiàn)。編程語言只是形式,如何理解內(nèi)部的邏輯和流程,也可以用Java,Python,PHP或其他開發(fā)語言進(jìn)行實(shí)現(xiàn)。
目前開源的工具非常的簡單(簡陋),但是我會定期更新和維護(hù)代碼,大家有什么問題可以在Github上提交issue也可以在公眾號:Cesium中文網(wǎng);QQ群:807482793;論壇:http://cesium.coinidea.com/進(jìn)行留言和提問。
準(zhǔn)備工作
找到自己熟悉的一門開發(fā)語言,它支持:
- 文件網(wǎng)絡(luò)下載。
- 文件IO,本地文件夾及文件的讀寫。
- 多線程。
- 桌面窗體,最好具有瀏覽器控件。
一般來說,現(xiàn)代的開發(fā)語言都支持上述大部分功能。本文選擇的是C#。在整個主題的中部,會引入JavaScript。
瓦片圖服務(wù)器
本文選擇的是百度地圖,其實(shí)大部分的瓦片圖服務(wù)器都會有x, y, z(level)三個參數(shù),百度地圖的URL Pattern是:http://online{0}.map.bdimg.com/onlinelabel/?qt=tile&x={1}&y={2}&z={3}&styles=pl&udt=20200727&scaler=1&p=0
如果我們把x=1, y=1, z=3,在瀏覽器打開上述URL
http://online0.map.bdimg.com/onlinelabel/?qt=tile&x=1&y=1&z=3&styles=pl&udt=20200727&scaler=1&p=0
樣例瓦片圖
瓦片圖下載
既然我們已經(jīng)知道了瓦片圖的生成規(guī)則,那我們只要指定具體的下載鏈接我們就可以下載對應(yīng)的圖片了,C#的核心下載代碼是,這兒代碼可以輕易地在網(wǎng)絡(luò)上搜索到:
private static WebClient wc = null;
private static void initWebClientInstance()
{
if (null == wc)
{
wc = new System.Net.WebClient();
}
}
private static void download(string url, string filename)
{
// Check filename exist or not
if (File.Exists(filename))
{
return;
}
// Create directory
string dir = Path.GetDirectoryName(filename);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
initWebClientInstance();
wc.DownloadFile(url, filename);
}
瓦片圖批量下載
接下來我們要做的是:
- 批量地生成下載URL
- 循環(huán)下載每張瓦片圖
之前提到過地圖的核心思想是四叉樹,所以我們可以再次簡單的處理,認(rèn)為瓦片圖也是四叉樹構(gòu)成的,一共分為18級(網(wǎng)上可查)左右。那么
level | minX~maxX | minY~maxY |
---|---|---|
1 | 1~1 | 1~1 |
2 | 1~2 | 1~2 |
3 | 1~4 | 1~4 |
… | ||
n | 1~2^(n-1) | 1~2^(n-1) |
四叉樹
批量下載的核心代碼如下:
public static void downloadBatch(string urlPattern, string targetFoler, int level)
{
int maxX = (int)Math.Pow(2, level - 1);
int maxY = (int)Math.Pow(2, level - 1);
for (int x = 0; x <= maxX; x++)
{
for (int y = 0; y <= maxY; y++)
{
string url = String.Format(urlPattern, 1, x, y, level);
string filename = Path.Combine(targetFoler, level.ToString(), x.ToString()) + "\\" + y.ToString() + ".png";
download(url, filename);
}
}
}
上述的運(yùn)行代碼肯定能下載,但是有很多問題。將在下一步中進(jìn)行討論。
當(dāng)前軟件界面
下載結(jié)果
下一步
- 當(dāng)前代碼只適合下載層級較小的情況,一旦層級較大,需要下載的圖片非常多。此處需要使用多線程,甚至多臺機(jī)器。
- 可以看到下載下來的圖片和很多純黑圖片,這可能是我們的生成規(guī)則不太好。
- 目前瀏覽器控件和軟件還未做到聯(lián)動,不能實(shí)時勾選區(qū)域進(jìn)行下載。
- 后續(xù)可能涉及圖片拼接的處理。
- 當(dāng)加載進(jìn)具體的平臺的時候,可能需要進(jìn)行坐標(biāo)系變化處理。
- 下載間隔的自動控制,IP的動態(tài)切換。
上面的這些問題將在后續(xù)的文章中進(jìn)行介紹。
聲明
一般來說,地圖服務(wù)器需要很大的存儲資源和帶寬資源,本文僅從學(xué)術(shù)角度和大家探討現(xiàn)在的下載軟件內(nèi)部原理,如有錯誤歡迎大家指正。
Again: Github地址:https://github.com/hujiulin/MapDownloader。源代碼對所有用戶開放,如果大家覺得有益,請輕輕地給一個star進(jìn)行鼓勵。
本文和軟件僅做學(xué)術(shù)交流,嚴(yán)禁用于商業(yè)用途。
Cesium中文網(wǎng)交流QQ群:807482793
Cesium中文網(wǎng):http://cesiumcn.org/ | 國內(nèi)快速訪問:http://cesium.coinidea.com/