用可视化案例讲Rust编程2. 编码的核心组成:函数

从第一天学习编程,可能大家就听说这样的组成公式:

程序=算法+数据结构

——该公式出自著名计算机科学家沃思(Nikiklaus Wirth)

实际上,程序除了以上两个主要要素之外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。因此,算法、数据结构、程序设计方法和语言工具4个方面是一个程序设计人员所应具备的知识。

所以,要学习组成程序的最重要的具现化方式,就是计算机语言。计算机语言则以是语句 + 表达式为原子所组成逻辑集合体;最基础的逻辑集合体,就是函数。

官方的说法:

计算机是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时,还带有一个入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,供计算机处理;所谓出口,就是指函数的函数值,在计算机求得之后,由此口带回给调用它的程序。

所以,我们在学习Rust的时候,不要被哪些天花乱坠的特性、泛型、生命周期给弄傻,要学习,先去翻函数,学习怎么写函数,一个函数解决一个问题。

同样,去读大神代码的时候,也别一爬起来就去读整体架构设计,安心去读他最底层的实现,如果读不懂,可以借助GPT一类的工具,让它给你讲讲,如下所示:

img

效果那是极好的。

img

下面针对我们上篇文章那个可视化的需求,我们来写个简单函数来实现一下:

需求:读取一个shapefile文件,把这个shapefile文件中的几何信息绘制到地图上。

初学版设计思路:

  • 函数名:draw_shp
  • 输入参数:shapefile的路径
  • 输出:直接显示地图。
  • 需要用的到的包:
    • shapefile:读取shp文件
    • plotly:绘图
    • geo_types:序列化几何对象 编码实现设计: ###在Cargo.toml文件里面,导入需要的包:
//Cargo.toml
//后面的features特性,暂时不用去管,这是一种Rust特有的编译特性
plotly = { version = "0.8.4", features = ["kaleido"] }
shapefile = {version = "0.5.0", features = ["geo-types"]}
geo-types = "0.7.12"

读取一个shapefile,并且把几何信息给获取出来。

在Rust中,可以通过shapefile包来读取shapefile,实现如下:

let shp = shapefile::read_as::<_,
        shapefile::Polygon, shapefile::dbase::Record>(
            "./data/shp/北京行政区划.shp",
    ).expect(&format!("Could not open polygon-shapefile: './data/shp/北京行政区划.shp'"));

接下去,需要把里面的geometry信息给取出来:

//定义一个集合,通过文件迭代器,把geometry部分转换成polygon,然后加入到这个几何里面去。
let mut polygons:Vec<Polygon> = Vec::new();
for (polygon, polygon_record) in shp {
    let geo_mpolygon: geo_types::MultiPolygon<f64> = polygon.into();
    for poly in geo_mpolygon.iter(){
        polygons.push(poly.to_owned());
    }
}

把这个polygon集合,绘制到plotly上去

首先plotly绘制几何图形,是按照坐标来的,一系列坐标组成一个绘图元素,代码如下:

  • 注1:plotly的地图绘制用的是mapbox的api,所以是先维度lat,再经度lon,得反过来。
  • 注2:trace是plotly绘图的基本元素,这里每个几何要素(如一个面),就可以构建一个trace,如果可以设置为一个颜色,也可以绘制为不同的颜色。
let mut trace_vec = Vec::new();
    for ps in polygons{
        let mut lon:Vec<f64> = Vec::new();
        let mut lat:Vec<f64> = Vec::new();
        for p in ps.exterior(){
            lon.push(p.x);
            lat.push(p.y);
        }
        let trace = ScatterMapbox::new(lat, lon).mode(Mode::None)
        .fill(plotly::scatter_mapbox::Fill::ToSelf)
        .fill_color(Rgba::new(0,0,255,0.5));
        trace_vec.push(trace);
    }

获得基本地图的配置

  • 可以看见这里用的是mapbox的地图,默认的风格为无背景的白板,默认的中心位置是东经116.3,北纬39.9,默认地图放大等级是9级。这些信息都是地图的初始化的默认配置。
let layout = Layout::new()
    .drag_mode(DragMode::Zoom)
    .margin(Margin::new().top(10).left(10).bottom(10).right(10))
    .width(1024)
    .height(700)
    .mapbox(
        Mapbox::new()
            .style(MapboxStyle::WhiteBg)
            .center(Center::new(39.9, 116.3))
            .zoom(9),
    )

最后绘制显示地图

let mut plot = Plot::new();
plot.set_layout(layout);
for t in trace_vec.iter(){
    plot.add_trace(t.to_owned());
}
plot.show();

全部代码,放到一个function里面,如下所示:

img

然后写个测试方法运行一下:

img

运行结果:

img

现在看起来,是不是很简单了,对比Python实际上也没有多出几行代码,直接阅读过去,除了一些定义类型和转换类型的时候,比Python更加严格以外,会Python的同学,几乎可以完全能够看懂。

——所以说,你完全可以把Rust当成一个类型严格版本的Python就阔以了……

img

不过,对于写过工程性质代码的同学看完,肯定会觉得这个代码写的太粗糙了,所有步骤都混在一起,内容全部写死,而且无法复用……

没错,初学者该有的毛病,这里都有,虽然功能实现了,但是根本只是一个demo,无法达到工程级的应用,所以从下一节开始,我们就会针对这个功能,按Rust的编码风格,去抽象和重构,最后完成一个工程级的可视化应用模块。

待续未完……

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

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

相关文章

Redis性能大挑战:深入剖析缓存抖动现象及有效应对的战术指南

在实际应用中&#xff0c;你是否遇到过这样的情况&#xff0c;本来Redis运行的好好的&#xff0c;响应也挺正常&#xff0c;但突然就变慢了&#xff0c;响应时间增加了&#xff0c;这不仅会影响用户体验&#xff0c;还会牵连其他系统。 那如何排查Redis变慢的情况呢&#xff1f…

nginx配置 请求静态文件时带上额外的响应头信息

注意&#xff1a;这种方式添加的额外信息会出现在响应头中。 例如在location{}中&#xff0c;try_files之前添加如下信息&#xff1a; add_header X-Extra-Header "Value"; add_header X-Forwarded-For $proxy_add_x_forwarded_for; …

Gitlab-ci:从零开始的前端自动化部署

一.概念介绍 1.1 gitlab-ci && 自动化部署工具的运行机制 以gitlab-ci为例&#xff1a; (1) 通过在项目根目录下配置.gitlab-ci.yml文件&#xff0c;可以控制ci流程的不同阶段&#xff0c;例如install/检查/编译/部署服务器。gitlab平台会扫描.gitlab-ci.yml文件&…

【Python】Sigmoid和Hard Sigmoid激活函数对比总结及示例

Sigmoid和Hard Sigmoid是两种常用的激活函数&#xff0c;它们在神经网络中起到非线性变换的作用。以下是它们之间的对比和优缺点总结&#xff1a; Sigmoid激活函数&#xff1a; 优点&#xff1a; 输出范围是0到1之间&#xff0c;可以用于二分类问题。函数形状相对平滑&#…

【LeetCode】组合两个表(mysql)

题目 编写解决方案&#xff0c;报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中&#xff0c;则报告为 null 。 以 任意顺序 返回结果表。 结果格式如下所示。 答 select firstName ,lastName,city,state from Person left join Address …

使用pygame.draw绘制基本图形

import pygame# 初始化pygame pygame.init()# 创建显示窗口 screen pygame.display.set_mode((640, 480)) pygame.display.set_caption("绘制基本图形")# 定义颜色 BLACK (0, 0, 0) WHITE (255, 255, 255) RED (255, 0, 0) GREEN (0, 255, 0) BLUE (0, 0, 255)…

Mac安装nvm以及使用nvm安装node

1. 安装nvm命令 git clone https://gitee.com/mirrors/nvm.git ~/.nvm && cd ~/.nvm && git checkout git describe --abbrev0 --tags2. 配置环境变量 vi ~/.bash_profileexport NVM_DIR"$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] &&…

网络安全工具:通过监控分析日志数据保护企业网络

由于混合工作模式的兴起以及业务运营向云环境的迁移&#xff0c;企业网络变得更加分散和复杂&#xff0c;仅安装外围安全解决方案只会创建一个基本的防御层&#xff0c;系统、服务器和其他网络实体会生成记录所有网络活动的日志。集中式日志管理系统可以帮助管理员自动监控网络…

【教学类-45-06】正确 X-Y之间的三连加减题混合 (竖向排列)(44格:11题“++ ”11题“--”11题“ +-”11题“ -+” )

作品展示&#xff1a; 背景需求&#xff1a; 把以下四款3连题 混在一起&#xff0c;每种题目随机抽取11题&#xff0c;一共44格 出现问题&#xff1a; 1、- 、-里面有重复题 2、升序排列最好竖排展示 素材准备: ​ ​ 问题改正 1、单元格修改&#xff1a;确保竖列写入 …

【elastic search】JAVA操作elastic search

目录 1.环境准备 2.ES JAVA API 3.Spring Boot操作ES 1.环境准备 本文是作者ES系列的第三篇文章&#xff0c;关于ES的核心概念移步&#xff1a; https://bugman.blog.csdn.net/article/details/135342256?spm1001.2014.3001.5502 关于ES的下载安装教程以及基本使用&…

鸿蒙Harmony--状态管理器--@Prop详解

纵横千里独行客&#xff0c;何惧前路雨潇潇。夜半浊酒慰寂寞&#xff0c;天明走马入红尘。且将新火试新茶&#xff0c;诗酒趁年华。青春以末&#xff0c;壮志照旧&#xff0c;生活以悟&#xff0c;前路未明。时间善变&#xff0c;可执着翻不了篇。时光磨我少年心&#xff0c;却…

正则表达式、文件访问(Python实现)

一、主要目的&#xff1a; 1.了解正则表达式的基本概念和处理过程。 2.掌握使用正则表达式模块 Re 进行字符串处理的方法。 3.了解文件的基本概念和类型。 4.掌握在 Python 中访问文本文件的方法和步骤。 5.熟悉在 Python 中访问二进制文件的方法和步骤。 二、主要内容和结…

HelpLook VS Docusaurus:SaaS 知识库软件和 SSG 的对比

在选择文档工具时&#xff0c;需要考虑多个因素&#xff0c;如功能、易用性、成本等。Docusaurus是一个开源工具&#xff0c;它因其灵活性而受到文档团队的青睐&#xff0c;尤其是负责软件产品文档的团队。有些组织甚至可能要求使用开源软件&#xff0c;因此选择一个开源工具如…

读元宇宙改变一切笔记04_网络化

1. 思想实验 1.1. 如果森林中的一棵树倒下&#xff0c;但周围没有人听到&#xff0c;那它是否会发出声音&#xff1f; 1.1.1. “贝克莱的树” 1.2. 主观唯心主义哲学家乔治贝克莱(George Berkeley)提出的&#xff0c;他认为“存在就是被感知” 1.2.1. 如果有人或有其他事物…

CMake入门教程【高级篇】qmake转cmake

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 概述2.qmake与cmake的差异3. qmake示例4.qmake转cmake示例5.MOC、UIC和RCC…

1991-2022年A股上市公司股价崩盘风险指标数据

1991-2022年A股上市公司股价崩盘风险指标数据 1、时间&#xff1a;1991-2022年 2、来源&#xff1a;整理自csmar 3、指标&#xff1a;证券代码、交易年度、NCSKEW(分市场等权平均法)、NCSKEW(分市场流通市值平均法)、NCSKEW(分市场总市值平均法)&#xff1b; NCSKEW(综合市…

网络协议与攻击模拟_03实施ARP欺骗和攻击

一、ARP攻击 1、实验环境 kali Linux &#xff08;安装arpspoof工具&#xff09;被攻击主机 2、kali配置 kali Linux系统是基于debian Linux系统&#xff0c;采用deb包管理方式&#xff0c;可以使用apt源的方式进行直接从源的安装。 配置kali网络源 vim /etc/apt/sources…

本地远程实时获取无人机采集视频图像(天空端 + jetson nano + 检测分割 + 回传地面端显示)

1、无线图传设备介绍 2、jetson nano天空端数据采集检测保存 3、本地回传显示 1、无线图传设备介绍 由于本设计考虑将无人机得到检测结果实时回传给地面站显示&#xff0c;因此需要考虑一个远程无线通信设备进行传输。本设计采用思翼HM30图传设备。通过无线图传的wifi将天空端…

基于JavaWeb+BS架构+SpringBoot+Vue协同过滤算法的体育商品推荐系统的设计和实现

基于JavaWebBS架构SpringBootVue协同过滤算法的体育商品推荐系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 绪 论 1 1.1项目背景 1 1.2研究意义 2 1.3设计目的 2 1.…

【动态规划】C++ 算法458:可怜的小猪

作者推荐 视频算法专题 涉及知识点 动态规划 数学 力扣458:可怜的小猪 有 buckets 桶液体&#xff0c;其中 正好有一桶 含有毒药&#xff0c;其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药&#xff0c;你可以喂一些猪喝&#xff0c;通过观察猪是否…