使用Java调用GeoTools实现全球国家矢量数据入库实战
目录
前言
一、相关数据介绍
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;//所属大洲,如:Asiaprivate 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();//遍历featurecollectionList<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();//遍历featurecollectionList<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、你知道世界上有多少个国家吗?各国的国旗都认识吗?。
相关文章:
使用Java调用GeoTools实现全球国家矢量数据入库实战
目录 前言 一、相关数据介绍 1、无空间参考的数据 2、有空间参考的数据 3、空间信息表物理模型 二、全球国家空间数据入库 1、后台实体类图 2、后台实体对象关键代码 三、时空数据入库实践 1、读取无空间参考数据 2、入库成果及注意事项 四、总结 前言 在当今世界&…...
计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python+Django+Vue Python爬虫 附源码 讲解 文档
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
Springboo通过http请求下载文件到服务器
这个方法将直接处理从URL下载数据并将其保存到文件的整个过程。下面是一个这样的方法示例: import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection…...
使用CSS实现酷炫加载
使用CSS实现酷炫加载 效果展示 整体页面布局 <div class"container"></div>使用JavaScript添加loading加载动画的元素 document.addEventListener("DOMContentLoaded", () > {let container document.querySelector(".container&q…...
【STM32-HAL库】AHT10温湿度传感器使用(STM32F407ZGT6配置i2c)(附带工程下载连接)
一、温湿度传感器: 温湿度传感器是一种能够检测环境中的温度和湿度,并将其转化为电信号输出的装置。它在智能家居、工业自动化、气象监测、农业等领域有着广泛的应用。 原理: 温湿度传感器通常基于不同的物理原理,以下是一些常见…...
深入理解网络通信: 长连接、短连接与WebSocket
在现代网络应用开发中,选择合适的通信方式对于应用的性能、效率和用户体验至关重要。本文将深入探讨三种常见的网络通信方式:长连接、短连接和WebSocket,分析它们的特点、区别以及适用场景。 1. 短连接 © ivwdcwso (ID: u012172506) 1.1 定义 短连接是指客户端和服务器…...
Linux·环境变量与进程地址空间
1. 命令行参数 各位可能见过main函数也是有参数的,只是我们平时写的代码都比较简单,用不到main函数的参数,下面我们看一下main函数的参数是什么又是怎么用的 我们看这样一段代码 其编译运行后的效果是这样的 我们将main函数后面的那两个参数叫…...
MYSQL 乐观锁
乐观锁是一种用于处理并发控制的策略,特别适用于读多写少的场景。在 MySQL 数据库中,乐观锁通常通过版本号或时间戳来实现。下面将详细介绍乐观锁的概念、实现方式以及在 MySQL 中的应用。 1. 乐观锁的概念 乐观锁的基本思想是:在对数据进行…...
SpringCloud入门(十二)全局过滤器和跨域
一、全局过滤器 全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。 区别在于GatewayFilter通过配置定义,处理逻辑是固定的,如果我们希望拦截请求,做自己的业务逻辑则没办法实现。而GlobalFilt…...
51单片机系列-按键检测原理
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 独立按键是检测低电平的。 下面我们来看一张对应的电路原理图: 在这张图当中,P1,P2,P3内部都上拉了电阻,但是P0没有&am…...
基于元神操作系统实现NTFS文件操作(五)
1. 背景 本文主要介绍$Root元文件的解析。先介绍元文件的构成及各个部分的结构,然后结合上一篇博文中读取到的元文件内容,对测试磁盘中目标分区的根目录进行展示。 2. $Root元文件解析 (1)$Root元文件的结构 $Root元文件由两部…...
AutoCAD学习
AutoCAD学习 最基本操作 命令用途说明空格键确认键也可以是重复刚才的命令回车键也是确认键鼠标右键也可以选择确认LINE、L直线命令绘制直线DLI线性尺寸标注DIMLINEAR鼠标滚轮滚动放大缩小视图界面鼠标中键按住移动视图DAL对齐线性标注DIMALIGNED F8 正交模式ORTHOMODE Tab 切换…...
go的一些知识点
一.package 1.新建项目 新建一个itying文件夹,在里面使用命令 就能生成一个go项目。生成一个go.mod 2.调用别的包的代码 按照下面的目录层级生成代码 //clac.go package calcfunc Add(x, y int) int {return x y } func Sub(x, y int) int {return x - y }…...
前端 vue3 对接科大讯飞的语音在线合成API
主要的功能就是将文本转为语音,可以播放。 看了看官方提供的demo,嗯....没看懂。最后还是去网上找的。 网上提供的案例,很多都是有局限性的,我找的那个他只能读取第一段数据,剩下的不读取。 科大讯飞的接口…...
缺省参数
一、概念 在声明或定义函数时为函数的参数指定一个默认值,调用时,如果对应参数没有传参,则使用其默认值,否则使用指定的实参 void TestFunc(int a 0) {cout<<a<<endl; }int main() {TestFunc(); // 没有传参&am…...
Stable Diffusion绘画 | 来训练属于自己的模型:炼丹启动
经过前面几轮辛苦的准备工作之后,现在开始进入终篇的炼丹环节。 在「上传素材」页面,点击「开始训练」: 可以在「查看进度-进度」中,查看模型训练的整体进度: 求助!!!操作「开始训练…...
08_OpenCV文字图片绘制
import cv2 import numpy as npimg cv2.imread(image0.jpg,1) font cv2.FONT_HERSHEY_SIMPLEXcv2.rectangle(img,(500,400),(200,100),(0,255,0),20) # 1 dst 2 文字内容 3 坐标 4 5 字体大小 6 color 7 粗细 8 line type cv2.putText(img,flower,(200,50),font,1,(0,0,250)…...
【笔记】选择题笔记+数据结构笔记
文章目录 2014 41方法一先序遍历方法二 连通分量是极大连通子图 一个连通图的生成树是一个极小连通子图 无向图的邻接表中,第i个顶点的度为第i个链表中的结点数 邻接表和邻接矩阵对不同的操作各有优势。 最短路径算法: 单源最短路径 已知图G(V,E),我们…...
浅谈汽车智能座舱如何实现多通道音频
一、引言 随着汽车智能座舱的功能迭代发展,传统的 4 通道、6 通道、8 通道等音响系统难以在满足驾驶场景的需求,未来对于智能座舱音频质量和通道数会越来越高。接下来本文将浅析目前智能座舱如何实现音频功放,以及如何实现多路音频功放方案。…...
系统架构设计师教程 第13章 13.1层次式体系结构概述 笔记
13.1 层次式体系结构概述 分层式体系结构是一种最常见的架构设计方法,能有效地使设计简化,使设计的系统机构清晰,便于提高复用能力和产品维护能力。 层次式体系结构设计是将系统组成一个层次结构,每一层为上层服务,并…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
