WebGIS开发绘制地图标注

article/2025/9/20 14:12:27

目录

实现步骤

1. 引用开发库:

2. 创建地图容器:

3. 创建地图对象类:

4. 添加矢量图层:

5. 添加图片标注:

5.1 创建图片标注要素

5.2 设置图片标注要素样式

5.3 将图片标注添加到图层数据源中

6. 添加文字标注:

6.1 创建文字标注要素

6.2 设置文字标注样式

6.3 将文字标注添加到图层数据源中

7. 添加图文标注对象:

7.1 创建图文标注要素

7.2 设置图文标注样式

7.3 添加图文标注到图层数据源中

8. 添加 PopUP:

8.1 获取要转化为 Overlay 的 HTML 元素

8.2 添加关闭按钮的单击事件(隐藏 popup)

8.3 创建 Overlay

8.4 设置 popup 弹窗内容

8.5 为 map 添加点击事件监听,渲染弹出 popup

9. 添加聚合标注:

9.1 创建要素数组

9.2 创建聚合标注数据源

9.3 加载聚合标注数据图层

关键接口

1.【几何要素类】ol.Feature

2.【Overlay 类】ol.Overlay

3.【聚合数据源类】ol.source.Cluster


本文主要介绍如何使用天地图的世界地图添加标注的功能,示例需要使用 【include-openlayers-local.js】 开发库实现。

对于文字,图片,图文标注都是通过ol.Feature()方法构建要素,然后加载到地图中,对于 PopUp 标注则是通过ol.Overlay()方法构建 overlay 弹窗实现。通过ol.source.Cluster()方法创建聚合标注数据源。

实现效果如下图所示:

实现步骤

1. 引用开发库:

本示例通过本地离线 【include-openlayers-local.js】 脚本引入开发库;

2. 创建地图容器:

创建id="mapCon"的 div,并设置其样式;

3. 创建地图对象类:

创建地图对象,设置地图的必要参数;

4. 添加矢量图层:

构建矢量图层(用于存储标注数据),并将图层加入到地图中;

  vectorSource = new ol.source.Vector({features: [],})//矢量标注图层vectorLayer = new ol.layer.Vector({source: vectorSource,})map.addLayer(vectorLayer)

5. 添加图片标注:

构建点几何要素,设置其样式为图片标注,并将该点加入到矢量图层中;

5.1 创建图片标注要素

//新建一个要素 ol.Featurevar newFeature = new ol.Feature({//几何信息geometry: new ol.geom.Point(coordinate),})

5.2 设置图片标注要素样式

 
 function createImageStyle(feature) {return new ol.style.Style({/**{olx.style.IconOptions}类型*/image: new ol.style.Icon({anchor: [0.5, 60],anchorOrigin: 'top-right',anchorXUnits: 'fraction',anchorYUnits: 'pixels',offsetOrigin: 'top-right',// offset:[0,10],//图标缩放比例// scale:0.5,//透明度opacity: 0.75,//图标的urlsrc: './static/assets/olimages/label/blueIcon.png',}),})}//设置要素的样式newFeature.setStyle(createImageStyle(newFeature))

5.3 将图片标注添加到图层数据源中

  //将新要素添加到数据源中vectorSource.addFeature(newFeature)

6. 添加文字标注:

构建点几何要素,设置其样式为文本标注,并将该点加入到矢量图层中;

6.1 创建文字标注要素

  //新建一个要素 ol.Featurevar newFeature = new ol.Feature({//几何信息geometry: new ol.geom.Point(coordinate),//名称属性name: '标注点',})

6.2 设置文字标注样式

 function createTxtStyle(feature) {return new ol.style.Style({text: new ol.style.Text({//位置textAlign: 'center',//基准线textBaseline: 'middle',//文字样式font: 'normal 14px 微软雅黑',//文本内容text: feature.get('name'),//文本填充样式(即文字颜色)fill: new ol.style.Fill({ color: '#aa3300' }),stroke: new ol.style.Stroke({ color: '#ffcc33', width: 2 }),}),})}//设置要素的样式newFeature.setStyle(createTxtStyle(newFeature))
 

6.3 将文字标注添加到图层数据源中

 vectorSource.addFeature(newFeature)

7. 添加图文标注对象:

构建点几何要素,设置其样式为图文标注,并将该点加入到矢量图层中;

7.1 创建图文标注要素

 //新建一个要素 ol.Featurevar newFeature = new ol.Feature({//几何信息geometry: new ol.geom.Point(coordinate),//名称属性name: '标注点',})

7.2 设置图文标注样式

  function createImgTxtLabelStyle(feature) {return new ol.style.Style({image: new ol.style.Icon(/** @type {olx.style.IconOptions} */({anchor: [0.5, 60],anchorOrigin: 'top-right',anchorXUnits: 'fraction',anchorYUnits: 'pixels',offsetOrigin: 'top-right',// offset:[0,10],//图标缩放比例// scale:0.5,//透明度opacity: 0.75,//图标的urlsrc: './static/assets/olimages/label/blueIcon.png',})),text: new ol.style.Text({//位置textAlign: 'center',//基准线textBaseline: 'middle',//文字样式font: 'normal 14px 微软雅黑',//文本内容text: feature.get('name'),//文本填充样式(即文字颜色)fill: new ol.style.Fill({ color: '#aa3300' }),stroke: new ol.style.Stroke({ color: '#ffcc33', width: 2 }),}),})}//设置要素的样式newFeature.setStyle(createImgTxtLabelStyle(newFeature))

7.3 添加图文标注到图层数据源中

//将新要素添加到数据源中vectorSource.addFeature(newFeature)

8. 添加 PopUP:

8.1 获取要转化为 Overlay 的 HTML 元素

  container = document.getElementById('popup')content = document.getElementById('popup-content')closer = document.getElementById('popup-closer')

8.2 添加关闭按钮的单击事件(隐藏 popup)

  /*** 添加关闭按钮的单击事件(隐藏popup)* @return {boolean} Don't follow the href.*/closer.onclick = function() {//未定义popup位置popup.setPosition(undefined)//失去焦点closer.blur()return false}

8.3 创建 Overlay

  if (popup == null) {popup = new ol.Overlay(/** @type {olx.OverlayOptions} */({//要转换成overlay的HTML元素element: container,//当前窗口可见autoPan: true,//Popup放置的位置positioning: 'bottom-center',//是否应该停止事件传播到地图窗口stopEvent: false,autoPanAnimation: {//当Popup超出地图边界时,为了Popup全部可见,地图移动的速度duration: 250,},}))}map.addOverlay(popup)

8.4 设置 popup 弹窗内容

//示例标注点北京市的信息对象var featuerInfo = {geo: [116.28, 39.54],att: {//标注信息的标题内容title: '北京市(中华人民共和国首都)',//标注详细信息链接titleURL: 'http://www.openlayers.org/',//标注内容简介text: '北京(Beijing),简称京,中华人民共和国首都、直辖市,中国的政治、文化和国际交往中心……',//标注的图片imgURL: './static/assets/olimages/label/bj.png',},}/*** 动态创建popup的具体内容* @param {string} title*/function addFeatrueInfo(info) {//新增a元素var elementA = document.createElement('a')elementA.className = 'markerInfo'elementA.href = info.att.titleURL//elementA.innerText = info.att.title;setInnerText(elementA, info.att.title)// 新建的div元素添加a子节点content.appendChild(elementA)//新增div元素var elementDiv = document.createElement('div')elementDiv.className = 'markerText'//elementDiv.innerText = info.att.text;setInnerText(elementDiv, info.att.text)// 为content添加div子节点content.appendChild(elementDiv)//新增img元素var elementImg = document.createElement('img')elementImg.className = 'markerImg'elementImg.src = info.att.imgURL// 为content添加img子节点content.appendChild(elementImg)}/*** 动态设置元素文本内容(兼容)*/function setInnerText(element, text) {if (typeof element.textContent == 'string') {element.textContent = text} else {element.innerText = text}}

8.5 为 map 添加点击事件监听,渲染弹出 popup

  map.on('click', function(evt) {//判断当前单击处是否有要素,捕获到要素时弹出popupvar feature = map.forEachFeatureAtPixel(evt.pixel, function(feature, layer) {return feature})if (feature) {//清空popup的内容容器content.innerHTML = ''//在popup中加载当前要素的具体信息addFeatrueInfo(featuerInfo)popup.setPosition(feature.getGeometry().getCoordinates())}})

9. 添加聚合标注:

通过构建矢量图层,关联聚合数据源,实现聚合标注效果。

9.1 创建要素数组

  //此示例创建10000个要素var count = 10000var features = new Array(count)for (var i = 0; i < count; ++i) {var coordinates = [Math.random() * 360 - 180, Math.random() * 180 - 90]features[i] = new ol.Feature(new ol.geom.Point(coordinates))}vectorSource.addFeatures(features)

9.2 创建聚合标注数据源

  //聚合标注数据源var clusterSource = new ol.source.Cluster({distance: 30,source: vectorSource,wrapX: false,})
 

9.3 加载聚合标注数据图层

//加载聚合标注的矢量图层var styleCache = {}var clusters = new ol.layer.Vector({source: clusterSource,style: function(feature, resolution) {var size = feature.get('features').lengthvar style = styleCache[size]if (!style) {style = [new ol.style.Style({image: new ol.style.Circle({radius: 10,stroke: new ol.style.Stroke({color: '#fff',}),fill: new ol.style.Fill({color: '#3399CC',}),}),text: new ol.style.Text({text: size.toString(),fill: new ol.style.Fill({color: '#fff',}),}),}),]styleCache[size] = style}return style},})map.addLayer(clusters)

关键接口

1.【几何要素类】ol.Feature

详细信息见 OpenLayers API OpenLayers v5.3.0 API - Module: ol/Feature

2.【Overlay 类】ol.Overlay

详细信息见 OpenLayers API OpenLayers v5.3.0 API - Module: ol/Overlay

3.【聚合数据源类】ol.source.Cluster

详细信息见 OpenLayers API OpenLayers v5.3.0 API - Module: ol/source/Cluster


http://chatgpt.dhexx.cn/article/dshhu3u2.shtml

相关文章

高精地图语义分割标注

什么是语义分割&#xff1f; 语义图像分割是计算机视觉中一个非常重要的研究和应用方向。它的任务是按照预定的类别对图像中的每个像素进行标注/分类。不同于目标检测&#xff0c;语义分割不对目标进行2D框选。 几个语义分割的关键应用场景&#xff1a; 1&#xff09;自动驾…

百度地图JSAPI标注旋转

百度地图官方JSAPI&#xff1a;http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference.html#a3b2 官方DEMO&#xff1a;http://lbsyun.baidu.com/jsdemo.htm#c1_16 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" cont…

echarts城市地图加标注

成都市人口密度统计 首先引入地图json文件 首先引入地图json文件 引入文件的地址可以用echarts官方网站的github的内容,也可以去这个链接 https://blog.csdn.net/WWW_share8/article/details/90348799, 找到这篇博文中的github链接 生成效果图如下 代码如下 var markdata[];…

奥维地图显示所有标注

/ / / / / / / / / / /// / / / / // / / / / / / / / / / / / / / / / / / / / / / / / / / 1、先用arcgis转成KMZ&#xff0c;然后导入奥维地图 2、通过奥维地图导出刚刚导入的文件&#xff0c;导出的时候文件类型设置成kmlGoogle地标 3、导出的文件是kml格式的&a…

mapv地图文字标注

效果 代码 //文字标注function text() {var textdata [];textdata.push({geometry: {type: Point,coordinates: arr[0]},properties: {text: 兰州}});textdata.push({geometry: {type: Point,coordinates: arr[2]},properties: {text: 天水}});textdata.push({geometry: {type…

python在地图上标注点_怎样用python画地图上的标注线

怎样用python画地图上的标注线 发布时间:2020-11-16 09:52:53 来源:亿速云 阅读:90 作者:小新 小编给大家分享一下怎样用python画地图上的标注线,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧! 需要连接地图上已知经纬度(lat1,lon1;lat2,lon2)的两个点,可…

对地图进行标注

对地图进行标注 地图标注有助于识别要素、建立重要要素的可视等级&#xff0c;以及引导地图用户重点关注地图的用途。标注可以根据要素的大小放置&#xff0c;以便使它们在地图上更易于读取。标注通常为动态生成的&#xff0c;而只有标注属性需要储存 - 这些设置用来动态创建标…

零基础学Arcgis(十二)地图标注与注记

写在前面的话&#xff1a; B站搜索“中图地信”便可观看全套71章节详细操作视频&#xff08;有操作数据获取&#xff0c;同步学习&#xff09; &#xff08;一&#xff09;标注要素 [1]启动ArcMap&#xff0c;新建空白地图文档&#xff1b; [2]打开【目录】窗口&#xff0c;定…

三子棋游戏的实现

接下来&#xff0c;我将会为大家简单介绍三子棋游戏的实现过程。 首先我们可以想到&#xff0c;在游戏开始前&#xff0c;需要菜单让人选择是否进行开始。&#xff08;简易菜单实现如下&#xff09; void menu() {printf("************************\n");printf(&quo…

基于JavaSwing开发棋类游戏(围棋,五子棋,象棋,井字棋,贯通棋) 课程设计

基于JavaSwing开发棋类游戏&#xff08;围棋&#xff0c;五子棋&#xff0c;象棋&#xff0c;井字棋&#xff0c;贯通棋&#xff09; &#xff1a; &#xff08;大作业&#xff09; 开发环境: Windows操作系统 开发工具&#xff1a;MyEclipse/eclipse/ideaJdk 运行效果截图&am…

基于java五子棋游戏设计与实现

欢迎添加微信互相交流学习哦&#xff01; 项目源码&#xff1a;https://gitee.com/oklongmm/biye2 摘要&#xff1a;五子棋作为中国古代的传统黑白棋种之一&#xff0c;有着广泛的群众基础&#xff0c;是一种老少皆宜的棋类休闲游戏。开发一款五子棋游戏可以使广大棋牌游戏爱好…

初学者的三子棋游戏

摘要&#xff1a;相信每个人都有一个设计游戏的梦想&#xff0c;都曾玩过王者农药&#xff0c;cf等许多游戏&#xff0c;对之充满好奇&#xff0c;好奇他是怎样做出来的呢。 目录 摘要&#xff1a;相信每个人都有一个设计游戏的梦想&#xff0c;都曾玩过王者农药&#xff0c;…

五子棋-单机游戏-微信小游戏项目开发入门

关于这个文章能看懂的条件&#xff0c;需要读者具备如下三个条件&#xff1a; 熟悉 HTML熟悉 HTML 中的 CanvasJavaScript基础 以及ES5以上 这是一个五子棋游戏的实现方案&#xff0c;在微信小程序上运行&#xff0c;如有需要可参考此学习&#xff0c;实现逻辑不是很复杂&…

C/C++:实现象棋游戏

大体思路 采用面相过程的设计方式实现&#xff0c;类似于我们平时做的课程设计&#xff0c;实现这样的小游戏无非就是多了图形处理库。这里使用的是acllib图形库。 设计这种小游戏&#xff0c;首先要从宏观上去认识&#xff1a;象棋&#xff0c;要有棋盘&#xff0c;要有棋子&a…

基于Android的五子棋游戏APP设计

目 录 第一章&#xff1a;绪论 1 1.1智能手机与Android系统的发展历程 1 1.1.1 智能手机 1 1.1.2 Android系统基本情况介绍 2 1.2课题现状及应用前景 3 1.2.1 五子棋简介 3 1.2.2 课题现状及应用前景 3 第二章&#xff1a;开发环境的搭建 5 2.1 系统开发环境 5 2.2 系统开发环境…

棋类游戏-五子棋小游戏

​ 活动地址&#xff1a;CSDN21天学习挑战赛 界面效果&#xff1a; 实现&#xff1a; 第一步&#xff1a;定义好设计该游戏要用到的组件以及相关数据&#xff1b; 第二步&#xff1a;组装组件&#xff0c;给组件设置相对应的功能&#xff1b; 第三步&#xff1a;调用init()方…

基于c语言的象棋游戏

一、主要目标&#xff1a; 1.1&#xff1a;鼠标控制。 1.2&#xff1a;各棋子按照象棋规则移动 1.3&#xff1a;判断双方胜负 注&#xff1a;本设计使用vs-2017运行。需要下载graphics.h库。 二、基本流程 2.1 棋牌展示 直接输出棋盘背景图片&#xff0c;包含方格线、“楚…

【Unity连载】斗兽棋—棋类游戏开发演示(1)

序言 “黄梅时节家家雨&#xff0c;青草池塘处处蛙。有约不来过夜半&#xff0c;闲敲棋子落灯花。” “象棋终日乐悠悠&#xff0c;苦被严亲一旦丢。兵卒坠河皆不救&#xff0c;将军溺水一齐休。马行千里随波去&#xff0c;象入三川逐浪游。炮响一声天地震&#xff0c;忽然惊…

简单的象棋开发

我们需要准备的知识是c语言基础和easyx图形: easyx官网&#xff1a; https://easyx.cn/ 首先头文件少不了: #include<stdio.h>(c语言的头文件) #include<graphics.h>&#xff08;easyx的&#xff09; #include<mmsystem.h>&#xff08;音乐播放的&#x…

Java游戏开发 —— 五子棋

引言&#xff1a; 五子棋的代码实现很简单&#xff0c;难的是计算机的AI算法&#xff0c;在网上找了很多资料&#xff0c;费了好半天劲才弄明白其实现的原理&#xff0c;真的挺开阔思路的&#xff0c;很有意思&#xff01; 思路&#xff1a; 1、创建主窗口&#xff0c;加载菜单…