OpenLayers数据源集成 -- 章节七:高德地图集成详解

前言

在前面的文章中,我们学习了OpenLayers的瓦片调试(VectorTileDebug)技术。本文将深入探讨OpenLayers中高德地图的集成方法,这是WebGIS开发中接入商业地图服务的重要技术。高德地图作为国内领先的地图服务提供商,提供高质量的地图数据和丰富的服务功能。通过OpenLayers集成高德地图,我们可以充分利用高德地图的数据优势,为用户提供准确、详细的地图服务。通过一个完整的示例,我们将详细解析高德地图的配置、参数设置和最佳实践。

项目结构分析

模板结构

<template><!--地图挂载dom--><div id="map"></div>
</template>

模板结构详解:

  • 地图容器: id="map" 作为地图的唯一挂载点
  • 极简设计: 采用最简化的模板结构,专注于高德地图功能展示
  • 无额外控件: 纯地图展示,突出高德地图的核心功能
  • 响应式布局: 通过CSS样式实现全屏显示效果

依赖引入详解

import Map from 'ol/Map';
import {XYZ} from 'ol/source';
import View from 'ol/View';
import {Tile as TileLayer} from 'ol/layer';

依赖说明:

  • Map: OpenLayers的核心地图类,负责地图实例的创建和管理
  • XYZ: XYZ瓦片数据源类,用于加载标准XYZ格式的瓦片服务
  • View: 地图视图类,控制地图的显示范围、缩放级别和投影方式
  • Tile as TileLayer: 瓦片图层类,用于显示瓦片数据

技术背景:

  • 高德地图: 阿里巴巴旗下的地图服务提供商
  • XYZ格式: 标准的瓦片服务格式,广泛用于Web地图
  • 商业服务: 提供高质量的地图数据和API服务

数据属性初始化

data() {return {}
}

属性说明:

  • 空数据对象: 当前示例不需要响应式数据
  • 地图实例: 直接在mounted生命周期中创建和管理
  • 简化设计: 专注于核心功能展示,减少不必要的状态管理

高德地图配置详解

1. 高德地图图层创建

var gaodeMapLayer = new TileLayer({title: "高德地图",source: new XYZ({url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}',wrapX: false})
});

配置详解:

TileLayer瓦片图层配置
  • title: "高德地图" 图层标题,用于标识和调试
  • source: XYZ数据源实例,指定高德地图的瓦片服务
XYZ数据源配置
  • url: 高德地图瓦片服务地址
  • 服务域名: wprd0{1-4}.is.autonavi.com
  • 负载均衡: {1-4} 表示使用1-4号服务器,实现负载均衡
  • 服务商: 高德地图(AutoNavi)
  • 服务路径: /appmaptile 高德地图瓦片服务接口
  • URL模板: {x}/{y}/{z} 标准XYZ瓦片坐标参数
  • wrapX: false 禁止X轴方向的重复平铺

2. 高德地图URL参数详解

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

参数说明:

基础参数
  • lang: zh_cn 语言设置,中文简体
  • 可选值: zh_cn(中文简体)、en(英文)
  • size: 1 瓦片尺寸,1表示256×256像素
  • 可选值: 1(256×256)、2(512×512)
  • style: 7 地图样式类型
  • 可选值:
  • 6: 标准地图
  • 7: 卫星地图
  • 8: 路网地图
  • 9: 路网+标注地图
坐标参数
  • x: {x} 瓦片X坐标(由OpenLayers自动替换)
  • y: {y} 瓦片Y坐标(由OpenLayers自动替换)
  • z: {z} 缩放级别(由OpenLayers自动替换)

3. 高德地图服务类型

不同样式的地图服务:

// 标准地图
const standardMap = new XYZ({url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=6&x={x}&y={y}&z={z}'
});// 卫星地图
const satelliteMap = new XYZ({url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}'
});// 路网地图
const roadMap = new XYZ({url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=8&x={x}&y={y}&z={z}'
});// 路网+标注地图
const roadLabelMap = new XYZ({url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=9&x={x}&y={y}&z={z}'
});

地图初始化详解

1. 地图实例创建

var map = new Map({layers: [gaodeMapLayer],view: new View({center: [12958752, 4848452],projection: 'EPSG:3857',zoom: 8,minZoom: 1}),target: 'map'
});

配置详解:

layers图层配置
  • gaodeMapLayer: 高德地图图层实例
  • 图层顺序: 数组中靠后的图层显示在上层
View视图配置
  • center: [12958752, 4848452] 地图中心点坐标
  • 坐标系统: Web墨卡托投影(EPSG:3857)
  • 地理位置: 中国东部地区
  • 坐标转换:
  • 经度: 约116.4° (东经116.4度)
  • 纬度: 约39.9° (北纬39.9度)
  • 地理位置: 北京市附近
  • projection: 'EPSG:3857' 指定投影系统为Web墨卡托
  • zoom: 8 初始缩放级别,适合显示城市级别的地图
  • minZoom: 1 最小缩放级别,限制地图的最小缩放

2. 坐标系统说明

EPSG:3857 (Web墨卡托投影):

  • 标准名称: Web Mercator
  • 用途: 广泛用于Web地图服务
  • 特点: 保持形状不变,但面积会有一定变形
  • 范围: 全球范围,但极地地区变形较大

坐标转换示例:

// 经纬度转Web墨卡托坐标
const lon = 116.3974; // 经度
const lat = 39.9093;  // 纬度// 转换公式
const x = lon * 20037508.34 / 180;
const y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180) * 20037508.34 / 180;console.log('Web墨卡托坐标:', [x, y]);

核心API方法总结

TileLayer对象方法

方法功能参数返回值示例
getSource()获取数据源-XYZlayer.getSource()
setSource(source)设置数据源XYZ-layer.setSource(source)
setOpacity(opacity)设置透明度Number(0-1)-layer.setOpacity(0.7)
getOpacity()获取透明度-Numberlayer.getOpacity()
setVisible(visible)设置可见性Boolean-layer.setVisible(false)
getVisible()获取可见性-Booleanlayer.getVisible()
setZIndex(zIndex)设置层级Number-layer.setZIndex(5)
getZIndex()获取层级-Numberlayer.getZIndex()

XYZ对象方法

方法功能参数返回值示例
getUrl()获取服务URL-Stringsource.getUrl()
setUrl(url)设置服务URLString-source.setUrl(newUrl)
getTileLoadFunction()获取瓦片加载函数-Functionsource.getTileLoadFunction()
setTileLoadFunction(func)设置瓦片加载函数Function-source.setTileLoadFunction(...)
getTileGrid()获取瓦片网格-TileGridsource.getTileGrid()
setTileGrid(tileGrid)设置瓦片网格TileGrid-source.setTileGrid(grid)

View对象方法

方法功能参数返回值示例
getCenter()获取中心点-Coordinateview.getCenter()
setCenter(center)设置中心点Coordinate-view.setCenter([x, y])
getZoom()获取缩放级别-Numberview.getZoom()
setZoom(zoom)设置缩放级别Number-view.setZoom(10)
getMinZoom()获取最小缩放级别-Numberview.getMinZoom()
setMinZoom(minZoom)设置最小缩放级别Number-view.setMinZoom(1)
getMaxZoom()获取最大缩放级别-Numberview.getMaxZoom()
setMaxZoom(maxZoom)设置最大缩放级别Number-view.setMaxZoom(18)

实际应用扩展

1. 多图层叠加

// 创建多个高德地图图层
const standardLayer = new TileLayer({title: "高德标准地图",source: new XYZ({url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=6&x={x}&y={y}&z={z}',wrapX: false}),zIndex: 0
});const satelliteLayer = new TileLayer({title: "高德卫星地图",source: new XYZ({url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}',wrapX: false}),zIndex: 1,visible: false
});const roadLayer = new TileLayer({title: "高德路网地图",source: new XYZ({url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=8&x={x}&y={y}&z={z}',wrapX: false}),zIndex: 2,visible: false
});// 添加到地图
const map = new Map({layers: [standardLayer, satelliteLayer, roadLayer],view: new View({center: [12958752, 4848452],projection: 'EPSG:3857',zoom: 8,minZoom: 1}),target: 'map'
});

2. 图层切换控制

// 图层切换方法
function switchLayer(layerName) {const layers = map.getLayers();layers.forEach(layer => {if (layer.get('title') === layerName) {layer.setVisible(true);} else {layer.setVisible(false);}});
}// 添加控制按钮
function addLayerControls() {const controls = document.createElement('div');controls.style.position = 'absolute';controls.style.top = '10px';controls.style.right = '10px';controls.style.zIndex = '1000';const buttons = [{ name: '标准地图', layer: '高德标准地图' },{ name: '卫星地图', layer: '高德卫星地图' },{ name: '路网地图', layer: '高德路网地图' }];buttons.forEach(button => {const btn = document.createElement('button');btn.textContent = button.name;btn.onclick = () => switchLayer(button.layer);btn.style.margin = '5px';controls.appendChild(btn);});document.body.appendChild(controls);
}

3. 动态样式切换

// 动态切换地图样式
function changeMapStyle(style) {const layer = map.getLayers().getArray()[0];const source = layer.getSource();const newUrl = `http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=${style}&x={x}&y={y}&z={z}`;source.setUrl(newUrl);
}// 样式切换按钮
function addStyleControls() {const controls = document.createElement('div');controls.style.position = 'absolute';controls.style.top = '60px';controls.style.right = '10px';controls.style.zIndex = '1000';const styles = [{ name: '标准', value: 6 },{ name: '卫星', value: 7 },{ name: '路网', value: 8 },{ name: '路网+标注', value: 9 }];styles.forEach(style => {const btn = document.createElement('button');btn.textContent = style.name;btn.onclick = () => changeMapStyle(style.value);btn.style.margin = '5px';controls.appendChild(btn);});document.body.appendChild(controls);
}

4. 瓦片加载状态监控

// 监控瓦片加载状态
function setupTileMonitoring() {const source = map.getLayers().getArray()[0].getSource();source.on('tileloadstart', (event) => {console.log('开始加载瓦片:', event.tile);});source.on('tileloadend', (event) => {console.log('瓦片加载完成:', event.tile);});source.on('tileloaderror', (event) => {console.error('瓦片加载失败:', event.tile);});
}

5. 地图事件监听

// 添加地图事件监听
function setupMapEvents() {// 地图点击事件map.on('click', (event) => {const coordinate = event.coordinate;console.log('点击坐标:', coordinate);// 显示坐标信息const info = document.createElement('div');info.textContent = `坐标: ${coordinate[0].toFixed(2)}, ${coordinate[1].toFixed(2)}`;info.style.position = 'absolute';info.style.bottom = '10px';info.style.left = '10px';info.style.background = 'rgba(255, 255, 255, 0.8)';info.style.padding = '5px';info.style.borderRadius = '3px';document.body.appendChild(info);// 3秒后移除信息setTimeout(() => {document.body.removeChild(info);}, 3000);});// 视图变化事件map.getView().on('change:center', () => {const center = map.getView().getCenter();console.log('地图中心变化:', center);});map.getView().on('change:resolution', () => {const zoom = map.getView().getZoom();console.log('缩放级别变化:', zoom);});
}

总结

本文详细介绍了OpenLayers中高德地图的集成方法,主要知识点包括:

  1. 高德地图集成: 通过XYZ数据源集成高德地图服务
  2. URL参数配置: 详细解析高德地图服务的URL参数
  3. 多种样式支持: 标准地图、卫星地图、路网地图等样式
  4. 图层管理: 多图层叠加、图层切换、动态样式切换
  5. 性能优化: 瓦片缓存、预加载、动态分辨率调整
  6. 错误处理: 网络错误处理、服务可用性检查、备用服务配置

通过 TileLayer 和 XYZ 的组合使用,我们可以轻松集成高德地图服务。高德地图作为国内领先的地图服务提供商,具有以下优势:

  • 数据准确: 基于高德地图的权威数据
  • 覆盖全面: 提供全国范围的高质量地图数据
  • 样式丰富: 支持多种地图样式和显示效果
  • 性能稳定: 高可用性和稳定的服务性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921974.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外代理IP平台Top3评测:LoongProxy、神龙动态IP、IPIPGO哪家更适合你?

在当今互联网环境中&#xff0c;代理IP服务已成为许多企业和个人用户的刚需。无论是数据采集、市场调研还是账号管理&#xff0c;优质的代理IP都能大幅提升工作效率。本文将针对LoongProxy、神龙海外动态IP和IPIPGO这三家主流代理IP服务商进行横向评测&#xff0c;帮助你根据自…

对浏览器事件机制的理解

浏览器事件是什么&#xff1a; 事件是用户操作网页时发生的交互动作&#xff0c;比如 click/move&#xff0c; 事件除了用户触发的动作外&#xff0c;还可以是文档加载&#xff0c;窗口滚动和大小调整。事件被封装成一个 event 对象&#xff0c;包含了该事件发生时的所有相关信…

XCVP1902-2MSEVSVA6865 AMD 赛灵思 XilinxVersal Premium FPGA

XCVP1902-2MSEVSVA6865 是 AMD 赛灵思&#xff08;Xilinx&#xff09;Versal Premium FPGA 系列中的高端自适应系统级芯片&#xff08;Adaptive SoC&#xff09;变体&#xff0c;面向需要极高逻辑密度、海量 I/O 与超高速收发能力的数据中心互联、原型验证与高性能网络加速等应…

kotlin - 2个Fragment实现左右显示,左边列表,右边详情,平板横、竖屏切换(一)

kotlin - 2个Fragment实现左右显示&#xff0c;左边列表&#xff0c;右边详情&#xff0c;平板横、竖屏切换(要使用平板测试)平板横屏&#xff1a;左右fragment实现分屏效果&#xff0c;平板竖屏&#xff1a;只显示左边的fragment&#xff0c;点击才显示右边fragment屏幕旋转&a…

推荐系统中的AB测试:从设计到分析全流程

推荐系统中的AB测试:从设计到分析全流程 关键词:推荐系统、AB测试、实验设计、数据分析、效果评估、统计显著性、用户体验 摘要:本文将深入探讨推荐系统中AB测试的全流程,从实验设计到结果分析。我们将用通俗易懂的方式解释AB测试的核心概念,展示如何科学地评估推荐算法改…

【go语言 | 第1篇】Go环境安装+go语言特性

文章目录go开发环境1. 下载安装包2. 配置环境变量3. GOPROXYgo语言特性1. go的优势2. go适合做什么3. go缺点编写一个go程序注&#xff1a;在VSCode中补全go代码go开发环境 我这里是windows操作系统的环境安装&#xff0c;其他系统可以查看菜鸟教程&#xff1a;Go 语言环境安装…

【Pywinauto库】0. Pywinauto Windows GUI 自动化指南

概述 Pywinauto 是一个用于自动化 Windows GUI 应用程序的 Python 库&#xff0c;适用于自动化测试、数据录入和其他重复性桌面操作。 快速参考表方面方法/属性示例说明安装pip install pywinauto安装库后端选择Application(backend"uia") 或 Application(backend&qu…

CStringArray 和 CStringList

CStringArray 和 CStringList 都是 MFC 中用于管理字符串集合的类&#xff0c;但它们的内部数据结构和适用场景有显著差异&#xff0c;选择时需根据具体操作需求决定。以下从核心区别、功能对比和适用场景三个方面详细说明&#xff1a;一、核心区别&#xff1a;数据结构决定特性…

2025版基于springboot的企业考勤管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

设计模式(C++)详解—单例模式(1)

<摘要> 单例模式是创建型设计模式中最经典且应用最广泛的设计模式之一&#xff0c;它确保一个类只有一个实例并提供全局访问点。本文从历史背景和核心概念出发&#xff0c;详细阐述了单例模式的产生背景和演进历程&#xff0c;深入剖析了其在资源管理、状态一致性和访问控…

将GitHub远程仓库修改为ssh

8 将GitHub远程仓库修改为ssh 文章目录8 将GitHub远程仓库修改为ssh1 创建本地的ssh密钥2 设置GitHub密钥3 将本地库链接到远程仓库很多时候在使用GitHub的远程链接使用的是http的格式&#xff0c;但是这个格式并不好&#xff0c;尤其是在代码上传的时候&#xff0c;因此需要采…

【OEC-Turbo】网心云 OEC-Turbo 刷机 Armbian 系统教程

前言 大量网心云 OEC 及 OEC-Turbo 设备流入二手市场&#xff08;如海鲜市场&#xff09;&#xff0c;价格低至 70-100 元。相比同配置的拾光坞 N3&#xff08;约 380 元&#xff09;&#xff0c;OEC-Turbo 仅需一个零头&#xff0c;性价比极高。这些“矿渣”设备外观与玩客云…

25.线程概念和控制(二)

一、线程周边问题1.线程的优点创建一个新线程的代价要比创建一个新进程小得多。线程占用的资源要比进程少很多。能充分利用多处理器的可并行数量。在等待慢速I/O操作结束的同时&#xff0c;程序可执行其他的计算任务。计算密集型应用&#xff0c;为了能在多处理器系统上运行&am…

【CVPR2023】奔跑而非行走:追求更高FLOPS以实现更快神经网络

文章目录一、论文信息二、论文概要三、实验动机四、创新之处五、实验分析六、核心代码注释版本七、实验总结一、论文信息 论文题目&#xff1a;Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks中文题目&#xff1a;奔跑而非行走&#xff1a;追求更高FLOPS…

JVM(二)--- 类加载子系统

目录 前言 一、类加载过程 1. loading阶段 2. Linking阶段 2.1 验证 2.2 准备 2.3 解析 3. Initialization阶段 二、类加载器 1. 类加载器的分类 2. 用户自定义类加载器 三、双亲委派机制 四、其他知识点 前言 JVM的内存结构如图所示&#xff1a; 一、类加载过程…

Docker 容器的使用

1.容器的基本信息[roothost1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ac8245b5b08 img-layers-test "python /app/app.py" 45 hours ago Exited (0) 45 hour…

LLMs之Hallucinate:《Why Language Models Hallucinate》的翻译与解读

LLMs之Hallucinate&#xff1a;《Why Language Models Hallucinate》的翻译与解读 导读&#xff1a;该论文深入分析了语言模型中幻觉现象的成因&#xff0c;认为幻觉源于预训练阶段的统计压力和后训练阶段评估体系对猜测行为的奖励。论文提出了通过修改评估方法&#xff0c;使其…

Spring Cloud @RefreshScope 作用是什么?

RefreshScope 是 Spring Cloud 中的一个重要注解&#xff0c;主要作用如下&#xff1a; 主要功能动态刷新配置 使 Bean 能够在运行时动态刷新配置属性当配置中心的配置发生变化时&#xff0c;无需重启应用即可生效作用域管理 为 Bean 创建一个特殊的作用域 refresh标记的 Bean …

Flutter SDK 安装与国内镜像配置全流程(Windows / macOS / Linux)

这是一份面向国内网络环境的 Flutter 从零到可运行指引&#xff1a;覆盖 SDK 安装、平台依赖准备、国内镜像配置&#xff08;PUB_HOSTED_URL、FLUTTER_STORAGE_BASE_URL&#xff09;、Android 侧 Gradle 仓库加速&#xff0c;以及 Java/Gradle 版本兼容的关键坑位与排查思路。文…

【Java】NIO 简单介绍

简介 从 Java 1.4 版本开始引入的一个新的 I/O API&#xff0c;可以替代标准的 Java I/O。提供了与标准 I/O 不同的工作方式&#xff0c;核心是 通道&#xff08;Channel&#xff09;、缓冲区&#xff08;Buffer&#xff09; 和 选择器&#xff08;Selector&#xff09;。支持非…