在Openlayers中,图层是使用 layer 对象表示的,主要有 WebGLPoints Layer热度图(HeatMap Layer)图片图层(Image Layer)切片图层(Tile Layer)矢量图层(Vector Layer) 五种类型,它们都是继承 Layer 类的。

layer 是各种图层的基类,只用于让子类继承和实现,一般自身不会实例化。只要功能是对 矢量数据栅格数据 的可视化。图层渲染结果的样式,主要与数据渲染的方式有关,与数据源关系不大。

属性

初始化时,所有图层类型都具有如下参数;

  • source:指定了图层的数据来源,图层作用是以一定的样式渲染数据,source则指定了数据。
  • className:图层各个元素的样式
  • opacity:透明度,默认为1,即完全透明
  • visible:是否可见
  • zIndex:图层的叠加次序,默认是0,最底层,如果使用setMap方法添加的图层,zIndex值是Infinity,在最上层
  • extent:图层渲染的区域,即浏览器窗口可见的地图区域。extent是一个矩形范围,格式是[left, bottom, right, top]。为了提升渲染效率和加载速度,extent范围之外的瓦片是不会请求的,当然也不会渲染。
  • minResolution:图层可见的最小分辨率。
  • maxResolution:图层可见的最大分辨率。
  • minZoom:图层可见的最小zoom level。
  • maxZoom:图层可见的最大zoom level。

    各种图层类型

    从渲染发生的地方来看,openlayers的图层主要分为两类:Vector(矢量)和Raster(栅格),矢量图层是指在渲染发生在浏览器的图层,source返回的数据类型是矢量,如geojson的坐标串;栅格图层则是由服务器渲染,返回到浏览器的是一张张的瓦片图片,栅格图层主要是展示。
    矢量图层类型有:

  • Graticule:地图上覆盖的网格标尺图层;

  • HeatMap:热力图;
  • Vector:矢量图;
  • VectorImage:单张的矢量图层;
  • VectorTile:矢量瓦片图层;
  • WebGLPoints:WebGL渲染的海量点图层

栅格图层类型较为简单,只有Tile图层。

WebGLPoint Layer

WebGLPoint Layer是由WebGL作为渲染引擎的点图层。WebGLPoint Layer本质上是矢量图层,在浏览器渲染。

  1. import { Map, View } from 'ol'
  2. import { Tile as TileLayer } from 'ol/layer'
  3. import { OSM } from 'ol/source'
  4. import VectorSource from 'ol/source/Vector'
  5. import { GeoJSON } from 'ol/format'
  6. import WebGLPointsLayer from 'ol/layer/WebGLPoints'
  7. this.map = new Map({
  8. target: 'map',
  9. view: new View({
  10. center: [0, 0],
  11. zoom: 2
  12. }),
  13. layers: [
  14. new TileLayer({
  15. source: new OSM()
  16. })
  17. ]
  18. })
  19. let vectorSource = new VectorSource({
  20. url: 'https://openlayers.org/en/latest/examples/data/geojson/world-cities.geojson',
  21. format: new GeoJSON()
  22. })
  23. let pointLayer = new WebGLPointsLayer({
  24. source: vectorSource,
  25. style: {
  26. symbol: {
  27. symbolType: 'circle',
  28. size: ['interpolate', ['linear'], ['get', 'population'], 40000, 8, 2000000, 28],
  29. color: '#006688',
  30. rotateWithView: false,
  31. offset: [0, 0],
  32. opacity: ['interpolate', ['linear'], ['get', 'population'], 40000, 0.6, 2000000, 0.92]
  33. }
  34. }
  35. })
  36. this.map.addLayer(pointLayer)

image.png

Heatmap Layer

将矢量数据渲染成热度图的类

Image Layer

主要是指服务器端渲染的图像,可能是已经渲染好的图像,或者是每一次请求,都根据请求内容定制化地生成一幅图片,该图层类型支持任意的范围和分辨率。

image.png
用一张图片导出。

  1. import { Map, View } from 'ol'
  2. import ImageLayer from 'ol/layer/Image'
  3. import { ImageArcGISRest } from 'ol/source'
  4. this.map = new Map({
  5. target: 'map',
  6. view: new View({
  7. projection: 'EPSG:4326',
  8. center: [0, 0],
  9. zoom: 1
  10. }),
  11. layers: [
  12. new ImageLayer({
  13. source: new ImageArcGISRest({
  14. url: "http://192.168.1.146:6080/arcgis/rest/services/huangry/chinaDynamic/MapServer"
  15. })
  16. })
  17. ]
  18. })

api:https://openlayers.org/en/latest/apidoc/module-ol_source_ImageArcGISRest-ImageArcGISRest.html
demo:https://openlayers.org/en/latest/examples/arcgis-image.html

Tile Layer

切片地图是比较常用的图层类型,切片的概念,就是利用网格将一幅地图切成大小相等的小正方形。
使用这种加载方式:
image.png
如上图所示,会将一张图片切割成多张小图来显示。

代码:

  1. import { Map, View } from 'ol'
  2. import { Tile as TileLayer } from 'ol/layer'
  3. import TileArcGISRest from 'ol/source/TileArcGISRest'
  4. this.map = new Map({
  5. target: 'map',
  6. view: new View({
  7. projection: 'EPSG:4326',
  8. center: [0, 0],
  9. zoom: 1
  10. }),
  11. layers: [
  12. new TileLayer({
  13. source: new TileArcGISRest({
  14. url: "http://192.168.1.146:6080/arcgis/rest/services/huangry/chinaDynamic/MapServer"
  15. })
  16. })
  17. ]
  18. })

加载切片地图服务(用XYZ的形式)
智商不够用,真的看不懂。。
https://openlayers.org/en/latest/apidoc/module-ol_source_XYZ-XYZ.html

api:https://openlayers.org/en/latest/apidoc/module-ol_source_TileArcGISRest-TileArcGISRest.html

加载arcgis地图服务

不管是动态地图服务还是切片地图服务都可以使用 ImageLayer 或者 TileLayer 来加载。
可以在source中修改导出图片的以下配置:
image.png
例如:

  1. source: new ImageArcGISRest({
  2. url: "http://192.168.1.146:6080/arcgis/rest/services/huangry/chinaDynamic/MapServer",
  3. params: {
  4. layers: "show:1" // 要显示的图层
  5. }
  6. })

与arcgis api for js的一些区别

https://blog.csdn.net/qingyafan/article/details/45950125
OpenLayers 图层(Layers) 详解:https://blog.csdn.net/qingyafan/article/details/45398131