OpenLayers 开发必须知道的15类方法

1. 图层方法

添加和移除图层方法作为地图对象核心方法,在GIS开发中,可以说贯穿于系统的全生命周期。这两个方法常用于图层控件中,用于控制图层显隐。

添加图层:addLayer

将给定图层添加到地图的顶层。在OpenLayers中添加图层,默认会显示在最上层,与CSS中的属性”z-index”类似,可以通过layer.setZindex(num)更改图层显示顺序。

移除图层:removeLayer

从地图中移除指定图层。

2. 交互控件方法

交互控件在GIS开发中扮演着重要角色,一个没有交互的系统,那是缺少灵魂的系统。在OpenLayers中,图形绘制、要素选择和移动等操作都可以通过交互控件来完成。

添加交互控件:addInteraction

将给定交互控件添加到地图上

移除交互图层:removeInteraction

从地图中移除指定交互控件。

3. 地图控件方法

地图控件在GIS开发中也具有重要地位,合理使用地图控件能够提升开发效率,增加地图可用性。像缩放、全屏、鹰眼图、旋转等控件都是经常使用的。

添加地图控件:addControl

将给定控件添加到地图上

移除地图控件:removeControl

从地图中移除指定地图控件。

4. 获取图层方法

getLayers和getAllLayers都是地图对象属性,虽然都可以获取图层,但是一个获取图层集合,而另一个是获取图层数组。

获取图层集:getLayers

该方法获取的是图层集合,可以通过getArray()方法将其转换为数组。

获取图层组:getAllLayers

该方法从所有图层组中获取所有图层。

通过使用getArray()方法将其转换为数组后,getLayersgetAllLayers方法返回的图层数据结构一致。

5. 要素查询方法

要素查询在GIS开发中是一个必不可少的操作,在不依赖后端的情况下,OpenLayers中提供了至少三种要素查询方法供用户选择。

Map对象属性:forEachFeatureAtPixel

const feature = map.forEachFeatureAtPixel(pixel, feature => feature, {})

检测视口上与像素相交的特征,并对每个相交的特征执行回调。对于没有填充的多边形,只有笔划将用于命中检测。多边形必须应用填充样式,以确保检测到多边形内的像素。填充物可以是透明的。

Map对象属性:getFeaturesAtPixel

检测视口上与像素相交的特征。接收两个参数:第一个参数为事件像素坐标;第二个参数为可选对象。

矢量图层属性:getFeatures(pixel)

接收一个事件像素坐标参数,并返回一个Promise对象。

详情可参考文章:OpenLayers 要素查询的三种方法

6. 量测方法

地图量测在二维中包括距离量测和面积量测,是GIS开发的常用功能。

面积量测:ol.sphere.getArea(polygon)

通过ol.sphere对象的getArea方法计算面积。该方法接收一个几何类型参数,传递面类型几何对象进去即可。

距离量测:ol.sphere.getLength(line)

通过ol.sphere对象的getLength方法计算距离。该方法具有一个几何类型参数,将线几何传递进去即可。

详情可参考文章:OpenLayers 量测合集(距离+面积)

7. 视图中心点方法

跳转到视图中心点是一个基础操作,查询、选中要素时经常需要跳转到要素中心点,或者需要跳转到指定坐标。

View对象属性:centerOn

用于将地图视图中心点快速定位到指定坐标或要素,并支持动态调整视图分辨率(缩放级别)。这是地图交互中的核心导航功能之一。

View对象属性:setCenter

将视图中心定位到给定中心点。

8. 缩放到给定范围方法

fit方法作为View对象核心,具有非常重要的位置。可以通过该方法调整视图显示给定范围对象,并且结合选项参数实现动画效果。

 

9. 视图动画方法

动画在WebGIS开发中是很常见的操作,一般具有平移动画、旋转动画、弹性动画等。在OpenLayers开发中,地图动画主要由View类的animate方法实现。

View属性方法:animate

// 普通动画
view.animate({
  zoom: view.getZoom(),
  center
});

详情可参考文章:OpenLayers 动画效果

10. 图层标注方法

样式函数具有强大的功能,该函数具有一个feature参数,可以实现高级文本标注功能。

样式函数:styleFunction

style: function (feature) {
    const label = feature.get("name").split(" ").join("\n")
    labelStyle.getText().setText(label)
    return style
}

详情可参考文章:OpenLayers 个性化标注

11. 地图投影方法

开发一个GIS系统,首先要确定的是就是地图坐标系。对于数据源坐标系不一致的情况,要想图层能够叠加显示,就需要进行坐标转换,也就需要进行地图投影。

地图投影:register(proj4)

const def = '+proj=longlat +ellps=GRS80 +no_defs'
proj4.defs('EPSG:4490', def)
register(proj4)
return new Projection({
  code: "EPSG:4490",
  units: 'degrees'
})

详情可参考文章:

  • OpenLayers地图投影转换
  • OpenLayers 创建坐标系统

12. 共享视图方法

当需要多个视图进行联动的时候,共享视图就会非常有用,特别适用于分屏对比需要地图联动的时候。

map1.setView(map2.getView())

13. 可视化方法

数据可视化的表现方式有很多,如聚类分析、热力图、或者格网等。通过数据聚类可以减少数据量,提升渲染效率;热力图用于展示热点区域;格网或者经纬网用于数据修饰,增加地图可读性。

聚类数据源:ol.source.Cluster

const clusterSource = new ol.source.Cluster({
    distance: 40,
    source: new ol.source.Vector({
        url: "../../data/kml/2012_Earthquakes_Mag5.kml",
        format: new ol.format.KML({
            extractStyles: false
        })
    }),
    wrapX: true
})

热力图方法:ol.layer.Heatmap

const heatmapLayer = new ol.layer.Heatmap({
    source: new ol.source.Vector({
        url: "./earthquake_2012.kml",
        format: new ol.format.KML({
            extractStyles: false
        }),
        wrapX: false
    }),
    radius: parseInt(radiusInput.value) || 8, // 热点半径(单位像素)
    blur: parseInt(sizeInput.value) || 15 // 模糊半径(单位像素)
})

格网方法:ol.source.TileDebug

const TileSource = new ol.source.TileDebug({
  projection: map.getView().getProjection(),
  wrapX: false,
  template: '(x,y,z)({x},{y},{z})' // 显示结构
})
const gridLayer = new ol.layer.Tile({
  source: TileSource
})

14. 属性选择方法

属性选择器在OpenLayers开发中非常实用,每一个实例对象都具有这两个方法。通过set方法可以设置目标属性或者自定义属性,通过get方法可以获取目标属性或者自定义属性

设置目标属性或者自定义属性:set

regionLayer.set("title", "云南行政区")

获取目标属性或者自定义属性:get

regionLayer.get("title") // "云南行政区"

15. 数据更新方法

changed()是一个重要方法,每当图层或者要素数据发生改变时,要想立即生效,则需要调用changed()方法

数据更新方法:changed()

// 图层更新
regionStyle.getFill().setColor(gradiant)
layer.changed()
// 图层更新
seaChange.addEventListener("input", (evt => {
    seaOutput.innerText = seaChange.value
    raster.changed()
}))
// 事件更新
map.on('click', evt => {
   selectEvt.changed()
})
// 要素更新
form.on('select(align-select-filter)', function (data) {
    const elem = data.elem; // 获得 select 原始 DOM 对象
    const value = data.value; // 获得被选中的值
    const othis = data.othis; // 获得 select 元素被替换后的 jQuery 对象
    iconStyle.getText().setTextAlign(value)
    feature.changed()
});

OpenLayers示例数据下载,请在公众号后台回复:ol数据

全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试

GIS之路 公众号已经接入了智能助手,欢迎大家前来提问。

欢迎访问我的博客网站-长谈GIShttp://shanhaitalk.com

都看到这了,不要忘记点赞、收藏+关注 

本号不定时更新有关 GIS开发  相关内容,欢迎关注 

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部