在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。
-
各种图层类型
从渲染发生的地方来看,openlayers的图层主要分为两类:Vector(矢量)和Raster(栅格),矢量图层是指在渲染发生在浏览器的图层,source返回的数据类型是矢量,如geojson的坐标串;栅格图层则是由服务器渲染,返回到浏览器的是一张张的瓦片图片,栅格图层主要是展示。
矢量图层类型有: Graticule:地图上覆盖的网格标尺图层;
- HeatMap:热力图;
- Vector:矢量图;
- VectorImage:单张的矢量图层;
- VectorTile:矢量瓦片图层;
- WebGLPoints:WebGL渲染的海量点图层
WebGLPoint Layer
WebGLPoint Layer是由WebGL作为渲染引擎的点图层。WebGLPoint Layer本质上是矢量图层,在浏览器渲染。
import { Map, View } from 'ol'
import { Tile as TileLayer } from 'ol/layer'
import { OSM } from 'ol/source'
import VectorSource from 'ol/source/Vector'
import { GeoJSON } from 'ol/format'
import WebGLPointsLayer from 'ol/layer/WebGLPoints'
this.map = new Map({
target: 'map',
view: new View({
center: [0, 0],
zoom: 2
}),
layers: [
new TileLayer({
source: new OSM()
})
]
})
let vectorSource = new VectorSource({
url: 'https://openlayers.org/en/latest/examples/data/geojson/world-cities.geojson',
format: new GeoJSON()
})
let pointLayer = new WebGLPointsLayer({
source: vectorSource,
style: {
symbol: {
symbolType: 'circle',
size: ['interpolate', ['linear'], ['get', 'population'], 40000, 8, 2000000, 28],
color: '#006688',
rotateWithView: false,
offset: [0, 0],
opacity: ['interpolate', ['linear'], ['get', 'population'], 40000, 0.6, 2000000, 0.92]
}
}
})
this.map.addLayer(pointLayer)
Heatmap Layer
Image Layer
主要是指服务器端渲染的图像,可能是已经渲染好的图像,或者是每一次请求,都根据请求内容定制化地生成一幅图片,该图层类型支持任意的范围和分辨率。
用一张图片导出。
import { Map, View } from 'ol'
import ImageLayer from 'ol/layer/Image'
import { ImageArcGISRest } from 'ol/source'
this.map = new Map({
target: 'map',
view: new View({
projection: 'EPSG:4326',
center: [0, 0],
zoom: 1
}),
layers: [
new ImageLayer({
source: new ImageArcGISRest({
url: "http://192.168.1.146:6080/arcgis/rest/services/huangry/chinaDynamic/MapServer"
})
})
]
})
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
切片地图是比较常用的图层类型,切片的概念,就是利用网格将一幅地图切成大小相等的小正方形。
使用这种加载方式:
如上图所示,会将一张图片切割成多张小图来显示。
代码:
import { Map, View } from 'ol'
import { Tile as TileLayer } from 'ol/layer'
import TileArcGISRest from 'ol/source/TileArcGISRest'
this.map = new Map({
target: 'map',
view: new View({
projection: 'EPSG:4326',
center: [0, 0],
zoom: 1
}),
layers: [
new TileLayer({
source: new TileArcGISRest({
url: "http://192.168.1.146:6080/arcgis/rest/services/huangry/chinaDynamic/MapServer"
})
})
]
})
加载切片地图服务(用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中修改导出图片的以下配置:
例如:
source: new ImageArcGISRest({
url: "http://192.168.1.146:6080/arcgis/rest/services/huangry/chinaDynamic/MapServer",
params: {
layers: "show:1" // 要显示的图层
}
})
与arcgis api for js的一些区别
https://blog.csdn.net/qingyafan/article/details/45950125
OpenLayers 图层(Layers) 详解:https://blog.csdn.net/qingyafan/article/details/45398131