uniapp 整合 OpenLayers - 加载Geojson数据(在线、离线)

news2025/1/15 7:30:21

Geojson数据是矢量数据,主要是点、线、面数据集合

Geojson数据获取:DataV.GeoAtlas地理小工具系列

实现代码如下:

<template>
	<!-- 监听变量 operation 的变化,operation 发生改变时,调用 openlayers 模块的 loadOperation 方法 -->
	<view :operation="valueChangeSign" :change:operation="ol.valueChange" type="default"></view>
	<view class="map" id="map">
		<view class="bottom-horizontal-button">
			<button @click="location()" class="btn" type="primary">定位</button>
		</view>
	</view>
</template>

<script>

	export default {
	
		data() {
			return {
				valueChangeSign:{
					flag:false,
					latitude:null,//纬度
					longitude:null,//经度
					path:null,//本机路径
				},
			}
		},
		mounted(){
			this.getBootPath();
		},
		onLoad() {
			
		},
		methods: {
			getBootPath() {
				
			},
			/**
			 * 点击事件-定位
			 * */
			 location(){
				 
				// 获取经纬度
				uni.getLocation({
					type: 'wgs84 ',
					success: (res) => {
						//console.log("res",res)
						this.valueChangeSign.flag = !this.valueChangeSign.flag;
						this.valueChangeSign.latitude = res.latitude//接收纬度值
						this.valueChangeSign.longitude = res.longitude//接收经度值
					}
				});  
				
			 },
		}
	}
</script>
<script module="ol" lang="renderjs" type="module">
import Map from 'ol/Map';
import View from 'ol/View';
import { transform } from 'ol/proj.js';
import { ScaleLine, defaults as defaultControls, MousePosition } from 'ol/control.js';
import { Circle as CircleStyle, Style, Stroke, Fill, Icon } from "ol/style.js";
import { Vector as VectorLayer } from 'ol/layer.js';
import { Vector as VectorSource } from 'ol/source.js';
import Feature from 'ol/Feature.js';
import Point from 'ol/geom/Point.js';
import GeoJSON from 'ol/format/GeoJSON.js';

	export default {
		data(){
			return {
				map:null,
				view:null,
				locationLayer:null,// 定位点图层
			}
		},
		mounted(){
			this.initMap();
		},
		methods:{
			/**
			 * @param {*} newValue 新的值或状态
			 * @param {*} oldValue 旧的值或状态
			 * @param {*} ownerInstance 拥有该数据或组件的实例
			 * @param {*} instance 当前操作的具体实例
			 */
			valueChange(newValue, oldValue, ownerInstance, instance){
				console.log(newValue, oldValue, ownerInstance, instance);
				
				const olLongitude = newValue.longitude;//当前位置的经度
				const olLatitude = newValue.latitude;//当前位置的纬度
// 
				// 调用定位按钮
				this.lxLocation(olLongitude,olLatitude);
			},
			initMap(){
				// 数据源
				const geojsonSource = new VectorSource({
					format:new GeoJSON(),
					//在线加载geojson数据
					//url:"https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=100000_full"
					// 离线加载geojson数据
					// 1.先将mapData.json数据放在项目的static/datas文件夹中
					// 2.运行时,访问路径如下所示
					url:'../www/static/datas/mapData.json'
				});
				
				// 图层
				const geojsonLayer = new VectorLayer({
					name: 'geojson图层',
					source: geojsonSource,
					// 样式-不写样式就是范围线
					style: new Style({
						fill: new Fill({
							color: 'rgba(10, 20, 255, 0.1)',
						})
					}),
					zIndex: 3,
				})
				

				
				this.map = new Map({
				  target: 'map',
				  layers:[geojsonLayer],
				  view: new View({
					projection:'EPSG:3857',
					center: transform([125.33,43.90], 'EPSG:4326','EPSG:3857',),
					zoom: 3,
				    minZoom: 1,// 最小缩放级别
				    maxZoom: 18, //最大缩放级别
				    constrainResolution: true,// 因为存在非整数的缩放级别,所以设置该参数为true来让每次缩放结束后自动缩放到距离最近的一个整数级别,这个必须要设置,当缩放在非整数级别时地图会糊
					enableRotation: false,// 禁止地图旋转
				  }),
				  controls:defaultControls({
					  zoom:false,//不显示放大放小按钮
					  rotate:false,// 不显示指北针控件
					  attribution:false//不显示右下角的地图信息控件
				  }).extend([
					// 比例尺
					new ScaleLine({
						//设置比例尺单位,degrees、imperial、us、nautical、metric(度量单位)
						units: "metric"
					})
				  ])
				});
				
			
			},
			lxLocation(longitude,latitude){// 定位
				const geom = transform([longitude,latitude], 'EPSG:4326', 'EPSG:3857');
				
				// 设置中心点定位-直接定位
				//this.map.getView().setCenter(geom);
				// 设置层级
				//this.map.getView().setZoom(18);
				
				// 设置中心点-过渡动画
				this.map.getView().animate({
					center:geom,// 中心点
					zoom:12,// 层级
					duration:1000// 持续时间
				});
				
				
				// 绘制点
				const locationPoint = new Point(geom);
				// 清除绘制点图层
				this.map.removeLayer(this.locationLayer); 
				
				// 绘制定位点
				// 设置点特征(Feature)
				const pointFeature = new Feature({
					title:"point",
					geometry:locationPoint
				});
				
				// 设置特征样式(style)
				pointFeature.setStyle(
					new Style({
						 // 使用 CircleStyle 创建一个圆形的点
						 image:new CircleStyle({
							 // 点样式
							 fill:new Fill({
								 //color:"red",// 颜色
								 color: 'rgba(255,0,0,0.4)',
							 }),
							 // 点周边样式
							 stroke:new Stroke({
								color: '#3399CC',
								width: 1.25, 
							 }),
							 radius:7,// 半径
						 }),
					})
				);
				// 创建和添加特征到源(Source)
				// VectorSource表示一个矢量要素源,它用于存储和显示地理数据。
				const source = new VectorSource();
				source.addFeature(pointFeature);
				// 创建图层并设置源(Layer)
				// VectorLayer表示一个矢量图层,它由一系列矢量要素(Feature)组成,用于在地图上显示地理数据。
				this.locationLayer = new VectorLayer();
				this.locationLayer.setSource(source);
				this.map.addLayer(this.locationLayer);
			},
			
			
		}
		
	}

</script>

<style scoped lang="scss">
	/*去除顶部导航栏*/
	*{margin:0;padding:0}
	.map{
	  width:100vw;
	  height: 100vh;
	  position: relative;
	  z-index: 1;
	}
	
	.bottom-horizontal-button{
		  position: absolute;
		  bottom: 0;
		  right: 0;
		  margin-bottom: 30rpx;
		  width: 80rpx;
		  z-index: 10;
		.btn {
			width: auto;
			height: auto;
			margin: 5px; /* 按钮间距 */
			padding: 10px; /* 按钮内部填充 */
			width: 80%; /* 按钮宽度 */
			text-align: center; /* 按钮文字居中 */
		 }
	}
</style>

 注意:

在官方基座,上面的代码运行没有问题,但是打包的APP就无法加载离线地图了。

因为,打包后app文件夹中,WWW文件目录没有了,这样就会导致openlayer的相对路径失效,从而无法加载离线地图。

解决的办法:

manifest.json添加配置

"runmode": "liberate",/*(默认为normal)*/

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

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

相关文章

牛只行为及种类识别数据集18g牛只数据,适用于多种图像识别,目标检测,区域入侵检测等算法作为数据集。数据集中包括牛只行走,站立,进食,饮水等不同类型的数据

18g牛只数据&#xff0c;适用于多种图像识别&#xff0c;目标检测&#xff0c;区域入侵检测等算法作为数据集。 数据集中包括牛只行走&#xff0c;站立&#xff0c;进食&#xff0c;饮水等不同类型的数据&#xff0c;可以用于行为检测 数据集中包含多种不同种类的牛只&#xff…

Eking管理易 Html5Upload 前台任意文件上传漏洞复现

0x01 产品描述&#xff1a; ‌Eking管理易是一款专为广告制品制作企业量身定制的管理软件产品&#xff0c;旨在帮助企业实现规范化、科学化管理&#xff0c;提升运营效率和降低运营成本。‌ 该软件由广州易凯软件技术有限公司开发&#xff0c;基于JAVA企业版技术研发&#xff0…

CSS 入门

1. CSS 1.1 概念 CSS&#xff08;Cascading Style Sheet&#xff09;&#xff0c;层叠样式表&#xff0c;用于控制页面的样式 CSS 能够对网页中元素位置的排版进行像素级精确控制&#xff0c;实现美化页面的效果&#xff0c;能够做到页面的样式和结构分离&#xff08;类似于…

Wi-Fi数据帧类别

网络中传送的业务数据对服务质量&#xff08;QualityofService&#xff0c;QoS&#xff09;有不同的要求&#xff0c;例如语音业务需要实时被传送&#xff0c;它对时延的大小很敏感。当W-Fi MAC层在同时传输语音业务和普通业务的数据时&#xff0c;语音业务就需要被高优先级发送…

当下的时代?

我这两天刚接触一个人,错误之皇,每做一件小事的时候他都像救命稻草一样抓着,有一天我一看,嚯,好家伙,他抱着的是已经让我仰望的参天大树了! 这个时代需要我们从无限思维的视角和做法去努力&#xff1b;它不取决于我们现在有多少&#xff0c;而取决于我们未来的成长幅度是多少&a…

动态规划算法专题(七):两个数组的dp问题

目录 1、最长公共子序列 1.1 算法原理 1.2 算法代码 2、不相交的线 2.1 算法原理 2.2 算法代码 3、不同的子序列 3.1 算法原理 3.2 算法代码 4、通配符匹配&#xff08;hard ★★★&#xff09; 4.1 算法原理 4.2 算法代码 5、正则表达式匹配&#xff08;hard ★…

Vue-admin-box后台管理框架

文章目录 1、项目概述2、技术栈3、 特色功能4、基础模板5、 项目演示6、 源码地址7、 演示地址8、小结Vue-Admin-Box,一款精心打造的Vue.js后台管理模板,旨在为开发者提供高效、美观且易于扩展的后台解决方案。它集成了现代Web开发的最佳实践,包括响应式设计、模块化开发、丰…

服务器数据恢复—服务器宕机导致挂载的V7000存储文件系统损坏的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台挂载在Windows server服务器上的v7000存储。存储空间划分了一个分区&#xff0c;采用NTFS文件系统&#xff0c;存放oracle数据库。 服务器存储故障&#xff1a; 服务器在运行过程中宕机&#xff0c;于是管理员重启服务器。服务器进入系…

针对珠宝,手表等配饰的高保真虚拟试穿解决方案IDM-VTON

今天给大家介绍一种针对配饰的高保真虚拟试穿解决方案IDM-VTON&#xff0c;该方案旨在填补当前虚拟试穿技术在高端配饰&#xff08;如珠宝和手表&#xff09;领域的空白。现有的虚拟试穿模型主要集中在服装上&#xff0c;IDM-VTON结合了2D虚拟试穿技术与其他计算机视觉模型&…

N1安装grafana

apt-get install -y adduser libfontconfig1 musl wget https://dl.grafana.com/enterprise/release/grafana-enterprise_10.0.10_arm64.debdpkg -i grafana-enterprise_10.0.10_arm64.debsystemctl daemon-reload systemctl enable grafana.service --now ip:3000 默认密码…

[Linux] 层层深入理解文件系统——(3)磁盘组织存储的文件

标题&#xff1a;[Linux] 层层深入理解文件系统——&#xff08;3&#xff09;磁盘组织组织存储的文件 个人主页水墨不写bug 目录 一、磁盘中的文件 1&#xff09;磁盘的物理结构 2&#xff09;磁盘的CHS寻址法 3&#xff09;磁盘的空间管理 二、磁盘如何组织存储文件 三…

止步阿里一面。。。

时间过的真快&#xff0c;转眼间国庆已经过去一周了&#xff0c;又到了新的一周&#xff0c;继续分享最新的面经。 今天分享的是粉丝在阿里巴巴的一面&#xff0c;考察了数据库、redis、kafka、ES和项目&#xff0c;数据库和redis不用多说&#xff0c;项目必用面试必考&#x…

【隐私计算篇】替换半同态使用全同态加速计算联邦机器学习算法的实证分析

1. 背景介绍 联邦学习&#xff08;Federated Learning&#xff0c;FL&#xff09;是隐私计算中常见的一种技术范式&#xff0c;其本质是一种面向可信数据流通的分布式机器学习框架&#xff0c;允许多个参与方在不共享其本地数据的前提下&#xff0c;协同训练机器学习模型。与传…

Python | Leetcode Python题解之第479题最大回文数乘积

题目&#xff1a; 题解&#xff1a; class Solution:def largestPalindrome(self, n: int) -> int:if n 1:return 9upper 10 ** n - 1for left in range(upper, upper // 10, -1): # 枚举回文数的左半部分p, x left, leftwhile x:p p * 10 x % 10 # 翻转左半部分到其…

【C语言刷力扣】1748.唯一元素的和

题目&#xff1a; 法一 解题思路&#xff1a; 由于 nums.length 小于100&#xff0c;新建数组 num[101]&#xff0c;用来遍历存放 nums[i]出现的次数。 int sumOfUnique(int* nums, int numsSize) {int result 0;int num[101] {0}; // memset(num, 0, sizof(num));for (int…

写一个菜谱网站,数据库应该怎么设计?AI回答我动手!

大部分问题使用chatglm4-9b进行回答&#xff0c;总体效果不错&#xff0c;大家可以来试试。关于如何使用ChatGLM4-9b模型&#xff0c;可以参考&#xff1a;在启智AI平台实践ChatGLM4-9B聊天机器人MindSpore-CSDN博客 设计数据库 问题 写一个菜谱网站&#xff0c;数据库应该怎…

mongodb-7.0.14分片副本集超详细部署

mongodb介绍&#xff1a; 是最常用的nosql数据库&#xff0c;在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb&#xff08;分片副本&#xff09;集群。 环境准备 系统系统 BC 21.10 三台服务器&#xff1a;192.168.123.247/248/249 安装包&#xff1a…

STM32L010F4 最小系统设计

画一个 STM32L010F4 的测试板子...... by 矜辰所致前言 最近需要用到一个新的 MCU&#xff1a; STM32L010F4 &#xff0c;上次测试的 VL53L0X 需要移植到这个芯片上&#xff0c;网上一搜 STM32L010F4&#xff0c;都是介绍资料&#xff0c;没有最小系统&#xff0c;使用说明等。…

element plus的el-select分页

摘要&#xff1a; el-select的数据比较多的时候&#xff0c;必须要分页&#xff0c;处理方案有全部数据回来&#xff0c;或者添加搜索功能&#xff0c;但是就有个问题就是编辑的时候回显问题&#xff0c;必须要保证select的数据有对应的id与name匹配回显&#xff01; <el-fo…

Pytest基于fixture的参数化及解决乱码问题

我们知道&#xff0c;Pytest是Python技术栈下进行自动化测试的主流测试框架。支持灵活的测试发现、执行策略&#xff0c;强大的Fixture夹具和丰富的插件支持。 除了通过pytest的parametrize标签进行参数化外&#xff0c;我们通过fixture的param参数也可以比较方便地实现参数化…