Cesium中文網(wǎng)——如何開發(fā)一款地圖下載工具[一]

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ā)語言,它支持:

  1. 文件網(wǎng)絡(luò)下載。
  2. 文件IO,本地文件夾及文件的讀寫。
  3. 多線程。
  4. 桌面窗體,最好具有瀏覽器控件。

一般來說,現(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);
}

瓦片圖批量下載

接下來我們要做的是:

  1. 批量地生成下載URL
  2. 循環(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é)果

下一步

  1. 當(dāng)前代碼只適合下載層級較小的情況,一旦層級較大,需要下載的圖片非常多。此處需要使用多線程,甚至多臺機(jī)器。
  2. 可以看到下載下來的圖片和很多純黑圖片,這可能是我們的生成規(guī)則不太好。
  3. 目前瀏覽器控件和軟件還未做到聯(lián)動,不能實(shí)時勾選區(qū)域進(jìn)行下載。
  4. 后續(xù)可能涉及圖片拼接的處理。
  5. 當(dāng)加載進(jìn)具體的平臺的時候,可能需要進(jìn)行坐標(biāo)系變化處理。
  6. 下載間隔的自動控制,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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。