Showing posts with label Map. Show all posts
Showing posts with label Map. Show all posts

Monday, 22 May 2017

[開發筆記] 離線地圖 Offline Map with GeoServer and Leaflet.js

現在網路地圖應用越來越多,可是很多時候會遇到沒有網路狀況,這個時候Google Map、Open Street Map、 Bind MAP 等等都是無法使用的。
但是我們又不太可能像Google它們一樣架出一個GeoServer然後有很多的圖資,這樣的情況下就需要離線地圖,
我這裡用的是把一張tiff圖檔當底圖,然後架一個geoServer提供給瀏覽器來讀取,架構如下圖
2016-01-22_142209.jpg

下載與安裝GeoServer  (Download & install GeoServer)

Download : http://geoserver.org/download/

下載好後,就跟著下面步驟安裝Following the below steps to install. 

2016-01-18_105550.jpg 
2016-01-18_105641.jpg
這裡你可以修改安裝的目錄路徑 (You can change the install location. I used to install in programs folder. )
2016-01-18_105727.jpg
2016-01-18_105754.jpg
GeoServer需要Java,所以這裡要指定Java的目錄,如果沒有安裝,請點擊URL去下載安裝。
GeoServer安裝程式會確認是否有安裝。
GeoServer need Java. If you did not have it, please down and install java.
2016-01-18_105819.jpg
你可以修改你的圖資目錄的路徑,因為有電腦有存取的權限問題。
2016-01-18_105852.jpg
User account and Password. You can change them if you want. 
2016-01-18_105921.jpg
2016-01-18_105950.jpg
I change the default port number to 8085
GeoServer 是一台網路主機,所以需要port. 我特地修改成8085以免跟其他程式有相沖

2016-01-18_110018.jpg
啟動GeoServer的方式。
It depends on how you like to use GeoServer.
如果你是用來開發測試,建議使用"Run manually" ,手動啟動
If you just install GeoServer for development, I recommend to select “Run manually”
如果你是用來當正式環境運行,建議使用"Install as a service" ,自動啟動

If you just install GeoServer for production environment, select “Install as a service”
2016-01-18_110138.jpg
2016-01-18_110211.jpg
確認沒有問題,就按install
2016-01-18_110229.jpg

2016-01-18_110320.jpg
GeoServer
啟動GeoServer
Start --> All apps --> Start GeoServer
2016-01-21_160932.jpg
A window will pop up, Please wait for that it done.This window cannot be closed
跳出一個視窗,請等他執行完畢。 這個視窗不能關閉
2016-01-21_161209.jpg
GO TO GEOSERVER ADMIN PAGE
開啟GeoServer管理頁面
2016-01-21_164722.jpg
It will redirect to GeoServer Web Admin Page and login into admin page. If you did not change defaulte account and password, it will be admin and geoserver
開啟後就登入 admin 頁面。 如果你沒有改預設帳號跟密碼, 帳號是admin 密碼是geoserver

2016-01-21_165405.jpg
Admin page:
2016-01-21_165725.jpg
Add layer
the next step is to create a layer which we want to display.
The step is : Workplace --> Stores --> Layers
下一步我們要建立一個圖層。順序是 Workplace --> Stores --> Layers
Create a Workplace
Select “Workspace” on left menu
在左選單上選 “Workspace”
2016-01-21_170004.jpg
Click “Add new workspace”
點擊 “Add new workspace”
2016-01-21_170446.jpg
Type in the Name and Namespace URL

They are just a name. I don’t know what Namespace URL use for.
輸入你要的名稱和 Namespace URL(隨你意思取)
2016-01-21_170645.jpg
Create a STORE
Select store on the left menu

Click “Add new Store”
在左選單上選"Store "
點擊 “Add new Store”
2016-01-21_183805.jpg
Click “GeoTIFF”
點擊 “GeoTIFF”
2016-01-21_183931.jpg
Fill up the Basic Store Info and then click “Save” button
Workspace : hoc
Data Source Name: singapore map
URL : file://C:\MapData\SG\SG.tif  (select a image file you want to show)

Enable “Enabled”
2016-01-22.png 
click publish
點擊"Publish"
2016-01-18_133645.jpg 
Edit Layer
2016-01-18_133831.jpg
Save it without change
直接儲存不用修改
2016-01-18_133920.jpg
VIEW LAYER 檢視圖層
Select “Layer Preview” on the left menu and click "OpenLayers"
左選單上選 “Layer Preview” and 點擊 "OpenLayers"
2016-01-22_093249.jpg
A window will pop up 
檢視視窗就出現,等圖片出來
2016-01-22_094106.jpg
LEFTLET & GEOSERVER
Download example file : https://github.com/kennethhutw/OfflineMapWithGeoSe...
下載範例檔: https://github.com/kennethhutw/OfflineMapWithGeoServerAndLeaflet
 
<!DOCTYPE html>
<html>
<head>
    <title>Leaflet Leaflet with GeoServer Example</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.css" />
</head>
<body>
    <div id="map" style="width: 600px; height: 400px"></div>
    <script src="http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.js"></script>
    <script>
        var map = L.map('map').setView([1.3571318,103.8080804], 13);
        mapLink = '<a href="http://www.kenneth.net">(Kenneth)</a>';
        L.tileLayer.wms("http://localhost:8080/geoserver/hoc/wms", {
                layers: 'hoc:SG',
                format: 'image/png',
                transparent: true,
                version: '1.1.0',
                attribution: "Hu ChiaWei "+mapLink
            }).addTo(map);    
        L.marker([1.3571318,103.8080804]).addTo(map)
            .bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup();
        var popup = L.popup();
        function onMapClick(e) {
            popup
                .setLatLng(e.latlng)
                .setContent("You clicked the map at " + e.latlng.toString())
                .openOn(map);
        }
        map.on('click', onMapClick);
    </script>
</body>
</html>
Result
2016-01-22_160213.jpg 

製作地圖 - QGIS

在你需要製作一張可供列印或出版的地圖時,QGIS 提供了一組稱為「地圖出版設計」(Print Composer)的強大工具,它可以方便地把所有的圖層打包起來產生完整的地圖。

內容說明

本教學示範如何製作一張包含基本製圖元素的日本地圖,像是網格線、方位標示、比例尺、圖例與標籤、插頁小圖等等。

你還會學到這些

  • 使用「即時 CRS 轉換」把在不同空間投影下儲存的資料統一呈現

取得資料

這邊使用的是 Natural Earth dataset 中的 Natural Earth Quick Start Kit ,這些資料已經整理得相當不錯,而且可以直接載入到 QGIS 當中。
資料來源 [NATURALEARTH]

操作流程

  1. 下載 Natural Earth Quick Start Kit 資料並解壓縮。開啟 QGIS,點選 專案 ‣ 開啟
2016-03-08_153520.jpg
  1. 進入到 Natural Earth Quick Start Kit 解壓過的資料夾後,應該能找到一個叫 Natural_Earth_quick_start_for_QGIS.qgs 的檔案。這就是所謂的「QGIS 專案檔」,通常會一併含有許多圖層的資料。按下 開啟
2016-03-08_153813.jpg
  1. 然後專案內含的圖層就會被載入到 QGIS 的畫布上。如果畫布上方出現了藍色的警告訊息,點右邊的叉叉取消即可。
../_images/323.png
  1. 接下來我們就要製作台灣地圖了。點選 放大 鈕後在台灣附近畫個長方形出來,地圖會放大到此範圍。
../_images/417.png
  1. 你可以關掉某些我們用不到的圖層,例如 10m_geography_marine_polys 和 10m_admin_0_map_units,只要把他們的勾選取消掉就行了。

2016-03-08_155809.jpg
  1. 現在就可以開始拼湊地圖了!點選 專案 ‣ 建立地圖出版設計
2016-03-07_105713.jpg
  1. 會有一個視窗跳出來要求你輸入設計標題,這邊可以先空著,點確定即可。
註解
如果標題是空白的話,程式會自動產生一個像是 標題設計 1 的預設標題。
../_images/815.png
  1. 2016-03-07_105854.jpg
    2016-03-07_105929.jpg
  2. 在地圖出版設計的視窗中,首先先點選 全圖顯示 以確定你看到的是整張地圖的範圍。然後我們要把在 QGIS 畫布中的東西放進來,請選擇 圖層 ‣ 加入地圖
2016-03-07_105959.jpg
  1. 加入地圖按鈕啟動之後,必須要在地圖版面上拖曳一塊你想插入地圖的區域。
2016-03-08_170318.jpg
  1. 你會看到這個區域馬上就填上了 QGIS 畫布中的東西。不過它未必會跟我們所要的製圖區域完全重合,這個時候可以選擇 圖層 ‣ 移動內容,然後直接把在這個區域裡的東西拖曳到你所想要的範圍。
2016-03-07_110142.jpg
  1. 地圖的比例尺也可以稍做調整,在右側的項目屬性分頁中的比例欄位輸入1530000 看看。
2016-03-07_130621.jpg
  1. 接下來我們會插入一個台北區域的放大版地圖,不過在進行任何更動之前,要把已經弄好的底圖給鎖起來。請勾選 為地圖項目鎖定圖層 以及 Lock layer styles for map item,這兩個選項是用來確保接下來在 QGIS 畫布上的更動,不會連帶影響到設計視窗中已經弄好的部分。
2016-03-07_150701.jpg
  1. 切換到 QGIS 視窗,使用放大鈕放大到台北市周圍。
2016-03-08_180951.jpg
  1. 這個 ne_10m_populated_places 圖層有一些重複的地名標籤,你可以把它關掉。
2016-03-08_181014.jpg
  1. 接下來就可以弄插頁小圖了。切換到 地圖出版設計 視窗,然後選擇 圖層 ‣ 加入地圖
2016-03-07_152738.jpg
  1. 在你想要插入台北區域地圖的地方拉一個長方形即可。現在我們有 2 個地圖物件在同一個設計稿上了,所以如果你要改動其中任意一個地圖,就要先確認正確的地圖物件有沒有被選取起來。在 項目 分頁中,請選擇我們剛剛加入的 地圖 1 物件,然後在 項目屬性分頁中,往下捲動到 框線 的欄位,把那個框框勾起來,這樣我們就能自由調整小插圖的外框,使之與主要地圖區隔開以方便辨識。
2016-03-07_151011.jpg
  1. 這裡有個很方便的功能,可以幫你標示小插圖是位在主地圖的哪裡。首先在 項目 分頁中選擇 地圖 0,然後在 項目屬性 分頁中,往下捲動到 全覽圖 的欄位,點選 新增全覽圖 的按鈕。
2016-03-07_151119.jpg
  1. 在 圖框 選單中選擇 地圖 1,就可以把 地圖 1 的小圖範圍標示在 地圖 0 中。
2016-03-07_151256.jpg
  1. 現在插頁小圖也完成了,下一步就來加個格線和斑馬框(Zebra Border)到主地圖上。在 項目 分頁中選擇 地圖 0,然後在 項目屬性 分頁中,往下捲動到 格線 的欄位,點選 加入格線 的按鈕。
2016-03-07_151119.jpg
  1. 在預設的情形中,格線會使用與選擇的地圖相同的投影法標示,不過使用「經緯度」標示的格線卻更常見,而且使用者也易於閱讀。所以這裡我們來為格線選擇一個不同的 CRS 試試看。請點選格線欄位中,CRS 右側的 變更... 按鈕。
2016-03-07_151447.jpg
  1. 選擇座標參考系統 的視窗會跳出,在 過濾條件 內輸入 4326,然後選擇 WGS84 EPSG:4326 當作格線的 CRS,按下確定
2016-03-07_151423.jpg
  1. 在 區間 欄位中,把 X 和 Y 都設成 5 度,然後再適當的調整偏移,就可以設定格線要在哪出現。
2016-03-07_151723.jpg
  1. 往下移到 格線框 的欄位,就可以選擇你喜歡的邊框樣式。再更下面,還可以順便勾選 繪製座標
2016-03-07_151855.jpg
  1. 調整 與地圖圖框之距離,可以使這些座標文字易於閱讀;而調整 座標精確度 到 1,則可以讓這些座標只顯示到小數點以下第 1位。
2016-03-07_151958.jpg
  1. 再來就是加個指北箭頭。QGIS 的出圖設計功能本身有內建一些不錯的現成圖片,其中當然也包括許多種類的指北箭頭,只要選擇圖層 ‣ 加入圖片
2016-03-07_152030.jpg
  1. 用滑鼠左鍵在地圖右上角拖曳出一個方形,然後在右側的 項目屬性 中把 搜尋資料夾 點開,就可以選擇你喜歡的圖案了。
2016-03-07_152203.jpg
  1. 再加個比例尺好了。選擇 圖層 ‣ 加入比例尺
2016-03-07_152258.jpg
  1. 在你想要比例尺出現的地方按一下,記得在 項目屬性 中確認這個比例尺顯示的是主地圖的比例尺,而不是插頁小圖的比例尺。各種你想要的設定都可以在這邊調整,例如在 線段 的欄位中,可以調整黑白線段的數量以及尺寸。
2016-03-07_152606.jpg
  1. 總算到了上標題的時間!選擇 圖層 ‣ 加入標記
2016-03-07_152738.jpg
  1. 在地圖上拖曳標籤的範圍,接著展開 項目屬性 中的 標記 欄位,然後輸入如下文字試試。沒錯,這是 HTML 語法,只要勾選 繪製成 HTML 的選項後,它就會使用 HTML 標籤解讀這些文字。
<div align=center>
<h1>Map of Tawain by Kenneth</h1>
</div>
2016-03-07_153016.jpg
  1. 我們簡單的再加上資料來源以及製圖使用軟體的標籤。
  2. 2016-03-07_153016.jpg
  3. 當你把地圖調整到最佳狀態後,就可以輸出成圖片檔、PDF 或是 SVG 檔了。這裡我們試試看轉存成圖片檔:選擇 地圖設計 ‣ 匯出為影像
    2016-03-07_153149.jpg

  1. 存成任一種你喜歡的格式即可。這裡放的是存成 PNG 的圖片。
Taiwanmap.tiff

how-to-recursively-create-subfolder-in-each-folder-of-a-directory-in-cmd

test.cmd: @echo off setlocal for /f "usebackq tokens=*" %%a in (`dir /b /a:d`) do ( rem enter the directory pushd %%a echo...