這個是真的學習筆記!不是教程
基於openlayers 6.x
api不太好查,就基於騰訊課堂老胡的課做記錄。
openlayers與arcgis jsapi最大的不同,喜歡用setXXX/getXXX這種非常具有“java/C++”風格的封裝方法來封裝對象的屬性,arcgis jsapi喜歡用類似於C#.NET一樣的屬性訪問;構造時則與arcgis jsapi一樣。
ol支持非常復雜的坐標系(通過proj4支持),僅支持2d,支持使用npm&webpack進行包管理,系原生sdk(arcgis jsapi基於dojo封裝),ol5/6支持es6語法。
ol支持二維數據格式很多,可以是ogc規范的網絡GIS數據服務,可以是獨立的數據文件等;ol支持空間分析擴展,例如d3/turf/jsts。
1. 一組概念 map&view
與arcgis jsapi不同,ol的map對象占據了非常高的位置
[ol.Map]模塊
- 負責數據管理(layers屬性,又叫圖層管理)
- 負責數據渲染(render,並由target屬性綁定dom元素)
- 負責處理交互和觸發事件
- 負責管理控件(controls屬性)
- 負責管理疊加層(overlay屬性)
在ol5中,當Map模塊不足以支撐海量數據時,需要用WebGLMap模塊來加速。在ol6里默認使用WebGL,不存在WebGLMap模塊。
[ol.View]模塊
視圖的意思,負責管理頁面端的視圖參數:
- 縮放等級(zoom屬性)
- 坐標系(projection屬性)
- 中心點(center屬性)
- 旋轉角度(rotation屬性)
- 分辨率
- 范圍框
- ...
2. 數據
ol的數據由layer管理、加載。
layer(圖層)是數據的容器,它負責把別處弄來的數據源(source)“翻譯”成map能渲染的東西。
[ol.layer]模塊
- 承載並解析數據源(source屬性)
- 管理圖層樣式(styles屬性)
- 管理圖層屬性(疊加順序/透明度)
- (補充中)...
常見圖層
- ol.layer.Tile
- ol.layer.Vector
- ol.layer.GeoJson
- ...(補充中)
常見數據源
- ol.source.OSM
- ...
3. 樣式與制圖
有了數據,當然還要給數據加點嫁妝。由第2節得知,style(樣式)由圖層管理。
格網、導出pdf也是制圖的一部分
4. 前端交互
包括ol.interaction這個交互模塊對數據進行交互,也包括前端交互的效果(跳轉、限制等)
5. 坐標系轉換
所有的坐標系概念、定義有關的類均位於ol.proj模塊下。
其中,ol.proj.Projection類代表坐標系統本身的定義,通常使用ProjectionLike字符串來表示。ProjectionLike的意思是類似"EPSG:XXXX"的字符串,EPSG這個專有詞必須大寫,XXXX代表的是坐標系的WKID。
[ol.proj]模塊
主要提供坐標系的轉換等操作,默認是4326和3857的轉換。
- proj.addCoordinateTransforms():添加地理轉換方法
- proj.fromLonLat():將經緯度坐標轉換到目標坐標系的坐標(默認4326到3857)
- proj.get():根據給定ProjectionLike字符串獲取Projection對象
- proj.getTransform():獲取地理轉換方法
- proj.toLonLat():和fromLonLat是反運算
- proj.transform():轉換坐標值,根據給定的原坐標系和目標坐標系,有可能需要地理轉換
- proj.transformExtent():轉換矩形邊界框,參數同transform
[ol.proj.proj4]模塊
需要引入proj4.js庫,通過調用其register方法為頁面注冊一個ol本身沒有的坐標系。
將proj4全局變量傳遞給register()方法后,ol即獲取一個自定義坐標系。proj4全局變量通過defs()方法注冊一個坐標系。
6. 細品矢量數據
可以從各種手段獲取第三和第四層數據,及要素、要素對應的幾何與屬性數據。
7. 高級繪圖與性能優化
這里肯定有WebGL和canvas,但是我不太會也不太擅長。
8. 控件與疊加層
這部分屬於定制、擴展的功能