使用Java调用GeoTools实现全球国家矢量数据入库实战

news2024/10/4 20:00:50

目录

前言

一、相关数据介绍

1、无空间参考的数据

2、有空间参考的数据

3、空间信息表物理模型

二、全球国家空间数据入库

1、后台实体类图

 2、后台实体对象关键代码

三、时空数据入库实践

1、读取无空间参考数据

2、入库成果及注意事项

 四、总结


前言

        在当今世界,国家的构成和数量对国际关系、经济合作以及文化交流等方面都有深远的影响。根据最新的统计数据,目前全球共有233个国家和地区,这其中包括195个国家,而其中的193个国家是联合国的正式会员国。国家数量的变化不仅仅是地理政治的调整,更是历史的映射。例如,二十世纪的多次战争和殖民地的独立运动,使得全球的国家数量在短时间内显著增加。此外,南苏丹的独立(2011年)和科索沃的宣告独立(2008年)等事件,都是国际关系复杂性的体现。随着全球化的发展,经济和文化的交流更加频繁,各国间的依存度逐渐加深。这种现象不仅促使一些地区国家通过联合体形式确保集合安全和发展,如欧盟,还引发了部分国家对独立的渴望,努力争取更大的自主权。

        联合国自1945年成立以来,一直致力于促进国际间的合作,维护世界的和平与发展。它不仅是国家交流的重要平台,也是各国相互依赖、协调利益的重要场所。通过联合国,各国在经济、社会、环境、文化等多个领域进行合作。联合国的成员国数量在不断变化,反映出国际关系的动态背景。目前,193个成员国中有多个新兴市场国家和发展中国家的加入,推动了国际合作的多样性。与此同时,联合国的存在也体现了各国在国际事务中平等发言的权利与责任。总的来说,全球国家数量的统计不仅是数字游戏,更是理解世界现状的入口。国家的数量及其变化与历史、文化、外交乃至经济发展息息相关。未来,随着国际局势的变化,不同国家间的关系会更加错综复杂,这将影响全球治理的结构与模式。

        由此可见,不管是研究国际局势,还是研究全球性的经济、政治、金融往来甚至一些局部的冲突,地缘文化在国家的交流和往来当中都非常需要国家等关键信息。本文即以Java编程语言为例,重点讲解如何使用GeoTools来进行全球国家和地区的空间数据入库。为下一步做全球性的空间分析等积累数据基础。如果您也对如何处理全球国家和地区的数据有兴趣,不妨来这里看看。

一、相关数据介绍

        本文主要介绍相关技术,博客涉及的相关数据为从互联网上下载的共享数据。地图属于敏感的数据,请大家在使用相关的地图数据时,一定要注意,比如敏感的边界问题等等。这里有两份基本的数据,一份是没有设置空间参考的信息,但包含了国家的中文信息。另一份设置了4326的空间参考,但属性字段较乱,需要整理,因此我们结合两份数据来进行整合,提取出符合我们需要的空间信息。

1、无空间参考的数据

        下面这份数据是没有设置空间参考的全球国家矢量信息,我们使用Qgis软件打开数据可以看到以下的信息。

         打开矢量数据的属性信息表,首先来大致了解一下这份数据对应的属性信息列表。

         这里请大家注意无空间参考的数据的属性信息及属性表格。介绍完无空间参考的数据后,再来介绍一下有空间参考的数据。

2、有空间参考的数据

        顾名思义,这里的数据是定义了空间参考的,不仅如此。它的属性列表和字段也是比之前的数据多的。我们可以打开QGIS软件来看一下具体的数据信息。

        同样的,我们打开属性表格来看一下这份数据的属性表格。 

         对比前面的无空间参考的数据,可以看到这份数据的数据列更多。但是在实际情况下,我们根据需求可以不展示这么多信息。

3、空间信息表物理模型

        在本文的数据处理过程中,我们将两份数据进行求交集。通过一个三字码简称来实现国家信息的关联。在无空间信息参考的shp表格中参考中文信息。作为现实世界的映射,我们设计的空间表如下所示:

        这里提供物理表结构的SQL脚本如下:

CREATE TABLE "public"."biz_world_contry" (
  "pk_id" int8 NOT NULL,
  "full_english_name" varchar(255) COLLATE "pg_catalog"."default",
  "short_english_name" varchar(255) COLLATE "pg_catalog"."default",
  "min_english_name" varchar(50) COLLATE "pg_catalog"."default",
  "full_chinese_name" varchar(255) COLLATE "pg_catalog"."default",
  "short_chinese_name" varchar(255) COLLATE "pg_catalog"."default",
  "continent" varchar(50) COLLATE "pg_catalog"."default",
  "unreg" varchar(50) COLLATE "pg_catalog"."default",
  "geom" "public"."geometry"
);
COMMENT ON COLUMN "public"."biz_world_contry"."full_english_name" IS '英文全称';
COMMENT ON COLUMN "public"."biz_world_contry"."short_english_name" IS '英文简称';
COMMENT ON COLUMN "public"."biz_world_contry"."min_english_name" IS '最简名称';
COMMENT ON COLUMN "public"."biz_world_contry"."full_chinese_name" IS '中文全称';
COMMENT ON COLUMN "public"."biz_world_contry"."short_chinese_name" IS '中文简称';
COMMENT ON COLUMN "public"."biz_world_contry"."continent" IS '所属大洲,如Asia';
COMMENT ON COLUMN "public"."biz_world_contry"."unreg" IS '大洲详情';
COMMENT ON COLUMN "public"."biz_world_contry"."geom" IS 'geom';
COMMENT ON TABLE "public"."biz_world_contry" IS '世界国家信息表';

         为了加速查询速度,这里我们创建两个普通索引和一个空间索引,创建索引的SQL语句如下,供大家参考:

CREATE INDEX "idx_biz_world_contry_continent" ON "public"."biz_world_contry" USING btree (
  "continent" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_biz_world_contry_geom" ON "public"."biz_world_contry" USING gist (
  "geom" "public"."gist_geometry_ops_2d"
);
CREATE INDEX "idx_biz_world_contry_min_englis" ON "public"."biz_world_contry" USING btree (
  "min_english_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);

二、全球国家空间数据入库

        在了解了上述的两份空间数据的基础数据和时空数据库表结构之后,接下来就可以来进行空间数据库入库的相关功能开发。这里将从相关的类图、调用流程图等方面来进行介绍。

1、后台实体类图

        为了实现对空间数据的读取与空间入库,可以分为以下的几个类来实现业务逻辑,包含三个最简单的基本实体类,分别读取无空间参考的实体类和有空间参考索引的实体类,还有一个与空间表对应的数据库表实体。

 2、后台实体对象关键代码

        有了上述的类图后,接下来将重点提供后台的实体对象及相关模型层的相关代码。方便大家在处理数据时方便进行相关的做参考。空间数据表模型实体类如下:

package com.yelang.project.extend.earthquake.domain;

import java.io.Serializable;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yelang.framework.handler.PgGeometryTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
 * - 世界国家信息
 * @author 夜郎king
 *
 */
@TableName(value = "biz_world_contry", autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class WorldCountries implements Serializable{
	private static final long serialVersionUID = -5984870862010624612L;
	@TableId(value="pk_id")
	private Long pkId;//
	@TableField(value="full_english_name")
	private String fullEnglishName;//英文全称
	@TableField(value="short_english_name")
	private String shortEnglishName;//英文简称
	@TableField(value="min_english_name")
	private String minEnglishName;//最简名称
	@TableField(value="full_chinese_name")
	private String fullChineseName;//中文全称
	@TableField(value="short_chinese_name")
	private String shortChineseName;
	private String continent;//所属大洲,如:Asia
	private String unreg;//大洲详情
	@TableField(typeHandler = PgGeometryTypeHandler.class)
	private String geom;
	@TableField(exist=false)
	private String geomJson;
	public WorldCountries(String fullEnglishName, String shortEnglishName, String minEnglishName,
			String fullChineseName, String shortChineseName, String continent, String unreg, String geom) {
		super();
		this.fullEnglishName = fullEnglishName;
		this.shortEnglishName = shortEnglishName;
		this.minEnglishName = minEnglishName;
		this.fullChineseName = fullChineseName;
		this.shortChineseName = shortChineseName;
		this.continent = continent;
		this.unreg = unreg;
		this.geom = geom;
	}
}

        有空间参考的实体类关键代码如下:

package com.yelang.project.extend.earthquake.domain;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * - 设置坐标参考系的全球国家信息
 * @author 夜郎king
 *
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WorldCountriesWithCRS implements Serializable{
	private static final long serialVersionUID = -2200848007577967594L;
	private String geom;
	private String name;
	private String iso3;//简称
	private String continent;//所属洲,比如亚洲、美洲等
	private String unreg1;
	private Integer eu;//是否欧盟
}

无空间参考实体类的关键代码如下:

package com.yelang.project.extend.earthquake.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * - 没有设置坐标参考系的全球国家信息
 * @author 夜郎king
 *
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WorldCountriesWithNoCRS implements Serializable{
	private static final long serialVersionUID = 9034823653023305410L;
	private String name;//英文名称
	private String feName;//英文全称
	private String fcName;//国家中文名
	private String soc;//英文简称
	private BigDecimal pop = new BigDecimal("0");//人口
}

        以上就是三个基础的实体类。在进行空间数据库的操作时,采用的是Mybatis-Plus技术框架,在前面的博客中,关于Mybatis-plus如何操作空间数据库,花了很多的时间来进行处理,因此这里不再进行赘述。

三、时空数据入库实践

        最后重点来介绍如何进行时空数据的入库,将实现两份空间数据的读取,然后进行数据合并,最后调用Mybatis-plus来进行数据入库。

1、读取无空间参考数据

        业务逻辑不复杂,这里调用Geotools组件来实现Shapefile文件的读取。这里直接给出相关的代码,里面的具体字段,大家可以根据实际情况来进行替换即可。

private static List<WorldCountriesWithNoCRS> ReadWorldContriesWithNoCRS() throws IOException, FactoryException {
		// 指定Shapefile的文件路径
		String shpFile = "F:/vector_data/世界国家行政边界数据/世界国家行政边界数据/世界国家.shp";//没有参考坐标
		ShapefileDataStore shapefileDataStore = new ShapefileDataStore(new File(shpFile).toURI().toURL());
		shapefileDataStore.setCharset(Charset.forName("GBK"));// 设置中文字符编码
		// 获取特征类型
		SimpleFeatureType featureType = shapefileDataStore.getSchema(shapefileDataStore.getTypeNames()[0]);
		CoordinateReferenceSystem crs = featureType.getGeometryDescriptor().getCoordinateReferenceSystem();
		System.out.println("坐标参考系统:" + crs);
		Integer epsgCode = 0;
		if(crs != null) {
			epsgCode = CRS.lookupEpsgCode(crs, true);
		}
		SimpleFeatureSource featureSource = shapefileDataStore.getFeatureSource();
		SimpleFeatureCollection simpleFeatureCollection=featureSource.getFeatures();
        SimpleFeatureIterator itertor = simpleFeatureCollection.features();
        //遍历featurecollection
        List<WorldCountriesWithNoCRS> list = new ArrayList<WorldCountriesWithNoCRS>();
        while (itertor.hasNext()){
            SimpleFeature feature = itertor.next();
            Property nameProperty = feature.getProperty("NAME");
            String name = (String)nameProperty.getValue();
            Property feNameProperty = feature.getProperty("FENAME");
            String feName = (String) feNameProperty.getValue();
            Property fcNameProperty = feature.getProperty("FCNAME");
            String fcName = (String)fcNameProperty.getValue();
            Property socProperty = feature.getProperty("SOC");
            String soc = (String)socProperty.getValue();
            Property popProperty = feature.getProperty("POP");
            BigDecimal pop = new BigDecimal(String.valueOf(popProperty.getValue()));
         	WorldCountriesWithNoCRS wc = new WorldCountriesWithNoCRS(name, feName, fcName, soc, pop);
         	list.add(wc);
        }
        System.out.println(list.size());
        return list;
	}

        这里需要注意的是,由于这里没有设置空间参考,因此我们没有进行空间geometry属性的读取。在后面的已设置空间参考的数据中来进行获取。接下来我们来实现有空间参考信息的数据读取:

private static List<WorldCountriesWithCRS> ReadWorldContriesWithCRS() throws IOException, FactoryException {
		// 指定Shapefile的文件路径
		String shpFile = "F:/vector_data/世界国家_WGS84/countries.shp";//有参考坐标
		ShapefileDataStore shapefileDataStore = new ShapefileDataStore(new File(shpFile).toURI().toURL());
		//shapefileDataStore.setCharset(Charset.forName("UTF-8"));// 设置中文字符编码
		// 获取特征类型
		SimpleFeatureType featureType = shapefileDataStore.getSchema(shapefileDataStore.getTypeNames()[0]);
		CoordinateReferenceSystem crs = featureType.getGeometryDescriptor().getCoordinateReferenceSystem();
		System.out.println("坐标参考系统:" + crs);
		Integer epsgCode = 0;
		if(crs != null) {
			epsgCode = CRS.lookupEpsgCode(crs, true);
		}
		SimpleFeatureSource featureSource = shapefileDataStore.getFeatureSource();
		SimpleFeatureCollection simpleFeatureCollection=featureSource.getFeatures();
        SimpleFeatureIterator itertor = simpleFeatureCollection.features();
        //遍历featurecollection
        List<WorldCountriesWithCRS> list = new ArrayList<WorldCountriesWithCRS>();
        while (itertor.hasNext()){
            SimpleFeature feature = itertor.next();
            Property nameProperty = feature.getProperty("NAME");
            String name = (String)nameProperty.getValue();
            Property iso3Property = feature.getProperty("ISO3");
            String iso3 = (String) iso3Property.getValue();
            Property continentProperty = feature.getProperty("CONTINENT");
            String continent = (String)continentProperty.getValue();
            Property unreg1Property = feature.getProperty("UNREG1");
            String unreg1 = (String)unreg1Property.getValue();
            Property euProperty = feature.getProperty("EU");
            Integer eu = (Integer)euProperty.getValue();
            // 获取空间字段
         	org.locationtech.jts.geom.Geometry geometry = (org.locationtech.jts.geom.Geometry) feature.getDefaultGeometry();
            // 创建WKTWriter对象
         	WKTWriter wktWriter = new WKTWriter();
         	// 将Geometry对象转换为WKT格式的字符串
         	String wkt = wktWriter.write(geometry);
         	String geom = "SRID=" + epsgCode +";" + wkt;//拼接srid,实现动态写入
         	WorldCountriesWithCRS wc = new WorldCountriesWithCRS(geom, name, iso3, continent, unreg1, eu);
         	list.add(wc);
        }
        System.out.println(list.size());
        return list;
	}

        最后我们按照国家的简称来将List集合转变成Map集合,在后续的数据查找时,只需要按照简称来查询就可以快速的找到对应的国家信息,最后将数据插入到PostGIS空间数据库中。关键代码如下:

@Test
public void readShpData() throws IOException, FactoryException {
	List<WorldCountriesWithNoCRS> noCrsList = ReadWorldCountry2DB.ReadWorldContriesWithNoCRS();
	Map<String,WorldCountriesWithNoCRS> noCrsMap = new HashMap<String,WorldCountriesWithNoCRS>();
	for(WorldCountriesWithNoCRS noCrs : noCrsList) {
		noCrsMap.put(noCrs.getSoc(), noCrs);
	}
	System.out.println("--------------------------------------------------------");
	List<WorldCountriesWithCRS> crsList = ReadWorldCountry2DB.ReadWorldContriesWithCRS();
	List<WorldCountries> toDbDataList = new ArrayList<WorldCountries>();
	for(WorldCountriesWithCRS crs : crsList) {
		String fullChineseName = "";
		if(noCrsMap.containsKey(crs.getIso3())) {
			WorldCountriesWithNoCRS noCrs = noCrsMap.get(crs.getIso3());
			fullChineseName = noCrs.getFcName();
		}
		WorldCountries dbWc = new WorldCountries(crs.getName(), crs.getName(), crs.getIso3(), fullChineseName, fullChineseName, crs.getContinent(), crs.getUnreg1(), crs.getGeom());
		toDbDataList.add(dbWc);
	}
	if(toDbDataList.size() > 0) {
		worldCountryService.saveBatch(toDbDataList,100);
	}
}

2、入库成果及注意事项

        在使用Junit中运行上述代码后,即将全球数据信息插入到空间数据中。接下来我们将使用数据库端软件来验证是否成功的将数据插入到空间数据库中。这里我们以pgAdmin为例来进行讲解。我们在PgAdmin中打开查询窗口,然后执行以下语句:

select st_srid(geom),* from biz_world_contry;

        同时我们还可以执行空间信息查询,将相应的国家信息展示出来,以日本、德国为例,查询的sql语句如下,其中xxx表示具体的国家名字:

select * from biz_world_contry t where t.full_chinese_name = 'xxx';

        对于查询出来的结果,可以直接在查询结果中点击空间信息预览按钮来进行预览。

        需要注意的点:在进行复杂面数据的空间入库时,需要注意在插入数据时,关闭打印功能,这样可以显著提高插入效率。

 四、总结

        以上就是本文的主要内容,本文即以Java编程语言为例,重点讲解如何使用GeoTools来进行全球国家和地区的空间数据入库。为下一步做全球性的空间分析等积累数据基础。行文仓促,难免有许多不足之处,在此恳请各位专家博主在评论区留下真知灼见,在此表示感谢。

        博文编写过程中,参考以下内容,在此表示感谢。

        1、全球国家数量揭秘:目前究竟有多少个国家。

        2、你知道世界上有多少个国家吗?各国的国旗都认识吗?。

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

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

相关文章

【LuBase低代码框架】动态数据源服务介绍

功能介绍&#xff1a; 可以通过配置一个QueryOption对象或者一条select 查询语句&#xff0c;返回当前应用下的数据&#xff0c;避免后端写代码开发。 使用方法&#xff1a; 1. 动态服务需要通过/invoke/datasource和/invoke/datasourceNoRight 地址发起调用 2. 可使用参数…

Gaussian-splatting 项目环境配置笔记(Win11)

如果你是配置别的项目的过程中用到了3D GS相关的内容&#xff0c;然后这部分内容环境一直配不好&#xff0c;也可以跟随这个博客配一下环境&#xff0c;配完后起码3D GS部分就搞定了。 文章目录 概述项目链接&#xff1a;VS2019直接下载链接CUDA不同版本下载链接安装Condasetup…

Java开发每日一课:21世纪最流行的语言,Java为什么这么火?

自从进入21世纪以来&#xff0c;Java在TIOBE语言排行榜一直稳居前2名&#xff0c;占有率一直在12%以上。从国内各大招聘网站的岗位需求和培训班的畅销课程上看&#xff0c;Java一直稳居榜首&#xff0c;可以说Java是21世纪最流行的语言。 作为一个1995年才推出的语言&#xff0…

JVM(HotSpot):字符串常量池(StringTable)

文章目录 一、内存结构图二、案例讲解三、总结 一、内存结构图 JDK1.6 JDK1.8 我们发现&#xff0c;StringTable移入了Heap里面。所以&#xff0c;应该想到&#xff0c;StringTable将受到GC管理。 其实&#xff0c;1.6中&#xff0c;在方法区中的时候&#xff0c;也是受GC管…

01 排列选票

题目&#xff1a; 桶排序&#xff1a; #include<bits/stdc.h> using namespace std; #define M 100005 int a[M];int main() {int n,m;cin>>n>>m;for(int i1;i<m;i){int temp;cin>>temp;a[temp];}for(int i1;i<n;i){for(int j1;j<a[i];j){co…

OpenVINO基本操作流程

环境配置&#xff1a; conda env list:可以查看有哪些环境 conda activate intel:启动某个环境 pip list&#xff1a;可以查看此环境下都下载了哪些软件包 from openvino.inference_engine import IEcore#从OpenVINO推理引擎中导入IECore类 import numpy as np import cv2 1&…

基于GitLab 的持续集成环境

一.技术基础 Gitlab: 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务 GitRunner:用于运行您的作业并将结果发送回GitLab。它与GitLab CI一起使用&#xff0c;GitLab CI是GitLab随附的开源持续集成服务&…

SpringCloud微服务搭建实战

文章目录 前言Nacos配置和项目结构图示数据库和脚本准备seata数据库transaction_database数据库 一、Spring Boot、Spring Cloud、Sping Cloud Alibaba二、seata安装seata配置修改Nacos新建配置文件seata-server.properties 三、创建Microservice-Project项目四、创建api-modul…

【HTML5】html5开篇基础(5)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

使用MTVerseXR SDK实现VR串流

1、概述​ MTVerseXR SDK 是摩尔线程GPU加速的虚拟现实&#xff08;VR&#xff09;流媒体平台&#xff0c;专门用于从远程服务器流式传输基于标准OpenXR的应用程序。MTVerseXR可以通过Wi-Fi和USB流式将VR内容从Windows服务器流式传输到XR客户端设备, 使相对性能低的VR客户端可…

芯片公司产品简介

台湾新唐科技:ARM内核-nuvoTon stc&#xff08;宏晶&#xff09;&#xff1a;STC 8051 系列、STC32 8051系列、STC32 ARM系列 兆易&#xff1a;Arm Cortex-M内核和RISC-V内核 意法&#xff1a; 乐鑫科技&#xff1a; MCU厂家 GPU厂家 MCU与MPU 引用链接&#xff1a; http://…

AutoCAD学习

AutoCAD学习 最基本操作 命令用途说明空格键确认键也可以是重复刚才的命令回车键也是确认键鼠标右键也可以选择确认LINE、L直线命令绘制直线DLI线性尺寸标注DIMLINEAR鼠标滚轮滚动放大缩小视图界面鼠标中键按住移动视图DAL对齐线性标注DIMALIGNED F8 正交模式ORTHOMODE Tab 切换…

漆包线称重系统/自动称重/项目合作

万界星空科技漆包线行业称重系统实现自动称重的方式主要依赖于现代数字电子称重技术、计算机网络技术以及相关的软件系统的集成。以下是对该系统如何实现自动称重的详细解释&#xff1a; 一、硬件基础 称重设备&#xff1a; 系统采用高精度的电子秤作为称重设备&#xff0c;这…

TOGAF框架中的最佳实践与实施技巧:推动企业数字化转型的实战指南

企业的数字化转型已经成为全球商业界的一大趋势&#xff0c;而实现这一转型不仅需要技术的创新&#xff0c;还需要清晰的架构规划和实施策略。TOGAF&#xff08;The Open Group Architecture Framework&#xff09;作为全球广泛应用的企业架构标准&#xff0c;为企业提供了行之…

Pikachu-File Inclusion- 本地文件包含

前端每次挑选篮球明星&#xff0c;都会通过get请求&#xff0c;传了文件名&#xff0c;把页面展示出来&#xff0c;由于文件名时前端传给后台;并且查看源码&#xff0c;没有对参数做限制&#xff1b; 尝试直接从前端修改filename 参数&#xff1b; filename../../../../../../…

24-10-3-读书笔记(二十三)-《一个孤独漫步者的遐想》上([法] 让·雅克·卢梭 [译]陈阳)

文章目录 《一个孤独漫步者的遐想》上&#xff08;[法] 让雅克卢梭 [译]陈阳&#xff09;卢梭生平大事年表总结 《一个孤独漫步者的遐想》上&#xff08;[法] 让雅克卢梭 [译]陈阳&#xff09; 十月第三篇&#xff0c;看书看个爽&#xff0c;今天是法国哲学家卢梭晚年的著作《一…

【C++】—— vector模拟实现

vector 接口预览 namespace HL {template<class T>class vector{//迭代器iteratortypedef T* iterator;typedef const T* const_iterator;public://默认成员函数vector();vector(size_t n, const T& val T());vector(int n, const T& val T());vector(const v…

【学习资源】人在环路的机器学习

说明&#xff1a;本文图片和内容来源 Human-in-the-Loop Machine Learning Human-in-the-Loop Machine Learning Active learning and annotation for human-centered AI by Robert (Munro) Monarch, June 2021 介绍Human-in-the-Loop的目标&#xff0c;学习过程&#xff0c…

Redis:通用命令 数据类型

Redis&#xff1a;通用命令 & 数据类型 通用命令SETGETKEYSEXISTSDELEXPIRETTLTYPEFLUSHALL 数据类型 Redis的客户端提供了很多命令用于操控Redis&#xff0c;在Redis中&#xff0c;key的类型都是字符串&#xff0c;而value有多种类型&#xff0c;每种类型都有自己的操作命…

DMA 正点原子版

就是介绍一下dma&#xff0c;只能内存到外设&#xff0c;外设到内存&#xff0c;内存到内存&#xff0c;不能外设到外设这样进行数据传输 这个是 可以看这个表来查&#xff0c;哪个dma的哪个通道用来传输什么数据&#xff0c;这个是芯片固定好的&#xff0c;只能看表查&#xf…