openlayers根据下拉框选项在地图上显示图标

这里是关于一个根据下拉框的选项在地图上显示图标的需求,用的是vue+openlayers

显示效果大概是这样:

选中选项之后会跳转到所点击的城市,并且在地图上显示图标+温度,这一块UI没设计我就大概先弄了一下,比较丑。。

首先放一个层

javascript 复制代码
<div id="weatherInfo"></div>
//下面是遮盖物的div
<div id="temperatureOverlay" ></div>

接下来是js部分,首先创建一个地图,我这里使用的是本地静态切片。

javascript 复制代码
const center = ol.proj.transform([112, 38.42], 'EPSG:4326', 'EPSG:3857');
						
						const map = new ol.Map({
						target: 'map',
						layers: [
							
							
						
							new ol.layer.Tile({
							source: new ol.source.XYZ({
								url: 'satellite/{z}/{x}/{y}.jpg'
							}),
							isGroup: true,
						
							}),
							new ol.layer.Tile({
							source: new ol.source.XYZ({
								url: 'overlay/{z}/{x}/{y}.png'
								
							}),
							isGroup: true,
							name: '天地图文字标注'
							}),
						],

						view: new ol.View({
							center: center,
							zoom:4
						})
						})

接下来是用本地的数据生成下拉框选项,以及绘制/创建天气text覆盖物

javascript 复制代码
//创建天气列表
							const cityWeatherData = [
							{
								city: '北京',
								temperature: 25,
								icon: 'icon/sun.png',
								coordinates: [116.4074, 39.9042]
							},
							{
								city: '上海',
								temperature: 28,
								icon: 'icon/sun.png',
								coordinates: [121.4737, 31.2304]
							},
							// 其他城市的天气数据
							];

							const citySelect = document.getElementById('citySelect');
							const iconLayer = new ol.layer.Vector({
							source: new ol.source.Vector()
							});
							map.addLayer(iconLayer);

							cityWeatherData.forEach(function(data) {
							const option = document.createElement('option');
							option.value = data.city;
							option.textContent = data.city;
							citySelect.appendChild(option);
							});

							const weatherInfo = document.getElementById('weatherInfo');

							citySelect.addEventListener('change', function() {
							const selectedCity = citySelect.value;
							const selectedWeatherData = cityWeatherData.find(function(data) {
								return data.city === selectedCity;
							});
							iconLayer.getSource().clear();

							if (selectedWeatherData) {
								const iconFeature = new ol.Feature({
								geometry: new ol.geom.Point(ol.proj.fromLonLat(selectedWeatherData.coordinates)),
								name: selectedWeatherData.city,
								temperature: selectedWeatherData.temperature,
								icon: selectedWeatherData.icon
								});
								const iconStyle = new ol.style.Style({
								image: new ol.style.Icon({
									src: selectedWeatherData.icon,
									scale: 0.5
								})
								});
								iconFeature.setStyle(iconStyle);
								iconLayer.getSource().addFeature(iconFeature);
								map.getView().animate({
								center: ol.proj.fromLonLat(selectedWeatherData.coordinates),
								zoom: 10
								});
							} else {
								iconLayer.getSource().clear();
								map.getView().animate({
								center: ol.proj.fromLonLat([0, 0]),
								zoom: 2
								});
							}
							});
						// 创建天气温度覆盖物
						const temperatureOverlay = new ol.Overlay({
						element: document.getElementById('temperatureOverlay'),
						positioning: 'bottom-center',
						offset: [0, -10],
						stopEvent: false // 允许覆盖物接收事件
						});
						map.addOverlay(temperatureOverlay);

						// 在城市选择事件中更新天气温度覆盖物
						citySelect.addEventListener('change', function() {
						const selectedCity = citySelect.value;
						const selectedWeatherData = cityWeatherData.find(function(data) {
							return data.city === selectedCity;
						});

						if (selectedWeatherData) {
							// 更新覆盖物内容
							const temperatureElement = temperatureOverlay.getElement();
							temperatureElement.innerHTML = selectedWeatherData.temperature + '°C';

							// 更新覆盖物位置
							temperatureOverlay.setPosition(ol.proj.fromLonLat(selectedWeatherData.coordinates));
						} else {
							// 隐藏覆盖物
							temperatureOverlay.setPosition(undefined);
						}
						});
相关推荐
m0_敲代码的彭于晏1684 小时前
Vercel 前端部署平台深度评测
前端
2301_32241428044 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
怕浪猫6 小时前
外包和大厂的前端代码,差在凌晨三点
前端·面试·github
m0_敲代码的彭于晏1686 小时前
Vercel 前端部署与全栈开发实战指南
前端·状态模式
徐小夕6 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
贾伟康6 小时前
【化学实验室|17】HarmonyOS ArkTS 亮暗色与视觉令牌实战:集中颜色、间距和交互状态避免页面割裂
前端·移动开发·harmonyos·arkts·arkui
Csvn7 小时前
SSR/SSG/ISR(上):峡谷与渲染策略的时间预算
前端
Csvn7 小时前
SSR/SSG/ISR(下):可交互性、新鲜度与回源账
前端
酷炫码神8 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
Elcker10 小时前
YnuoAgent(依诺):一个 npm 包,跑起属于自己的 AI 研发平台
前端·人工智能·npm