[Model.py 02] 地图按比例放大的实现

要求:实现地图按比例放大

分析:考虑到地图放大过程中需要保留河流道路这些物体的相对位置关系,这里选择将河流和道路这些物体的坐标矩阵合并成terrain_matrix并对这个合并后的矩阵进行缩放处理。放大后的矩阵,根据矩阵中标记的物体位置,更新各自物体的放大矩阵。

思路:对于地图按比例放大,借用图片放大的思路,使用最近邻插值的方式,填充放大后产生的空隙。

实现:

补充大小调整参数self.zoomScale

_init_self.grid初始化之前,补充大小调整参数:self.zoomScale_init_函数修改部分的代码如下:

    def __init__(self, N=10, K=0, width=50, height=102,civil_info_exchange=True, model_layer=-1, is_fired=False, is_flood=True, count=0):self.warning_UI = ""  # 警示信息self.resizeScale=3 # parameter using to control the scale of the map

_init_函数中补充地图放大、更新代码

        # 将安全通道坐标加载到地图中self.draw_environment(self.pos_exits)# 创建坐标空间self.graph = path_finding.create_graph(self)self.combine_matrices()# To rescale the terrain map size after combination.self.resize_matrices(self.resizeScale)self.separate_matrix() # update different object matrix from the resized matrix.

地图放大函数resize_matrices的定义

    def resize_matrices(self, degree):"""Resize the terrain and constituent matrices while maintaining aspect ratio.:param degree: New rescaling degree."""scaling_factor = (degree, degree)# Resize the main terrain matrixself.terrain_matrix = zoom(self.terrain_matrix, scaling_factor, order=0)# order=1 for bilinear interpolation and 0 for nearest-neighbor interpolation.# This change will ensure that your matrices' integer values are preserved during the resizing process.

放大后更新其他物体的坐标矩阵函数separate_matrix

    def separate_matrix(self):"""Separate the combined terrain matrix into individual feature matrices.Each matrix should represent one feature (e.g., river, road) with 1s where the feature existsand 0s where it doesn't."""# Identify all unique features in the terrain matrix, excluding 0 (empty)unique_features = np.unique(self.terrain_matrix)# Define a mapping from feature codes to the corresponding class attributesfeature_mapping = {1: 'river_matrix',2: 'road_matrix',3: 'wall_matrix',4: 'indoor_matrix',5: 'exits_matrix',6: 'pillar_matrix',7: 'ditch_matrix'}# Initialize each matrix as an array of zerosfor matrix_name in feature_mapping.values():setattr(self, matrix_name, np.zeros_like(self.terrain_matrix))# For each feature, populate the corresponding matrixfor feature in unique_features:if feature == 0:continue  # Skip the 'empty' featurematrix_name = feature_mapping.get(feature)if not matrix_name:continue  # Skip if the feature is not recognized# Update the corresponding matrix directlyfeature_matrix = np.where(self.terrain_matrix == feature, 1, 0)setattr(self, matrix_name, feature_matrix)# At this point, each feature matrix (e.g., self.river_matrix) has been updated directly# No need to return anything since we're modifying the class attributes directly

补充:放大后地图的可视化脚本

请与单独的.py文件中运行。

# It's assumed you have executed the following installation command in your local environment:
# !pip install datashaderimport datashader as ds
import datashader.transfer_functions as tf
import pandas as pd# Load and prepare the data
from matplotlib import pyplot as pltfile_path = 'G:\\terrain_matrix3.csv'
data = pd.read_csv(file_path)# Calculate the aspect ratio of the original data
num_rows, num_cols = data.shape  # Assuming 'data' is your DataFrame
aspect_ratio = num_cols / num_rows# Ensure column headers are consistent and represent coordinates or indexing
# If headers are numeric: good; if not, you might want to set headers as a range of numbers representing columns
data.columns = range(len(data.columns))# Resetting the index to turn it into a column for melting
data = data.reset_index()# Melting the data (now 'X' should be consistently numeric)
melted_data = data.melt(id_vars=['index'], var_name='X', value_name='Value')
melted_data['Y'] = melted_data['index']
melted_data.drop(columns=['index'], inplace=True)# Convert 'X' and 'Y' to numeric values, coercing errors (i.e., non-numeric values are set as NaN)
melted_data['X'] = pd.to_numeric(melted_data['X'], errors='coerce')
melted_data['Y'] = pd.to_numeric(melted_data['Y'], errors='coerce')# Handle or remove any rows with NaN if necessary (created by 'coerce')
melted_data.dropna(subset=['X', 'Y'], inplace=True)# Define the dimensions for the canvas
plot_width = 800
plot_height = int(plot_width / aspect_ratio)  # Maintain the aspect ratio of the original data# Set up the canvas with the correct aspect ratio
canvas = ds.Canvas(plot_width=plot_width, plot_height=plot_height)# Aggregating data into a grid
agg = canvas.points(melted_data, 'X', 'Y', ds.mean('Value'))# Creating an image by coloring the aggregated data
img = tf.shade(agg, cmap=['lightblue', 'darkblue'], how='linear')# Convert the Datashader image to a format that can be displayed by matplotlib
img_to_plot = tf.shade(agg, cmap=['lightblue', 'darkblue'], how='linear')
img_plt = tf.set_background(img_to_plot, 'white')# Display the image using matplotlib
plt.imshow(img_plt.to_pil())
plt.axis('off')  # Optional: this removes the axes for a cleaner look
plt.title('Presentation of the rescaling map data(3X).')plt.show()

以下是可视化脚本的输出案例。其中,2X和3X分别表示设置的地图放大倍数。

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

基于nodejs+vue市民健身中心网上平台mysql

市民健身中心网上平台分为用户界面和管理员界面, 用户信息模块:管理员可在后台添加、删除普通用户,查看、编辑普通用户的信息。 课程表管理模块:管理员可对课程表进行修改任课教师、新增某一堂课、删除某一堂课、查找课程、修改…

codeforces (C++ Chemistry)

题目: 翻译: 思路: 1、n组数据,每组输入两个数t,k和一个字符串,删除k个字符,剩下的字符能组成回文,则输出YES,否则输出NO。 2、用map记录字符串中每个字符出现的次数,su…

使用screen实现服务器代码一直运行

1.安装screen sudo apt install screen 2.创建一个screen(创建一个名为chatglm的新的链接,用来一直运行 screen -S chatglm 3.查看进程列表 screen -ls 创建之后,就可以在当前窗口利用cd命令进入要执行的项目中,开始执行&#xf…

Openssl数据安全传输平台007:共享内存及代码的实现 ——待完善项目具体代码和逻辑

文章目录 0. 代码仓库1. 使用流程案例代码: 2. API解析2.1 创建或打开一块共享内存区2.2 将当前进程和共享内存关联到一起2.3 将共享内存和当前进程分离2.4 共享内存操作 -( 删除共享内存 ) 3. 思考问题3. ftok函数4. 共享内存API封装-以本项…

基于SSM的仓库管理系统

基于SSM的仓库管理系统的设计与实现【文末源码】 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 管理员界面 员工管理 货物管理 员工界面 摘要 当考虑构建基于…

[ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹

本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【云计算洞察】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | …

day01_matplotlib_demo

文章目录 折线图plot多个绘图区绘制数学函数图像散点图scatter柱状图bar直方图histogram饼图pie总结 折线图plot import matplotlib.pyplot as pltplt.figure(figsize(15, 6), dpi80) plt.plot([1, 0, 9], [4, 5, 6]) plt.show()### 展现一周天气温度情况 # 创建画布 plt.figu…

留意差距:弥合网络安全基础设施的挑战

您最近一直在关注日益增加的网络威胁吗?如果您发现自己沉浸在 IT 或技术中,那么您可能会永远追求与时俱进。每天都会出现新的漏洞,这对保持消息灵通提出了巨大的挑战。 构建和维护能够应对复杂攻击者的网络安全基础设施所面临的挑战是真实存…

最新AI智能写作创作系统源码V2.6.4/AI绘画系统/支持GPT联网提问/支持Prompt应用

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统,支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

Windows 安装 Java

1. 安装 JDK 从 Oracle 的官网下载的 JDK,例如 JDK 21 双击下载得到的 msi 文件,开始安装 JDK 选择要安装的文件路径(我一般都默认): 等待安装: 安装完成: 2. 验证是否安装成功 2.1. 打开 cmd…

【JavaEE重点知识归纳】第10节:Object类和String类

目录 一:Object类 1.概念 2.获取对象信息 3.对象比较equals方法 4.hashCode方法 二:String类 1.String类的重要性 2.常用方法 3.StringBuilder和StringBuffer 一:Object类 1.概念 (1)Object类是Java默认提供…

Easyx趣味编程7,鼠标消息读取及音频播放

hello大家好,这里是dark flame master,今天给大家带来Easyx图形库最后一节功能实现的介绍,前边介绍了绘制各种图形及键盘交互,文字,图片等操作,今天就可以使写出的程序更加生动且容易操控。一起学习吧&…

算法通过村第十五关-超大规模|黄金笔记|超大规模场景

文章目录 前言对20GB文件进行排序超大文本中搜索两个单词的最短距离从10亿数字中寻找小于100万个数字总结 前言 提示:你生命的前半辈子或许属于别人,活在别人的认为里。那把后半辈子还给自己,去追随你内在的声音。 --荣格 理解了前面的几个题…

Openssl数据安全传输平台006:粘包的处理-代码框架及实现-TcpSocket.cpp

文章目录 0. 代码仓库1. TCP通信粘包问题2. 粘包、拆包表现形式2.1 正常情况2.2 两个包合并成一个包2.3 出现了拆包 3. 粘包的处理-参考仓库中的文件TcpSocket.cpp3.1 发送数据时候的处理3.2 接收数据时候的处理 0. 代码仓库 https://github.com/Chufeng-Jiang/OpenSSL_Secure_…

Node学习笔记之Express框架

一、express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,官方网址:https://www.expressjs. com.cn/ 简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用&…

局域网下多台windows电脑时间同步

windows时间同步 最近在项目中遇见了多台windows电脑的时间同步问题。在这个项目中,有五台电脑,五台电脑处于同一局域网下,其中有一台可以连接互联网(A电脑)。我需要将其他四台电脑(B、C、D、E电脑&#xf…

图论03-【无权无向】-图的深度优先DFS遍历-路径问题/检测环/二分图

文章目录 1. 代码仓库2. 单源路径2.1 思路2.2 主要代码 3. 所有点对路径3.1 思路3.2 主要代码 4. 路径问题的优化-提前结束递归4.1 思路4.2 主要代码 5. 检测环5.1 思路5.2 主要代码 6. 二分图6.1 思路6.2 主要代码6.2.1 遍历每个联通分量6.2.2 递归判断相邻两点的颜色是否一致…

Jenkins 相关内容

Jenkins 相关内容 什么是 Jenkins,它是如何工作的?Jenkins 中自由式项目和管道之间的区别什么是Jenkins管道,它们如何工作?第一次如何安装Jenkins并进行设置?什么是 Jenkins 插件,如何安装它们?…

无论有没有按钮,iPhone都可以进行截屏操作!如何在iPhone上截屏

通过简单的按键组合,可以很容易地将iPhone屏幕的图片捕获到图像文件中,并保存到照片库中。以下是操作方法。 什么是屏幕截图 屏幕截图是指通常包含你在设备屏幕上看到的内容的精确副本的图像。在设备内拍摄的数字屏幕截图通常使用相机拍摄物理屏幕的照…