帶你真正理解web地圖切片規則

?????????很多時候我們即使做完了項目還是對切片規則一知半解,只知道照著例子寫代碼,不理解WMTSCapabilities文件中參數的具體含義,也無法理解切片規則是如何產生的,不知道經緯度切圖和平面切圖的差別是啥,等等種種疑問,下面通過我得介紹希望可以解決你的疑問。


切片前期知識點

常見地圖縮放層級有多少?

答:0-18級別

要想在平面地圖上顯示地球就要用到影像金字塔,什么是影像金字塔了?

答:就是“邊長” 2的冪次方放大18倍,例如第一層級就只有2零次方邊長就是1,總切片數就是1*1,以此類推2的1次方邊長就是2,總切片數量就是兩邊長相乘2*2,然后往下一直分下去,不管是什么切片都遵循這個規則。

下圖所示谷歌XYZ切片層級如下:是1=1*1,4=2*2,16=4*4 依次遞增的,所以我們得到一個答案每個層級的切片數量是固定的!!!

這就是第二層級瓦片加載的樣子,一共四張圖片,2*2

切片相關知識有哪些?

切片大小:256

比例尺:就是實際距離比上切片大小

我們有了上面這些知識可以適當的上代碼了

//這段代碼是openlayer wmts 加載的一段代碼
//(這里是全球切片,所以還差個東西就是初始的原點坐標,
//因為絕大部分圖層我們只想加載指定范圍的切片這個時候就要用到原點坐標(通常就是地圖范圍的左上角))
const projection = getProjection('EPSG:3857'); 
const projectionExtent = projection.getExtent(); //獲取地圖范圍
const width = getWidth(projectionExtent); //獲取地圖寬度
const resolutions = new Array(19); //用來裝比例尺
const matrixIds = new Array(19); //用來放層級
for (let z = 0; z < 19; ++z) {resolutions[z] = width / (256 * Math.pow(2, z)); //比例尺=實際寬度/(切片寬度 * x軸上切片個數)matrixIds[z] = z;
}

我們已經基本清楚了瓦片加載的步驟了,切片和這個是一樣的,就是按照這個把地圖瓦片先切圖,因為切片規則是定死的所以前端加載也是定死的。

或許你還有些疑問就這樣將地圖進行變形和實際差別得多大啊?答是究極大,3857得切片是按照平面投影切得,兩極看起來都比中國大了,那為什么要這樣做?因為簡單!!!!你沒看錯就因為簡單!!!

XYZ切片

其實通過上面得知識我們已經知道XYZ切片得規則了,這里提一嘴就是XYZ里面有個TMS,TMS和XYZ唯一得差別就是原點坐標不同,TMS原點坐標在左下方,所以加載得時候需要注意一下Y值。

wmts切片

1.為什么有wmts?
答案:由于xyz通常是全球切片,然后OGC(一個操蛋得組織,搞些花里胡哨得東西)為了滿足區域切片而定制得規則,其實和xyz是一樣得,唯一得區別是原點坐標可以挪到任意位置了,而xyz通常原點坐標都在全球范圍得左上方,就這一個區別。

請求路徑通常是這樣

https://koordinates-tiles-a.global.ssl.fastly.net/services;key=d740ea02e0c44cafb70dce31a774ca10/tiles/v4/layer=7328,{style}/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}.png

這樣你就很容易得到了他們得對應關系了,甭管wmts,xyz,都是從(0,0)開始加載切片請求方式基本無二樣。

wmts:{TileMatrix}/{TileCol}/{TileRow}.png
xyz:{z}/{x}/{y}.png

下圖介紹了wmts?Capabilities配置文件得具體內容:

wms切片

1.那么問題來了為啥又有wms服務了?

答:因為矢量數據到設置樣式到出圖切片是一個繁瑣得過程,為了簡化這個過程WMS誕生了,可以動態繪制樣式得切片服務,犧牲服務器性能換來得是矢量數據編輯wms立馬反應出來了。既然邏輯是這樣wms就有一些新花樣,例如一張圖片包含所有要素,前端只請求指定范圍,每次地圖位置更新都會去請求一張wms圖片回來,還有一種就是分多張圖片去加載wms服務,這個時候就和xyz,wmts完全不一樣了,這個時候是前端計算范圍,通過范圍和切片大小確定返回得數據和圖片。這個其實比xyz好理解一些,就是按照范圍和圖片大小,樣式后端來繪制圖片。

#wms title 參數如下REQUEST: GetMap
SERVICE: WMS
VERSION: 1.3.0
FORMAT: image/png
STYLES: 
TRANSPARENT: true
LAYERS: topp:states
TILED: true
WIDTH: 256
HEIGHT: 256
CRS: EPSG:3857
BBOX: -13149614.849955441,4383204.9499851465,-12523442.714243278,5009377.08569731

矢量切片

矢量切片其實就是xyz切片,只不過換成了矢量結構得pbf壓縮文件進行傳輸,postgresql數據庫可以對矢量進行生成pbf操作。。。

總結一下

沒什么難的都很簡單,不要想復雜了。。。。當你把知識串起來就知道了。以上。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208794.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Leetcode 39 組合總和

題意理解&#xff1a; 一個 無重復元素 的整數數組 candidates 和一個目標整數 target 從candidates 取數字&#xff0c;使其和 target &#xff0c;有多少種組合&#xff08;candidates 中的 同一個 數字可以 無限制重復被選取&#xff09; 這道題和之前一道組合的區別&am…

Vue學習筆記-Vue3中setup函數注意點

setup編寫示例 <script> import {reactive} from vue export default {name: "DemoVue",props:[xxx,yy,...],setup(props,context){const data reactive({......})//setup必須有返回值return {data,}} } </script>setup執行的時機 在beforeCreate()之…

【51單片機系列】74HC595實現對LED點陣的控制

本文是關于LED點陣的使用&#xff0c;使用74HC595模塊實現對LED點陣的控制。 文章目錄 一、8x8LED點陣的原理1.1 LED點陣顯示原理1.2 LED點陣內部結構圖1.3 開發板上的LED點陣原理圖1.4 74HC595芯片 二、使用74HC595模塊實現流水燈效果三、 使用74HC595模塊控制LED點陣對角線亮…

python基于DeeplabV3Plus開發構建手機屏幕表面缺陷圖像分割識別系統

Deeplab是圖像分割領域非常強大的模型&#xff0c;在前面的博文中我們也進行過很多相應項目的開發實踐&#xff0c;感興趣的話可以自行移步閱讀即可&#xff1a; 《基于DeepLabv3Plus開發構建人臉人像分割系統》 《基于DeepLabV3實踐路面、橋梁、基建裂縫裂痕分割》 《基于D…

【鏈表Linked List】力扣-203 移除鏈表元素

目錄 題目描述 解題過程 題目描述 給你一個鏈表的頭節點 head 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,6,3,4,5,6], val 6 輸出&#xff1a;[1,2,3,4,5…

快速學會繪制Pyqt5中的所有圖(下)

Pyqt5相關文章: 快速掌握Pyqt5的三種主窗口 快速掌握Pyqt5的2種彈簧 快速掌握Pyqt5的5種布局 快速弄懂Pyqt5的5種項目視圖&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4種項目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6種按鈕 快速掌握Pyqt5的10種容器&…

鴻蒙原生應用開發——分布式數據對象

01、什么是分布式數據對象 在可信組網環境下&#xff0c;多個相互組網認證的設備將各自創建的對象加入同一個 sessionId&#xff0c;使得加入的多個數據對象之間可以同步數據&#xff0c;也就是說&#xff0c;當某一數據對象屬性發生變更時&#xff0c;其他數據對象會檢測到這…

讓聰明的車連接智慧的路,C-V2X開啟智慧出行生活

“聰明的車 智慧的路”形容的便是車路協同的智慧交通系統&#xff0c;從具備無鑰匙啟動&#xff0c;智能輔助駕駛和豐富娛樂影音功能的智能網聯汽車&#xff0c;到園區的無人快遞配送車&#xff0c;和開放的城市道路上自動駕駛的公交車、出租車&#xff0c;越來越多的車聯網應用…

thinkphp lists todo

來由&#xff1a; 數據庫的這個字段我想返回成&#xff1a; 新奇的寫法如下&#xff1a; 邏輯層的代碼&#xff1a; public function goodsDetail($goodId){$detail $this->good->where(id, $goodId)->hidden([type_params,user_id])->find();if (!$detail) {ret…

springboot(ssm出租車管理網站 出租車公司管理系統Java系統

springboot(ssm出租車管理網站 出租車公司管理系統Java系統 開發語言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服務器&#xff1a;tomcat 數據庫&#xff1a;mysql 5.7&#xff08;或8.0&#xff09;…

如何使用PostMan進行并發測試?

如何使用PostMan進行并發測試&#xff1f; &#x1f440;(Postman 的 runner 實際上是串行執行的&#xff0c;因此不能作為并發測試&#xff0c; 只是批量測試&#xff0c;本文如下稱為并發的是錯誤的) 文章目錄 如何使用PostMan進行并發測試&#xff1f;POST篇流程Pre-req 腳…

Conda常用命令總結

使用conda或anaconda的小伙伴們都知道&#xff0c;圖形界面時不靠譜的&#xff0c;而在命令行下&#xff0c;所有的操作就會穩定很多&#xff0c;且極少出現問題。因此&#xff0c;熟記conda的命令行就變得十分有用。但對于我這樣近50歲依舊奮斗在代碼第一線的大齡程序員而已&a…

攔截 open調用 (進程白名單,文件白名單)

攔截 open 文章目錄 攔截 open第一個需求文件結構進程白名單文件白名單 測試代碼第一個版本版本二代碼演示 增加一個日志記錄代碼解釋 gcc -shared -fPIC -o libintercept.so intercept.c -ldlLD_PRELOAD./libintercept.so ./processA在Linux中&#xff0c;我們可以使用LD_PREL…

ZooKeeper學習二

ZooKeeper的java客戶端 zk自帶zkclient及Apache開源的Curator Chubby是google的&#xff0c;完全實現paxos算法&#xff0c;不開源&#xff0c;ZooKeeper是chubby的開源實現&#xff0c;使用zab協議&#xff0c;paxos算法的變種。 ZooKeeper常用命令&#xff1a; Is get set …

MySQL:1118 - Row size too large(行大小不能超過 65535 問題)

文章目錄 問題原因問題復現環境 & 版本復現過程 解決方案調整列大小調整列類型 個人簡介 問題 當我們創建表或新增字段時&#xff0c;我們可能遇到下面這個問題&#xff1a; 1118 - Row size too large. The maximum row size for the used table type, not counting BLO…

12.Mysql 多表數據橫向合并和縱向合并

Mysql 函數參考和擴展&#xff1a;Mysql 常用函數和基礎查詢、 Mysql 官網 Mysql 語法執行順序如下&#xff0c;一定要清楚&#xff01;&#xff01;&#xff01;運算符相關&#xff0c;可前往 Mysql 基礎語法和執行順序擴展。 (8) select (9) distinct (11)<columns_name…

【力扣熱題100】287. 尋找重復數(弗洛伊德的烏龜和兔子方法)

【力扣熱題100】287. 尋找重復數 寫在最前面理解解決 "尋找重復數" 問題的算法問題描述弗洛伊德的烏龜和兔子方法為什么這個方法有效&#xff1f; 代碼復雜度 總結回顧 寫在最前面 刷一道力扣熱題100吧 難度中等 https://leetcode.cn/problems/find-the-duplicate-…

HTML 常用表單元素使用以及注解

一、表單的用途 HTML 表單用于收集用戶的輸入信息。 HTML 表單表示文檔中的一個區域&#xff0c;此區域包含交互控件&#xff0c;將用戶收集到的信息發送到 Web 服務器。 一個表單有三個基本組成部分&#xff1a; 表單標簽&#xff1a;這包含了處理表單數據所用的URL以及數據…

vue使用$router.push()或者$router.go(),重新返回上一頁不走生命周期

是因為在App.vue中&#xff0c;vue路由&#xff08;router-view&#xff09;組件使用路由緩存組件(keep-alive)包裹著&#xff0c;導致不重新走生命周期&#xff0c;這樣可以提高運行效率&#xff0c;但有時候&#xff0c;我們需要重新加載生命周期刷新數據。 解決方案&#x…

Java Web應用小案例 - 實現用戶登錄功能

文章目錄 一、使用純JSP方式實現用戶登錄功能&#xff08;一&#xff09;項目概述&#xff08;二&#xff09;實現步驟1、創建Web項目2、創建登錄頁面 二、使用JSPServlet方式實現用戶登錄功能三、使用JSPServletDB方式實現用戶登錄功能 一、使用純JSP方式實現用戶登錄功能 &a…