OpenLayers入门(二)

前言

好久不见,距离OpenLayers入门第一篇已经过了很久,为什么迟迟没有后续呢,主要有两个原因,一是因为近期项目里使用地图的部分比较少,二是因为很多时候即使功能做出来了,但是还是不能完全理解,不是很明白的东西除了贴代码之外也写不了啥,其实第一篇也是很基础很简单的,但是意外的是看的人是最多的,这让我意识到可能即使是贴一下代码对一些人也是有帮助的,这就是这一篇的主要目的,可能有一些地方会看不懂,但是不要问,问我也不知道,如果你恰好了解的话十分欢迎在评论里分享,感谢~

首先来分享一个我无意中找到的教程,http://linwei.xyz/ol3-primer/index.html。虽然是基于v3版本介绍的,很多api可能变了,但还是值得一看,除了OpenLayers本身的介绍,还会有一些地理基础知识的分享,这种相对全面的中文教程真的很稀有,且看且珍惜。

接下来分享一些常用的在线地图瓦片资源:

1.高德瓦片,最大支持放大到20级,字体比较大,但是最近好像又只能到19级了。

http://wprd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7

2.高德瓦片,最大支持放大到20级,颜色偏灰绿色。

http://webst0{1-4}.is.autonavi.com/appmaptile?style=7&x={x}&y={y}&z={z}

3.高德瓦片,最大支持放大到18级,最常用的样式。

http://webrd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8

4.谷歌地图瓦片,最大支持放大到22级,颜色偏绿色。

https://mt0.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}

绘制多边形

import Feature from 'ol/Feature'
import Polygon from 'ol/geom/Polygon'
import { Vector as VectorSource } from 'ol/source'
import { Style, Stroke, Fill } from 'ol/style'
import { Vector as VectorLayer } from 'ol/layer'

// data为多边形每个点的经纬度坐标数组,[[120.11997452699472, 30.314227730637967],[120.11997452699472, 30.314227730637967],...]
function renderArea (data) {
    // 创建要素
    const features = [
        new Feature({
            geometry: new Polygon([data])// 使用多边形类型
        })
    ]
    // 创建矢量数据源
    const source = new VectorSource({
        features
    })
    // 创建样式
    const style = new Style({
        stroke: new Stroke({
            color: '#4C99F8',
            width: 3,
            lineDash: [5]
        }),
        fill: new Fill({
            color: 'rgba(255,255,255,0.1)'
        })
    })
    // 创建矢量图层
    const areaLayer = new VectorLayer({
        source,
        style,
        zIndex: 1
    })
    // 添加到地图实例
    map.addLayer(areaLayer)
}

多边形的绘制很简单,使用几何类型里的多边形类创建一个要素就可以了。

区域中间的名字显示可以通过Overlay叠加层来显示,主要是要计算一下显示的位置:

import Overlay from 'ol/Overlay';
import { boundingExtent } from 'ol/extent';
import { getCenter } from 'ol/extent';
import { fromLonLat } from 'ol/proj';

// 获取一个多边形的四个边界点,data:[[120.11997452699472, 30.314227730637967],[120.11997452699472, 30.314227730637967],...]
function getExtent (data) {
    let minx = 99999999;
    let miny = 99999999;
    let maxx = -99999999999;
    let maxy = -99999999999;
    data.forEach((item) => {
        if (item[0] > maxx) {
            maxx = item[0];
        }
        if (item[0] < minx) {
            minx = item[0];
        }
        if (item[1] > maxy) {
            maxy = item[1];
        }
        if (item[1] < miny) {
            miny = item[1];
        }
    });
    return [Number(minx), Number(miny), Number(maxx), Number(maxy)];
}
// 也可以直接使用工具方法:boundingExtent
function getExtent (data) {
    return boundingExtent(data)
}
// 获取范围的中心点坐标
let center = getCenter(getExtent(data));
// 显示名称
let nameEl = document.createElement('div')
nameEl.className = 'name'
nameEl.innerHTML = '我是名称'
let nameOverlay = new Overlay({
    position: fromLonLat(center, 'EPSG:4326'),
    element: nameEl,
    offset: [0, 0],
    positioning: 'bottom-center'
})
map.addOverlay(nameOverlay)

绘制以米为单位的圆

import Feature from 'ol/Feature'
import { circular } from 'ol/geom/Polygon'
import { Vector as VectorSource } from 'ol/source'
import { getPointResolution } from 'ol/proj'
import { METERS_PER_UNIT } from 'ol/proj/Units'
import Circle from 'ol/geom/Circle'
import { Style, Stroke, Fill } from 'ol/style'
import { Vector as VectorLayer } from 'ol/layer'

// 两种方式

// 1.使用 circular绘制
function renderRangeUseCircular (center, radius) {
    const features = []
    features.push(new Feature({
        geometry: circular(center, radius)
    }))
    return new VectorSource({
        features
    })
}

// 2.使用Circle绘制圆
function renderRangeUseCircle (center, projection = 'EPSG:4326', radius) {
    const view = map.getView()
    const resolutionAtEquator = view.getResolution()
    const pointResolution = getPointResolution(projection, resolutionAtEquator, center, METERS_PER_UNIT.m)
    const resolutionFactor = resolutionAtEquator / pointResolution
    radius = (radius / METERS_PER_UNIT.m) * resolutionFactor
    const circle = new Circle(center, radius)
    const circleFeature = new Feature(circle)
    const vectorSource = new VectorSource({
        projection: projection
    })
    vectorSource.addFeature(circleFeature)
    return vectorSource
}

// 绘制
function renderRange () {
    const source = renderRangeUseCircle(...params)
    // const source = renderRangeUseCircular(...params)
    const style = new Style({
        stroke: new Stroke({
            color: '#4C99F8',
            width: 3,
            lineDash: [5]
        }),
        fill: new Fill({
            color: 'rgba(76,153,248,0.3)'
        })
    })
    rangeLayer = new VectorLayer({
        source,
        style,
        zIndex: 2
    })
    map.addLayer(rangeLayer)
}

绘制圆有两种方式,分别是使用circularCircle这两者有什么区别我也不太清楚,它们的入参基本一样,中心点和半径,文档上没有指出半径的单位,第二种方法是百度上搜到的,绘制完经测距测试后是准确的。

添加阴影效果

OpenLayers的样式对象并不支持直接设置阴影效果,所以需要获取到canvas的绘图上下文来自行添加,原理是监听图层的prerender(在一个图层渲染前触发)和postrender(在一个图层渲染后触发)事件,修改canvas`上下文的绘图样式,对整个图层都是有影响的,所以最好把要添加阴影的要素放到一个单独的图层里:

import { Vector as VectorSource } from 'ol/source'
import { Style, Stroke, Fill } from 'ol/style'
import { Vector as VectorLayer } from 'ol/layer'

const source = new VectorSource({
    features: []
})
const style = new Style({
    stroke: new Stroke({
        color: '#437AF6',
        width: 2
    }),
    fill: new Fill({
        color: 'rgba(33,150,243,0.20)'
    })
})
let vectorLayer = new VectorLayer({
    source,
    style
})
// 添加阴影
vectorLayer.on('prerender', evt => {
    evt.context.shadowBlur = 4
    evt.context.shadowColor = 'rgba(0,0,0,0.20)'
})
vectorLayer.on('postrender', evt => {
    evt.context.shadowBlur = 0
    evt.context.shadowColor = 'rgba(0,0,0,0.20)'
})
map.addLayer(vectorLayer)

绘制带边框的线段

OpenLayers是不直接支持这种带边框的线段的,所以一种简单的方法是绘制两条线段叠加起来,上面的宽度比下面的低,就有边框效果了:

import Polygon from 'ol/geom/Polygon'
import Feature from 'ol/Feature'
import { Vector as VectorSource } from 'ol/source'
import { Style, Stroke, Fill } from 'ol/style'
import { Vector as VectorLayer } from 'ol/layer'

// 创建多边形
const features = [
    new Feature({
        geometry: new Polygon([]),
    })
]

// 下层线段,用来做边框,宽度更宽
const source = new VectorSource({
    features
})
const style = new Style({
    stroke: new Stroke({
        color: '#53AA08',
        width: 8
    }),
    fill: new Fill({
        color: 'rgba(151,255,201,0.23)'
    })
})
areaLayer = new VectorLayer({
    source,
    style,
    zIndex: 1
})
map.addLayer(areaLayer)

// 上层线段,用来做中间部分,宽度较小
const source2 = new VectorSource({
    features
})
const style2 = new Style({
    stroke: new Stroke({
        color: '#2AE000',
        width: 2
    })
})
areaLayer2 = new VectorLayer({
    source: source2,
    style: style2,
    zIndex: 2
})
map.addLayer(areaLayer2)

本次分享就这么多了,下次见~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenLayers 3(简称OL3)是一个强大且灵活的开源JavaScript库,用于在网页上创建交互式地图应用程序。它支持多种地图投影、矢量和栅格图层、地图控制器、地图交互、标注、地图导航等功能。 OpenLayers 3的入门教程可以从以下几个步骤开始。首先,你需要在网页中引入OpenLayers 3的JavaScript文件,你可以从官方网站上下载最新的版本。接下来,你可以创建一个HTML容器来显示地图,使用CSS样式来设置容器的大小和样式。 然后,你需要创建一个OpenLayers地图对象。你可以指定地图的目标容器、初始视图(包括中心坐标、缩放级别和旋转角度)以及地图图层。地图图层是地图的基础,你可以添加栅格图层(如OpenStreetMap、Google Maps)、矢量图层(如GeoJSON数据)或自定义图层。 接下来,你可以添加地图交互和控制器来增强用户体验。地图交互包括缩放、漫游、绘制和选择等功能,而控制器包括缩放滑块、鼠标位置显示和比例尺等工具。你可以根据实际需求选择添加哪些交互和控制器。 最后,你可以添加标注或其他地图元素来展示特定的信息。标注可以是点、线或面,你可以自定义它们的样式和弹出窗口内容。你还可以通过事件监听器来响应用户与地图的交互,例如点击标注后显示更多详细信息。 总之,OpenLayers 3的入门教程包括了从基础设置到高级功能的介绍。通过学习这些内容,你可以快速上手创建自己的交互式地图应用程序。你可以参考官方文档和在线教程,同时多练习、多实践,逐步提升你的OpenLayers 3技能。 ### 回答2: OpenLayers 3是一种基于JavaScript的开源地理信息系统(GIS)库,可以用于在Web上展示地理数据并与地图进行交互。以下是OpenLayers 3入门教程的完整内容: 1. 安装OpenLayers 3:首先,您需要从OpenLayers 3官方网站上下载最新版本的库文件。然后将其嵌入您的HTML页面中,可以通过在页面中添加script标签来实现。 2. 创建地图容器:在HTML页面中,创建一个具有特定ID的div元素,该元素将用于容纳地图。 3. 设置地图属性:使用OpenLayers的JavaScript API,您可以设置地图的属性,例如: - 设置地图的中心点和放大级别。 - 添加图层(例如瓦片图层、矢量图层)到地图上。 - 设置地图的投影方式。 4. 添加交互功能:OpenLayers 3提供了多种交互功能,用于与地图进行交互,例如: - 添加缩放控件和导航控件,让用户可以放大缩小地图、平移地图等操作。 - 添加鼠标交互,允许用户点击地图获取坐标、选择要素等。 - 设置地图的交互方式,例如拖动地图、滚轮缩放等。 5. 显示地图:最后,您需要通过JavaScript代码,将地图显示在HTML页面中,在指定的地图容器中渲染地图。 通过以上步骤,您可以使用OpenLayers 3开始创建和展示地图。当然,这只是一个入门教程,您还可以进一步学习OpenLayers 3的高级功能,如添加自定义样式、使用WMS服务、进行地图引导等。OpenLayers 3官方网站提供了丰富的文档和示例,可以帮助您深入学习和应用该库。 ### 回答3: OpenLayers 3 是一个开源的JavaScript库,用于在Web页面上创建交互式地图应用程序。下面是一个适合初学者入门的完整版教程: 1. 环境设置:首先,确保你具备使用JavaScript的基本知识,并在计算机上安装了一种文本编辑器(如Sublime Text)以及一个现代的Web浏览器(如Chrome)。 2. 下载并引入OpenLayers 3:从OpenLayers官方网站下载OpenLayers 3库,并将其引入到你的HTML页面中。你可以通过在`<head>`标签中添加以下代码来实现: `<script src="path/to/openlayers.js"></script>` 3. 创建地图容器:在HTML页面的`<body>`标签中,创建一个`<div>`元素来容纳地图。例如: `<div id="map" style="width: 100%; height: 400px;"></div>` 4. 初始化地图:在JavaScript中,创建一个用于初始化地图的函数。在该函数中,创建一个`new ol.Map`实例,并将其绑定到前面创建的地图容器上。例如: ``` function initMap() { var map = new ol.Map({ target: 'map' }); } ``` 5. 添加图层:在地图中添加图层是非常重要的一步。你可以使用OpenLayers提供的各种图层类型,如Tile Layer、Vector Layer等。以下是向地图添加瓦片图层的示例代码: ``` function initMap() { var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], }); } ``` 6. 设置地图视图:通过设置地图的中心坐标和缩放级别来定义地图的初始视图。例如: ``` function initMap() { var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View({ center: ol.proj.fromLonLat([0, 0]), zoom: 10 }) }); } ``` 7. 运行函数:在HTML页面中,使用以下代码运行初始化地图的函数: ``` <script> initMap(); </script> ``` 通过按照以上步骤,你将能够创建一个基本的OpenLayers 3地图应用程序并开始进一步学习和探索更多功能和高级用法。祝你好运!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值