当前位置: 首页 > Web前端 > JavaScript

OpenLayers6学习笔记(三)——瓦片地图基础知识

时间:2023-03-27 00:20:00 JavaScript

1.数据加载OpenLayers地图数据是通过图层(Layer)来组织和渲染的,通过数据源(Source)来设置具体的地图数据源。Layer可以看作是渲染地图的容器。具体数据需要通过Source设置。Source和Layer是一对一的关系。源必须有层。根据数据源(Source),地图数据可以分为Image、Tile、Vector三种数据源,分别对应地图图层中Image、Tile、Vector三种图层的设置(层)。其中,矢量图层Vector使用Style来设置矢量图元素的渲染方式和外观。Tile类是瓦片的抽象基类,其子类作为各种瓦片数据的数据源。Vector类是矢量数据源的基类,为矢量图层提供具体的数据源,包括直接组织或读取矢量数据(Features)、来自远程数据源的矢量数据(即通过url设置数据源路径)、etc.Image类是单图基类,其子类有canvas(画布)元素、服务器图片、单张静态图片、WMS单图等2.ol.source.Tile由于一些历史问题,多服务提供者、多种标准等诸多原因,要支持世界上大部分的瓦片数据,就需要针对这些差异(主要是瓦片坐标系不同,分辨率不同等)提供对不同瓦片数据源的支持,ol.source。Tile大致可以分为几类:在线服务源:如ol.source.BingMaps(微软提供的Bing在线地图数据)、ol.source。Stamen(由Stamen提供的在线地图数据)等,无需自己的地图服务器即可直接使用。支持协议标准的源:如ol.source.TileArcGISRest、ol.source.WMTS、ol.source.TileJSON等,如果要使用,必须学习相应的协议,找到支持这些协议的服务器提供数据源(server可以是地图服务商提供的地图服务器,也可以是自己搭建的)。ol.source.XYZ:目前很多地图服务都支持XYZ请求,应用广泛,简单易学。3、瓦片坐标系瓦片坐标系是瓦片地图的组织参照系,它规定了每个瓦片的行号、列号和层号。OpenLayers提供了一个ol.source.TileDebug类用于调试瓦片坐标系。有了这个类,你就可以清楚的看到每一个瓦片的坐标。importReact,{useEffect}from'react';import{Map,View}from'ol';importTileLayerfrom'ol/layer/Tile';importTileDebugfrom'ol/source/TileDebug';import{defaults}from'ol/control';从'ol/proj'导入{fromLonLat};从'ol/source/OSM'导入OSM;导入'ol/ol.css';导出默认函数Index(){useEffect(()=>{//初始化地图initMap();},[])/***初始化地图*/constinitMap=()=>{letosmSource=newOSM();newMap({//挂载到div容器中id为maptarget的对象:'map',//设置地图层layers:[//创建一个使用OpenStreetMapmapsource的瓦片层newTileLayer({source:osmSource}),//创建显示OpenStreetMapTile网格层的地图源newTileLayer({source:newTileDebug({//WebMercatorprojectioncoordinatesystemprojection:'EPSG:3857',//获取OpenStreetMap的tile坐标系mapsourcetileGrid:osmSource.getTileGrid()})})],//设置地图视图view:newView({//将空间参考系统设置为'EPSG:3857'projection:'EPSG:3857',//地图的显示中心center:fromLonLat([0,0]),//地图的显示级别zoom:3}),controls:defaults({//去掉属性控件attribution:false,//去掉缩放控件zoom:false,//去掉旋转控件rotate:false})})}return(

)}第一个数字是水平z,第二个数字是经度方向的x(列号),第三个数字是y(行号)在纬度方向)4.分辨率4.1分辨率介绍分辨率的简单定义就是屏幕上1个像素表示的现实世界中地面上的实际距离。以OpenStreetMap在线地图为例,level0使用1个tile,level1使用4个tile。通过计算可知,第0级整张地球图像的大小为256×256像素,第1级整张地球图像的大小为512×512像素。0级和1级代表的地球范围是一样的(经度[-180°,180°],纬度[-90°,90°])。0级时,一个像素表示水平方向的360°÷256=1.40625°的经度范围,垂直方向的180°÷256=0.703125°的纬度范围。这两个数字就是分辨率,即一个像素所代表的现实世界的范围,可以是度(地理坐标系)、米(投影坐标系)或其他单位。4.2Web墨卡托投影坐标系的分辨率。WebGIS中使用的在线瓦片地图采用Web墨卡托(Mercator)投影坐标系(OpenLayers默认使用EPSG:3857)。投影后整个地球是一个正方形,范围为经度[-180°,180°],纬度[-85°,85°],单位为度。对应的Web墨卡托投影坐标系范围为x[-20037508.3427892,20037508.3427892],y[-20037508.3427892,20037508.3427892],计算x和y方向各层级瓦片地图分辨率的公式可概括为:分辨率=范围÷(256×2^z)。rang:表示x方向或y方向的整个范围,如20037508.3427892×2。256:表示??瓦片的边长,单位为像素。2^z:表示层级z下x或y方向的瓦片数。4.3获取OpenLayers使用的默认分辨率'ol/control';从'ol/proj'导入{fromLonLat};从'ol/source/OSM'导入OSM;从'ol/Observable'导入{unByKey};导入'ol/ol.css';导入样式from'./index.less';exportdefaultfunctionIndex(){//mapconstmap=useRef();//当前级别const[zoom,setZoom]=useState(3);//当前分辨率const[resolution,setResolution]=useState(19567.8792);useEffect(()=>{//初始化地图initMap();//绑定视图事件constresolutionChange=map.current.getView().on('change:resolution',resolutionChangeEvent);return()=>{//取消绑定视图事件unByKey(resolutionChange);}},[])/***初始化地图*/constinitMap=()=>{map.current=newMap({//挂载到id为div的容器maptarget:'map',//设置地图图层layers:[//使用OpenStreetM创建图层apmapsourcenewTileLayer({source:newOSM()})],//设置地图视图view:newView({//设置空间参考系统为'EPSG:3857'projection:'EPSG:3857',//地图中心的显示中心:fromLonLat([0,0]),//地图的显示级别zoom:zoom,//设置缩放级别为整数constrainResolution:true,//关闭无级缩放贴图smoothResolutionConstraint:false}),controls:defaults({//去掉属性控件attribution:false,//去掉缩放控件zoom:false,//去掉旋转控件rotate:false})})}/***分辨率改变事件*/constresolutionChangeEvent=()=>{letzoom=parseInt(map.current.getView().getZoom());让分辨率=map.current.getView().getResolution().toFixed(4);设置缩放(缩放);设置分辨率(分辨率);}return(
级别:{zoom}分辨率:{resolution}
)}4.4比例尺比例尺是指地图上的距离与实际距离的比值。在计算地图的比例尺时,需要地面分辨率和屏幕分辨率两个参数。屏幕分辨率是指屏幕上每英寸(1英寸=0.0254米)的像素点数,默认为96。计算公式为:scale=0.0254÷(resolution×96)4.5OpenLayers默认分辨率,比例表图像水平地图宽高(单位:像素)地面分辨率(单位:米/像素)地图比例(基于96dpi)151278,271.51701:295,829,355.452102439,135.75851:147,914,677.733204819,567.87921:73,957,338.86440969,783.93961:36,978,669.43581924,891.96981:18,489,334.72616,3842,445.98491:9,244,667.36732,7681,222.99251:4,622,333.68865,536611.49621:2,311,166.849131,072305.74811:1,155,583.4210262,144152.87411;577,791.7111524,28876.43701:288,895.85121,048,57638.21851:144,447.93132,097,15219.10931:72,223.96144,194,3049.55461:36,111.98158,388,6084.77731:18,055.991616,777,2162.38871:9,028.001733,554,4321.19431:4,514.001867,108,8640.59721:2,257.0019134,271,7280.29861:1,128.5020268,435,4560.14931:564.2521536,870,9120.07461:282.12221,073,741,8240.03731:141.06232,147,483,6480.01871:70.53Referencearticle:OpenLayersTutorial8:Multi-sourceDataLoadingPrincipleofDataOrganizationOpenLayersDataLoadingTutorial9:Tutorial10:多源数据加载瓦片地图原理2