chatgpt:栅格化原理和代码

栅格化原理

把某个点根据经纬度放在整数经纬度记录的格子里,并把格子编号与点对应起来。

第一步确定每个格子的长和宽,即经度变化量和纬度变换量:

假设测试点的经纬度是(114度, 22.5度)

划定栅格划分的经纬度范围(大范围)为
经度范围:lon1=113.75194度,lon2=114.624187度
纬度范围:lat1=22.447837度,lat2=22.864748度
则中间点的经纬度是((lon1+lon2)/2, (lat1+lat2)/2)

那么起始点为经度和纬度取小的那个点
(latstart,lonstart)=(min(lat1,lat2),min(lon1,lon2))

规定每个栅格的大小(单位m)为500m,
下面来计算每个栅格的经度变化量和纬度变化量

假设地球是一个半径为R的圆,
那么地球的(lon1+lon2)/2度的经度圈的半径为R,绕其走一圈,路程为2* pi* R,纬度变化量为360度;

地球的(lat1+lat2)/2度的纬度圆的半径为R* cos((lat1+lat2)/2),绕其走一圈,路程为2* pi* R* cos((lat1+lat2)/2),经度变化量为360度。

在这里插入图片描述

则可以得到一组对应关系
纵向变化路程与纬变化量对应关系:2* pi* R --> 360度;
横向变化路程与经度变化量对应关系:2* pi* R* cos((lat1+lat2)/2) --> 360度。

那么纵向路程为500m时,纬度变化量为(500* 360度)/2* pi* R
横向路程为500m时,经度变化量为(500* 360度)/2* pi* R* cos((lat1+lat2)/2)

接着计算测试点(114度, 22.5度)所在栅格的经纬度编号
经度栅格编号=(114度-(起始点经度-栅格经度变化量/2))/栅格经度变化量
这里减的是(起始点经度-栅格经度变化量/2),因为这里假设起始点是其所在栅格的右上角点,(起始点经度-栅格经度变化量/2)是起始点所在栅格中心点的经度。
纬度栅格编号同理

计算测试点所在栅格的中心点的经纬度
中心点经度 = 测试点所在栅格编号*栅格经度变化量 +起始点所在栅格中心点经度
中心点纬度同理

#栅格化代码
import math
#定义一个测试点的经纬度
testlon = 114
testlat = 22.5#划定栅格的划分范围
lon1 = 113.75194
lon2 = 114.624187
lat1 = 22.447837
lat2 = 22.864748latStart = min(lat1, lat2);
lonStart = min(lon1, lon2);#定义每个栅格大小(单位m)
accuracy = 500;#计算每个栅格的经纬度增加量大小▲Lon和▲Lat
deltaLon = accuracy * 360 / (2 * math.pi * 6371004 * math.cos((lat1 + lat2) * math.pi / 360));
deltaLat = accuracy * 360 / (2 * math.pi * 6371004);#计算测试点所在栅格的经纬度编号
LONCOL=divmod(float(testlon) - (lonStart - deltaLon / 2) , deltaLon)[0]
LATCOL=divmod(float(testlat) - (latStart - deltaLat / 2) , deltaLat)[0]#计算测试点所在栅格的中心点经纬度
HBLON = LONCOL*deltaLon + (lonStart - deltaLon / 2)#格子编号*格子宽+起始横坐标-半个格子宽=格子中心横坐标
HBLAT = LATCOL*deltaLat + (latStart - deltaLat / 2)# 测试点所在栅格经纬度编号,测试点所在栅格中心点经纬度,每个栅格的经纬度变化量
LONCOL,LATCOL,HBLON,HBLAT,deltaLon,deltaLat

按照指定度数进行栅格化

import numpy as npdef wgs84_grid(lat_min, lat_max, lon_min, lon_max, grid_size):"""将指定的 WGS84 坐标系下的区域栅格化"""# 计算经度和纬度的划分数量lat_steps = int(np.ceil((lat_max - lat_min) / grid_size))lon_steps = int(np.ceil((lon_max - lon_min) / grid_size))# 构造栅格网格latitudes = np.linspace(lat_min, lat_max, lat_steps+1)longitudes = np.linspace(lon_min, lon_max, lon_steps+1)grid = np.zeros((lat_steps, lon_steps), dtype=bool)# 遍历每个栅格,判断其是否在指定区域内for i in range(lat_steps):for j in range(lon_steps):lat1, lat2 = latitudes[i], latitudes[i+1]lon1, lon2 = longitudes[j], longitudes[j+1]# 判断当前栅格是否与指定区域相交if lat1 <= lat_max and lat2 >= lat_min and lon1 <= lon_max and lon2 >= lon_min:grid[i,j] = Truereturn grid, latitudes, longitudes# 测试代码
if __name__ == '__main__':# 北京市范围:39.442758, 40.215446, 115.420363, 117.507645# 栅格大小:0.05 度grid, latitudes, longitudes = wgs84_grid(39.442758, 40.215446, 115.420363, 117.507645, 0.05)print('Grid shape:', grid.shape)print('Latitude steps:', len(latitudes))print('Longitude steps:', len(longitudes))print('Grid:\n', grid)

按照指定距离进行栅格化

import numpy as np
from geopy import distancedef wgs84_grid_by_distance(lat_min, lat_max, lon_min, lon_max, grid_size):"""将指定的 WGS84 坐标系下的区域栅格化"""# 计算经度和纬度的划分数量dist_lat = distance.distance((lat_min, lon_min), (lat_max, lon_min)).kmdist_lon = distance.distance((lat_min, lon_min), (lat_min, lon_max)).kmlat_steps = int(np.ceil(dist_lat / grid_size))lon_steps = int(np.ceil(dist_lon / grid_size))# 构造栅格网格latitudes = np.linspace(lat_min, lat_max, lat_steps+1)longitudes = np.linspace(lon_min, lon_max, lon_steps+1)grid = np.zeros((lat_steps, lon_steps), dtype=bool)# 遍历每个栅格,判断其是否在指定区域内for i in range(lat_steps):for j in range(lon_steps):lat1, lat2 = latitudes[i], latitudes[i+1]lon1, lon2 = longitudes[j], longitudes[j+1]# 判断当前栅格是否与指定区域相交if lat1 <= lat_max and lat2 >= lat_min and lon1 <= lon_max and lon2 >= lon_min:grid[i,j] = Truereturn grid, latitudes, longitudes# 测试代码
if __name__ == '__main__':# 北京市范围:39.442758, 40.215446, 115.420363, 117.507645# 栅格距离:1 公里grid, latitudes, longitudes = wgs84_grid_by_distance(39.442758, 40.215446, 115.420363, 117.507645, 1)print('Grid shape:', grid.shape)print('Latitude steps:', len(latitudes))print('Longitude steps:', len(longitudes))print('Grid:\n', grid)

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

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

相关文章

最强解释!Python 包的依赖管理,有解了!

来源丨网络 之前一直比较抵触用 Python &#xff0c;很大一部分原因是觉得 Python 项目的环境管理比较混乱。Node.js 有 Npm 包管理工具&#xff0c;通过 package.json 配置项目依赖&#xff0c;最多再通过 nvm 来进行环境切换&#xff1b;Java 有 Maven Gradle 来进行包管理和…

Python小白如何利用GPT4快速开发一个网站!

这个是一个全栈的项目&#xff0c;麻雀虽小&#xff0c;五脏俱全&#xff01;全程都是利用gpt4进行辅助编程搞定的。第一版其实非常快&#xff0c;大概30分钟就搞定了&#xff0c;后续就是不断的添砖加瓦&#xff0c;增加功能和优化UI。 其实很多小白都在说要学Python&#xff…

大文件不好处理?用 Python 盘它!

点击上方“菜鸟学Python”&#xff0c;选择“星标”公众号 超级无敌干货&#xff0c;第一时间送达&#xff01;&#xff01;&#xff01; 来源&#xff1a;https://blog.csdn.net/lemonbit/article/details/126326509 为了进行并行处理&#xff0c;我们将任务划分为子单元。它增…

“一言”槽点满满 “千帆”下海收费

把公开发布会改成了闭门沟通会&#xff0c;百度“文心千帆”大模型平台没能享受到“文心一言”的焦点待遇&#xff0c;低调发布了。 从性能看&#xff0c;主要面向B端客户的文心千帆较文心一言更重量级&#xff1a;不仅涵盖了文心一言的能力&#xff0c;还提供全套文心大模型以…

生成式AI的“子弹”还能再飞一会儿 | 热点探析

由ChatGPT引发的人工智能热潮&#xff0c;近期仍在继续。 在一封来自“未来生命研究所”的公开信发布&#xff0c;将热度稍退的人工智能又推上热潮。 公开信指出“只有当我们确信它们的影响是积极的并且它们的风险是可控的时候&#xff0c;才应该开发强大的人工智能系统。因此…

OpenAI现场演示官方版AutoGPT!创作画画发推一条龙,自主调用外部应用完成任务...

丰色 明敏 发自 凹非寺量子位 | 公众号 QbitAI OpenAI官方AutoGPT&#xff0c;要来了&#xff01; 就在AutoGPT项目破10万Star之际&#xff0c;OpenAI也放出重磅炸弹&#xff0c;由联合创始人格雷格布洛克曼&#xff08;Greg Brockman&#xff09;亲自现场演示了ChatGPT即将上线…

这个Chrome 插件,让你的GPT无比丝滑!

ChatGPT的官网最近几天报错越来越频繁了&#xff0c;相信大家都发现了。 一旦你离开页面时间比较久&#xff0c;再度返回跟它进行对话&#xff0c;就会出现如下报错&#xff1a; 虽然这个报错信息以前也出现过&#xff0c;但现在的频率确实过高&#xff0c;对于每天需要使用 Ch…

【用tk写小游戏系列】用tk自制小游戏【有奖问答】

程序效果如图。 代码如下。 # -*coding:UTF-8*- from tkinter import Tk,Button,Label import sys def dui():duiTk()dui.title("自制对话框")lableLabel(dui,text恭喜你&#xff0c;答对了&#xff01;)lable.pack()button3Button(dui,text好,commandbye)button3…

CocosCreator如何制作微信小游戏

CocosCreator在1.8版本开始&#xff0c;就支持一键发布微信小程序&#xff0c;下面是详细的发布步骤&#xff1a; 1、在微信公众平台下载微信开发者工具; 地址&#xff1a; https://mp.weixin.qq.com/debug/wxagame/dev/devtools/download.html?t2018115&#xff0c;根据需要选…

用Python制作小游戏

谁还没有玩过俄罗斯方块呢&#xff0c;这款单机小游戏&#xff0c;简单易懂&#xff0c;最好打发无聊时间了。 使用python除了可以爬取图片&#xff0c;视频&#xff0c;当然可以制作一些小游戏了。 其实这个很简单&#xff0c;就是转化数据很麻烦 ☹ 实际流程&#xff1a; …

基于QT的推箱子小游戏设计

基于QT的推箱子小游戏设计 目 录 1功能设计 1 1.1简介 1 1.2主要功能 1 2总体设计 2 2.1游戏流程 2 2.2设计思路 3 3具体实现 3 3.1 界面的设计 3 3.2 推箱子功能的实现 4 3.4按键函数调用 4 3.5绘图事件调用 4 4调试结果 6 4.1游戏主界面 6 4.2游戏帮助界面 7 4.3游戏选关界面…

控制台推箱子小游戏的实现

首先&#xff0c;这个推箱子&#xff0c;是在黑窗口实现的&#xff0c;界面不美观&#xff0c;有能力的写好了可以尝试图形化窗口easyx封装好 先来看看完整代码 #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <Windows.h> #…

基于C#制作一个飞机大战小游戏

此文主要基于C#制作一个飞机大战游戏,重温经典的同时亦可学习。 实现流程1、创建项目2、界面绘制3、我方飞机4、敌方飞机5、子弹及碰撞检测实现流程 1、创建项目 打开Visual Studio,右侧选择创建新项目。搜索框输入winform,选择windows窗体应用,填写对应的保存路径点击下一…

CCL2023-Eval | 汉语高考机器阅读理解对抗鲁棒评测正式开启,诚邀您积极参与

简介 机器阅读理解领域近年来取得了显著的发展成果&#xff0c;然而&#xff0c;在面向开放、动态、真实环境下的推理与决策时&#xff0c;模型鲁棒性仍有待提高。为此&#xff0c;山西大学自然语言处理团队基于“CCL2022-高考语文阅读理解可解释评测”数据集 GCRC 构建了对抗鲁…

Java对接钉钉机器人推送消息

自定义钉钉机器人推送使用 钉钉官方文档 使用场景 可用于替换短信发送节约成本&#xff0c;也可以将报警等消息推送到指定的钉钉群中 调用频率限制 由于消息发送太频繁会严重影响群成员的使用体验&#xff0c;因此钉钉开放平台对自定义机器人发送消息的频率作出以下限制&…

DingTalk「开发者说」 钉钉连接平台:打通企业数据孤岛的开发实践

钉钉连接平台简介 钉钉连接平台是什么&#xff1f; 简单来说&#xff0c;钉钉连接平台是打破企业系统数据孤岛的开发平台。钉钉连接平台通过统一的标准协议&#xff0c;接入各类应用和系统&#xff0c;并提供强安全、高可用、轻量化的连接能力&#xff0c;同时输出覆盖各类业…

JAVA对接钉钉

正文 公司要求对接钉钉&#xff0c;之前没对接过&#xff0c;相当于从0开始&#xff0c;记录一下对接的过程 1、访问钉钉官网 申请成为开发者 因为公司没对接过&#xff0c;所以我自己注册了一个公司&#xff08;公司名随便填&#xff0c;其他的按要求填就好&#xff09; …

java对接钉钉 发送/更新 互动卡片消息

java对接钉钉 发送/更新 互动卡片消息 一、准备工作二、发送互动卡片消息三、更新互动消息卡片 先看下效果图 点击相应的积分按钮&#xff0c;就会给对应的申请人发送对应的积分&#xff08;对接到我们自己的系统发送&#xff09;&#xff0c;审核完之后&#xff0c;按钮变成已…

PHP-钉钉扫码登录对接第三方网站

这个小功能对于企业内部的一些自用后台网站还是很常用的&#xff0c;对接也相对简单&#xff0c;记录下对接流程。 开发文档&#xff1a;扫码登录第三方网站 - 钉钉开放平台 1.先登录钉钉开发者后台&#xff0c;创建扫码登录应用授权 开发者后台统一登录 - 钉钉统一身份认证 …

TED1984-2019全部中英对照演讲稿集 学习英文演讲写作的好帮手

TED1984-2019全部中英对照演讲稿集 学习英文演讲写作的好帮手 一、TED简介&#xff1a; TED&#xff08;指Technology, Entertainment, Design在英语中的缩写&#xff0c;即技术、娱乐、设计&#xff09;是美国的一家私有非营利机构&#xff0c;该机构以它组织的TED大会著称&…