uniapp 地图分幅网格生成 小程序基于map组件

// 获取小数部分
const fractional = function(x) {
	x = Math.abs(x);
	return x - Math.floor(x);
}
const formatInt = function(x, len) {
	let result = '' + x;
	len = len - result.length;
	while (len > 0) {
		result = '0' + result;
		len--;
	}
	return result;
}

/**
 * 创建标准分幅网格
 * @param west,south,east,north 传入要创建的标准分幅网格的经纬度范围
 * @param scalem 表示比例尺的分母(例如 10000 表示 1:1万)
 * @returns 返回一个 geojson 对象
 */
export function makeStandardMapGrids(west, south, east, north, scalem) {
	let lngDiff = 0;
	let latDiff = 0;
	let scaleCode = '';
	switch (scalem) {
		case 1000000:
			lngDiff = 6;
			latDiff = 4;
			break;
		case 500000:
			lngDiff = 3;
			latDiff = 2;
			scaleCode = 'B';
			break;
		case 250000:
			lngDiff = 1.5;
			latDiff = 1;
			scaleCode = 'C';
			break;
		case 100000:
			lngDiff = 0.5;
			latDiff = 1 / 3;
			scaleCode = 'D';
			break;
		case 50000:
			lngDiff = 0.25;
			latDiff = 1 / 6;
			scaleCode = 'E';
			break;
		case 25000:
			lngDiff = 0.125;
			latDiff = 1 / 12;
			scaleCode = 'F';
			break;
		case 10000:
			lngDiff = 0.0625;
			latDiff = 1 / 24;
			scaleCode = 'G';
			break;
		case 5000:
			lngDiff = 0.03125;
			latDiff = 1 / 48;
			scaleCode = 'H';
		case 2000:
			lngDiff = 37.5 / 3600.0;
			latDiff = 25.0 / 3600.0;
			scaleCode = 'I';
			break;
		case 1000:
			lngDiff = 18.75 / 3600.0;
			latDiff = 12.5 / 3600.0;
			scaleCode = 'J';
			break;
		case 500:
			lngDiff = 9.375 / 3600.0;
			latDiff = 6.25 / 3600.0;
			scaleCode = 'K';
			break;
		default:
			return null;
	}
	const GridX0 = -180;
	const GridX1 = 180;
	const GridY0 = -88;
	const GridY1 = 88;
	let x0 = Math.max(GridX0, west);
	let y0 = Math.max(GridY0, south);
	let x1 = Math.min(GridX1, east);
	let y1 = Math.min(GridY1, north);
	if (((x1 - x0) < lngDiff) || ((y1 - y0) < latDiff)) {
		return null;
	}

	let features = []; // 存储生成的面要素
	let coordinates = [] // 存储生成的面要素坐标对
	// 计算标准分幅网格行列范围
	const col0 = parseInt((x0 - GridX0) / lngDiff);
	const col1 = parseInt((x1 - GridX0) / lngDiff);
	const row0 = parseInt((y0 - GridY0) / latDiff);
	const row1 = parseInt((y1 - GridY0) / latDiff);
	const millionRowCode = 'ABCDEFGHIJKLMNOPQRSTUV';
	for (let row = row0; row <= row1; row++) {
		let gy0 = GridY0 + row * latDiff;
		let gy1 = gy0 + latDiff;
		let gcy = (gy0 + gy1) * 0.5; // 分幅中心点 y 坐标
		let millionRow = parseInt((gy0 - 0) / 4); // 1:100分幅行号
		let Hemisphere = ''; // 北半球标志
		if (millionRow < 0) {
			millionRow = -1 - millionRow;
			Hemisphere = 'S'; // 南半球标志
		}
		for (let col = col0; col <= col1; col++) {
			let gx0 = GridX0 + col * lngDiff;
			let gx1 = gx0 + lngDiff;
			let gcx = (gx0 + gx1) * 0.5; // 分幅中心点 x 坐标
			let millionCol = parseInt((gcx - GridX0) / 6) + 1; // 1:100分幅列号(从1开始)
			coordinates = [
				[
					[gx0, gy0],
					[gx1, gy0],
					[gx1, gy1],
					[gx0, gy1],
					[gx0, gy0]
				]
			];
			millionCol = (millionCol < 10) ? ('0' + millionCol) : millionCol;
			let gridID = Hemisphere + millionRowCode[millionRow] + millionCol;
			if (scaleCode != '') {
				// 计算当前分幅在 1:100万 分幅内的行列号(注意,这里行列号从左向右,从北向南,从1开始编号)
				let colID = parseInt((fractional((gcx - GridX0) / 6) * 6) / lngDiff) + 1;
				let rowID = parseInt((fractional((GridY1 - gcy) / 4) * 4) / latDiff) + 1;
				gridID += scaleCode + formatInt(rowID, 3) + formatInt(colID, 3);
			}
			// 生成矢量要素(几何信息+属性信息)
			let feature = {
				type: "Feature",
				geometry: {
					type: "Polygon",
					coordinates: coordinates
				},
				properties: {
					ID: gridID,
					extend: '西:' + gx0 + ' 东:' + gx1 + ' 南:' + gy0 + ' 北:' + gy1,
					lat: gcy.toFixed(6),
					lng: gcx.toFixed(6)
				},
				location: {
					latitude: Number(gcy.toFixed(6)),
					longitude: Number(gcx.toFixed(6)),
				}
			};
			features.push(feature);
		}
	}
	return {
		type: "FeatureCollection",
		features: features
	};
}

 我国把 1:1 万、1:2.5 万、1:5 万、1:10 万、1:25 万、1:50 万、1:100 万 7 种比例尺作为国家基本地图的比例尺系列。根据国家标准GB/13989-92 《国家基本比例尺地形图分幅和编号》规定,我国基本比例尺地形图均1:100 万地形图为基础,按规定的经差和纬差划分图幅。下表为地形图的经纬差、行列数及图幅数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

unity数组

数组的定义 动态初始化:在定义数组时只指定数组的长度&#xff0c;由系统自动为元素赋初值的方式。 静态初始化:定义数组的同时就为数组的每个元素赋值 数组的静态初始化有两种方式 1、类型门数组名new 类型[]{元素&#xff0c;元素&#xff0c;…}; 2、类型[数组名{元素&am…

SSL数字证书

SSL数字证书产品提供商主要来自于国外&#xff0c;尤其是美国&#xff0c;原理和使用操作系统一样&#xff0c;区别在于SSL数字证书目前无法替代性&#xff0c;要想达到兼容性99%的机构目前全球才3-4家&#xff0c;目前国内的主流网站主要使用的是国际证书&#xff0c;除了考虑…

爬虫 新闻网站 以湖南法治报为例(含详细注释) V4.0 升级 自定义可任意个关键词查询、时间段、粗略判断新闻是否和优化营商环境相关,避免自己再一个个判断

目标网站&#xff1a;湖南法治报 爬取目的&#xff1a;为了获取某一地区更全面的在湖南法治报的已发布的和优化营商环境相关的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&a…

K8S哲学 - kubectl

Kubectl is the Kubernetes cli version of a swiss army knife, and can do many things. Kubernetes coordinates a highly available cluster of computers that are connected to work as a single unit k8s production-ready. 概念 kubectl 和 Kubernetes API 区别

使用Docker Registry-v2搭建镜像仓库详细教程

我们使用docker来部署私有化镜像仓库… 1、下载 registry:v2 镜像 docker pull registry:22、在私有仓库所在的主机目录新建一个文件夹&#xff0c;用于持久化保存仓库中的镜像 mkdir -p /opt/registry3、启动registry镜像 使用docker镜像启动私有仓库容器服务&#xff0c;…

【azure笔记 1】容器实例管理python sdk封装

容器实例管理python sdk封装 测试结果 说明 这是根据我的需求写的&#xff0c;所以有些参数是写死的&#xff0c;比如cpu核数和内存&#xff0c;你可以根据你的需要自行修改。前置条件&#xff1a; 当前环境已安装python3.8以上版本和azure cli并且已经登陆到你的账户 依赖安…

网络基础三——IP协议补充和Mac帧协议

全球网络及网段划分的理解 ​ 根据国家组织地区人口综合评估进行IP地址范围的划分&#xff1b; ​ 假设前8位用来区分不同的国家&#xff0c;国际路由器负责全球数据传输&#xff0c;子网掩码为IP/8&#xff1b;次6位区分不同的省份&#xff0c;国内路由器负责全国数据的传输…

【CSS】MDN

一、CSS构建 1.1 CSS选择器 1.1.1 元素选择器 标签不区分大小写 示例&#xff1a; span {background-color: yellow; }1.1.2 通用选择器 选择文档中所有内容&#xff0c;重置样式表中使用较多 鉴于div:first-child&#xff08;代表所有的div元素&#xff0c;并且是第一个…

杨辉三角形(蓝桥杯,acwing)

题目描述&#xff1a; 下面的图形是著名的杨辉三角形&#xff1a; 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下数列&#xff1a; 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, ... 给定一个正整数 N&#xff0c;请你输出数列中第一次出现…

OpenAI曾转录100万小时视频数据,训练GPT-4

4月7日&#xff0c;纽约时报在官网发布了一篇名为《科技巨头如何挖空心思&#xff0c;为AI收集数据》的技术文章。 纽约时报表示&#xff0c;OpenAI曾在2021年几乎消耗尽了互联网有用的文本数据源。为了缓解训练数据短缺的难题&#xff0c;便开发了知名开源语音识别模型Whispe…

Windows完全卸载MySQL后再下载安装(附安装包)

目录 友情提醒第一章&#xff1a;如何完全卸载干净mysql教程&#xff08;三个步骤完全卸载&#xff09;1&#xff09;步骤一&#xff1a;卸载程序2&#xff09;步骤二&#xff1a;删除文件3&#xff09;步骤三&#xff1a;删除注册表信息 第二章&#xff1a;下载软件两种方式1&…

langchain LCEL,prompt模块,outputparse输出模块

目录 基本代码 prompt模块 prompt模版控制长度 outputparse格式化输出 LangChain表达式语言&#xff0c;或者LCEL&#xff0c;是一种声明式的方式&#xff0c;可以轻松地将链条组合在一起 langchian 可以使用 通义千问&#xff0c;我们用通义千问&#xff0c;用法也要申请…

Java语言实现文件分割与合并

一&#xff1a; 题目&#xff1a; 写一个方法,将feige.exe文件分割为每份1MB大小的若干份(最后一份可以不满1MB), 存储在一个temp的文件夹中(每份文件名自己定义,例如1.temp 2.temp), 然后再写一个方法,将temp文件夹中的若干份合并为一个文件fg.exe 代码&#xff1a; main…

FreeGPT3.5 开源软件

GPT-3.5不需要付费&#xff0c;也不需要注册用户&#xff0c;可以直接使用了&#xff0c;官方彻底开放了API接口。 该API政策一放开&#xff0c;GitHub很快就已经出现了一个开源项目FreeGPT35&#xff0c;可以自动生成key调用GPT3.5的API接口&#xff0c;再也用不着注册账号和申…

「51媒体」中小初创企业如何做好媒体宣传?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 中小初创企业在做媒体宣传时&#xff0c;由于通常资源有限&#xff0c;需要更加精明地使用外部资源来提升品牌知名度和业务成长。利用专业的媒体服务商可以是一个非常有效的方法。 明确目…

Android OOM问题定位、内存优化

一、常用工具&#xff1a; 1、LeakCanary val refWatcher: RefWatcher? TestApp.getRefWatcher(activity) refWatcher?.watch(activity);//检测是否有泄露&#xff0c;即触发GC回收&#xff0c;看activity是否被回收&#xff0c;没有被回收就是泄露了。 二、常见的几种内…

CSS aspect-ratio属性设置元素宽高比

aspect-ratio 是CSS的一个属性&#xff0c;用于设置元素的期望宽高比。它设置确保元素保持特定的比例&#xff0c;不受其内容或容器大小的影响。 语法&#xff1a; aspect-ratio: <ratio>;其中 <ratio> 是一个由斜杠&#xff08;/&#xff09;分隔的两个数字&…

【机器学习】一文掌握机器学习十大分类算法(上)。

十大分类算法 1、引言2、分类算法总结2.1 逻辑回归2.1.1 核心原理2.1.2 算法公式2.1.3 代码实例 2.2 决策树2.2.1 核心原理2.2. 代码实例 2.3 随机森林2.3.1 核心原理2.3.2 代码实例 2.4 支持向量机2.4.1 核心原理2.4.2 算法公式2.4.3 代码实例 2.5 朴素贝叶斯2.5.1 核心原理2.…

CPU问题排查

经常发现生产环境CPU运行很高&#xff0c;我们想知道到底是什么代码这么消耗CPU TOP命令 此时我们经常使用top来找到 CPU 使用率比较高的一些线程 容器中的docker 备注&#xff1a; 如果是docker 中的top命令。需要关注&#xff0c;一般来说不需要&#xff0c;挂载内容的多…

SQL注入sqli_libs靶场第一题

第一题 联合查询 1&#xff09;思路&#xff1a; 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限&#xff0c;爆库&#xff0c;爆版本号 爆表&#xff0c;爆列&#xff0c;爆账号密码 2&#xff09;解题过程&#xff1…