使用SpringBoot将中国地震台网数据保存PostGIS数据库实践

news2024/11/30 12:29:21

目录

前言

一、数据转换

1、Json转JavaBean

2、JavaBean与数据库字段映射

二、空间数据表设计

1、表结构设计

三、PostGIS数据保存

1、Mapper接口定义

2、Service逻辑层实现

3、数据入库

4、运行实例及结果

总结


前言

        在上一篇博客中基于Java的XxlCrawler网络信息爬取实战-以中国地震台网为例,我们使用Java语言采用XxlCrawer组件进行中国地震台网数据的爬取,相信大家对如何抓取这种接口数据一定有了基本的认识,也掌握了如何基于XxlCrawer来实现自己的信息爬取实战。但是在前面的博客当中,我们仅仅是将信息爬取下来。为了在我们自己的应用系统中来应用这些基础数据,需要我们将爬取的数据进行存储起来。由于地震数据包含了空间位置信息,为方便进行空间分析的实现。这里我们将爬取的中国地震信息存储到PostGIS空间数据库中,为下一步的数据分析和可视化呈现奠定良好的基础。

        本文即紧紧围绕着将信息保存到空间数据库的目标,重点讲解如何实现将中国地震台网爬取的地震信息保存到PostGIS空间数据库中。首先讲解在爬取过程中数据格式和响应数据类型的转换,将网站回传的json数据转成符合Java命名规范的数据。然后介绍台网地震信息表的设计,如何构建空间数据表。再次介绍如何将爬取的数据调用Mybatis-Plus组件实现批量入库。如果您当前也有对地震等地质灾害数据进行分析的需求,不妨看看本博文。

一、数据转换

        在前面的博客中有提到,在中国地震台网中展示接口数据,将请求数据在浏览器中进行查看。可以看到以下的格式:

        通过这个接口可以看到,官方返回的数据中,其所有的字段名都是大写的,如下所示:

AUTO_FLAG: "M"
CATA_ID: "CD20240413222636.00"
CATA_TYPE: ""
EPI_DEPTH: 9
EPI_LAT: "24.05"
EPI_LON: "121.60"
EQ_CATA_TYPE: ""
EQ_TYPE: "M"
IS_DEL: ""
LOCATION_C: "台湾花莲县"
LOCATION_S: ""
LOC_STN: "0"
M: "4.2"
M_MB: "0"
M_MB2: "0"
M_ML: "0"
M_MS: "0"
M_MS7: "0"
NEW_DID: "CD20240413222636"
O_TIME: "2024-04-13 22:26:35"
O_TIME_FRA: "0"
SAVE_TIME: "2024-04-13 22:35:56"
SUM_STN: "0"
SYNC_TIME: "2024-04-13 22:35:56"
id: "46396"

        为了让更好的使用Java语言进行开发,使这些变量名变得更加合适,同时满足Java的编程规范。因此办结来重点讲解怎么将 json返回的数据转成java的合理变量名。

1、Json转JavaBean

        如上所言,在使用XxlCrawler进行信息爬取之后,返回的数据名称不太符合Java的命名规则。那针对这种需求,有没有什么办法来进行调整呢。答案是肯定的,不管是用Gson或者fastJson,这些设计良好的json处理框架其实都包含了Json对象与JavaBean对象的互相转换。当给定格式不符合Java命名规范的属性名,可以通过注解映射的方式修改成符合Java编码规范的变量。由于本实例中采用的是Gson组件,因此给出的示例代码也是基于Gson来实现的,其它的实现组件请自行搜索相关知识,根据官方文档的知识来进行设置。

        在Gson中,主要是采用@SerializedName("AUTO_FLAG")这个注解,注解后面的字段是通过接口返回的数据字段。把这个注解配置到属性中,表示当前属性对应哪个接口的字段。关键代码如下:

package com.yelang.project.extend.earthquake.domain.crawler;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class CeicEarthquake implements Serializable{
	private static final long serialVersionUID = -1212153879708670015L;
	private Long pkId;//主键
	@SerializedName("AUTO_FLAG")
	private String autoFlag;
	@SerializedName("CATA_ID")
	private String cataId;
	@SerializedName("CATA_TYPE")
	private String cataType;
	@SerializedName("EPI_DEPTH")
	private BigDecimal epiDepth = new BigDecimal("0.0");
	@SerializedName("EPI_LAT")
	private String epiLat;//纬度
	@SerializedName("EPI_LON")
	private String epiLon;
	@SerializedName("EQ_CATA_TYPE")
	private String eqCataType;
	@SerializedName("EQ_TYPE")
	private String eqType;
	@SerializedName("IS_DEL")
	private String isDel;
	@SerializedName("LOCATION_C")
	private String locationC;
	@SerializedName("LOCATION_S")
	private String locationS;
	@SerializedName("LOC_STN")
	private String locStn;
	@SerializedName("M")
	private String m;
	@SerializedName("M_MB")
	private String mmb;
	@SerializedName("M_MB2")
	private String mmb2;
	@SerializedName("M_ML")
	private String mml;
	@SerializedName("M_MS")
	private String mms;
	@SerializedName("M_MS7")
	private String mms7;
	@SerializedName("NEW_DID")
	private String newDid;
	@SerializedName("O_TIME")
	private Date oTime;
	@SerializedName("O_TIME_FRA")
	private String oTimeFra;
	@SerializedName("SAVE_TIME")
	private Date saveTime;
	@SerializedName("SUM_STN")
	private String sumStn;
	@SerializedName("SYNC_TIME")
	private Date syncTime;
	@SerializedName("id")
	private String epiId;
}

        通过以上的代码就可以实现将接口返回的参数映射成符合我们需求的JavaBean。

2、JavaBean与数据库字段映射

        众所周知,数据的命名一般是用小写,而且单词之间一般使用下划线连接起来。而Java中对属性的命名与数据库的字段还是有一定的差异。好在我们采用的是Mybatis_Plus这个框架,可以实现数据库字段和JavaBean的对应。为了后续介绍方便,这里将直接给出空间字段的设置。以实体类代码的形式给出。在Mybatis_Plus中,主要采用@TableField(value="cata_type")来进行数据库字段的设置。完整的代码如下所示:

package com.yelang.project.extend.earthquake.domain.crawler;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.google.gson.annotations.SerializedName;
import com.yelang.framework.handler.PgGeometryTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@TableName(value ="biz_ceic_earthquake",autoResultMap = true)
public class CeicEarthquake implements Serializable{
	private static final long serialVersionUID = -1212153879708670015L;
	@TableId(value="pk_id")
	private Long pkId;//主键
	@SerializedName("AUTO_FLAG")
	@TableField(value="auto_flag")
	private String autoFlag;
	@SerializedName("CATA_ID")
	@TableField(value="cata_id")
	private String cataId;
	@SerializedName("CATA_TYPE")
	@TableField(value="cata_type")
	private String cataType;
	@SerializedName("EPI_DEPTH")
	@TableField(value="epi_depth")
	private BigDecimal epiDepth = new BigDecimal("0.0");
	@SerializedName("EPI_LAT")
	@TableField(value="epi_lat")
	private String epiLat;//纬度
	@SerializedName("EPI_LON")
	@TableField(value="epi_lon")
	private String epiLon;
	@SerializedName("EQ_CATA_TYPE")
	@TableField(value="eq_cata_type")
	private String eqCataType;
	@SerializedName("EQ_TYPE")
	@TableField(value="eq_type")
	private String eqType;
	@SerializedName("IS_DEL")
	@TableField(value="is_del")
	private String isDel;
	@SerializedName("LOCATION_C")
	@TableField(value="location_c")
	private String locationC;
	@SerializedName("LOCATION_S")
	@TableField(value="location_s")
	private String locationS;
	@SerializedName("LOC_STN")
	@TableField(value="loc_stn")
	private String locStn;
	@SerializedName("M")
	@TableField(value="m")
	private String m;
	@SerializedName("M_MB")
	@TableField(value="mmb")
	private String mmb;
	@SerializedName("M_MB2")
	@TableField(value="mmb2")
	private String mmb2;
	@SerializedName("M_ML")
	@TableField(value="mml")
	private String mml;
	@SerializedName("M_MS")
	@TableField(value="mms")
	private String mms;
	@SerializedName("M_MS7")
	@TableField(value="mms7")
	private String mms7;
	@SerializedName("NEW_DID")
	@TableField(value="new_did")
	private String newDid;
	@SerializedName("O_TIME")
	@TableField(value="o_time")
	private Date oTime;
	@SerializedName("O_TIME_FRA")
	@TableField(value="o_time_fra")
	private String oTimeFra;
	@SerializedName("SAVE_TIME")
	@TableField(value="save_time")
	private Date saveTime;
	@SerializedName("SUM_STN")
	@TableField(value="sum_stn")
	private String sumStn;
	@SerializedName("SYNC_TIME")
	@TableField(value="sync_time")
	private Date syncTime;
	@SerializedName("id")
	@TableField(value="epi_id")
	private String epiId;
	@TableField(typeHandler = PgGeometryTypeHandler.class)
	private String geom;
	@TableField(exist=false)
	private String geomJson;
}

二、空间数据表设计

        在很多的技术博客当中,都提到过如何进行空间数据库的设计,与常规的关系型数据库表不一样的是,空间数据库多了空间信息的存储的查询。以地震信息为例,就包含了其经纬度坐标信息。因此这里使用PostGIS作为空间数据库存储空间信息。

        在讲解改表是,我们首先根据接口的字段来定义其关键属性字段,然后自己设计Geometry字段,通过爬取的经纬度信息来生成Geometry信息,然后保存到相应的字段当中。

1、表结构设计

        主要表结构设计如下,包含了通过接口返回的基本信息:

 

         生成出来的SQL语句如下,如果需要的话,可以直接使用,这里直接提供,供大家参考。

CREATE TABLE "public"."biz_ceic_earthquake" (
  "pk_id" int8 NOT NULL,
  "auto_flag" varchar(30) COLLATE "pg_catalog"."default",
  "cata_id" varchar(30) COLLATE "pg_catalog"."default",
  "cata_type" varchar(30) COLLATE "pg_catalog"."default",
  "epi_depth" numeric(11,8),
  "epi_lat" varchar(15) COLLATE "pg_catalog"."default",
  "epi_lon" varchar(15) COLLATE "pg_catalog"."default",
  "eq_cata_type" varchar(30) COLLATE "pg_catalog"."default",
  "eq_type" varchar(30) COLLATE "pg_catalog"."default",
  "is_del" varchar(6) COLLATE "pg_catalog"."default",
  "location_c" varchar(255) COLLATE "pg_catalog"."default",
  "location_s" varchar(100) COLLATE "pg_catalog"."default",
  "loc_stn" varchar(20) COLLATE "pg_catalog"."default",
  "m" varchar(10) COLLATE "pg_catalog"."default",
  "mmb" varchar(10) COLLATE "pg_catalog"."default",
  "mmb2" varchar(10) COLLATE "pg_catalog"."default",
  "mml" varchar(10) COLLATE "pg_catalog"."default",
  "mms" varchar(10) COLLATE "pg_catalog"."default",
  "mms7" varchar(10) COLLATE "pg_catalog"."default",
  "new_did" varchar(16) COLLATE "pg_catalog"."default",
  "o_time" timestamp(6),
  "o_time_fra" varchar(10) COLLATE "pg_catalog"."default",
  "save_time" timestamp(6),
  "sum_stn" varchar(10) COLLATE "pg_catalog"."default",
  "sync_time" timestamp(6),
  "epi_id" varchar(10) COLLATE "pg_catalog"."default",
  "geom" "public"."geometry",
  CONSTRAINT "pk_biz_ceic_earthquake" PRIMARY KEY ("pk_id")
);
CREATE INDEX "idx_biz_ceic_earthquake_eqidept" ON "public"."biz_ceic_earthquake" USING btree (
  "epi_depth" "pg_catalog"."numeric_ops" ASC NULLS LAST
);
CREATE INDEX "idx_biz_ceic_earthquake_geom" ON "public"."biz_ceic_earthquake" USING gist (
  "geom" "public"."gist_geometry_ops_2d"
);
CREATE INDEX "idx_biz_ceic_earthquake_m" ON "public"."biz_ceic_earthquake" USING btree (
  "m" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
COMMENT ON COLUMN "public"."biz_ceic_earthquake"."pk_id" IS '主键id';

        为了在查询的时候提高查询性能,我们建立三个索引,两个普通索引和一个空间索引,构建在geom这个字段上的。后期如果要做空间分析可以使用空间索引进行查询效率提升。

三、PostGIS数据保存

        设计好了地震信息空间数据表,信息接口也进行了定义。万事俱备只欠东风,只需要采用Mybatis_Plus组件将爬取的信息通过接口保存到PostGIS空间数据库中即可。在第一节中其实已经将实现接口参数转换成数据库字段,关于实体类的定义在此不赘述,这里只将数据入库的流程和方法进行简单介绍。ORM框架采用Mybatis_Plus框架。

1、Mapper接口定义

        mapper接口相当于是数据库操作的总入口,由于这里仅演示如何插入数据,暂时没有其它的业务需求,因此接口中除集成的方法,暂不新增新的方法。

package com.yelang.project.extend.earthquake.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yelang.project.extend.earthquake.domain.crawler.CeicEarthquake;
public interface CeicEarthquakeMapper extends BaseMapper<CeicEarthquake>{
}

2、Service逻辑层实现

        业务逻辑层也比较简单,为了演示效果,同样不增加额外的方法,仅实现MP自带的批量插入功能来实现数据插入。

package com.yelang.project.extend.earthquake.service.impl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yelang.project.extend.earthquake.domain.crawler.CeicEarthquake;
import com.yelang.project.extend.earthquake.mapper.CeicEarthquakeMapper;
import com.yelang.project.extend.earthquake.service.ICeicEarthquakeService;
@Service
public class CeicEarthquakeServiceImpl extends ServiceImpl<CeicEarthquakeMapper, CeicEarthquake> implements ICeicEarthquakeService{
}

3、数据入库

        数据入库主要是调用ICeicEarthquakeService的批量插入方法。这里采用Junit测试套件进行爬取测试。实际情况可以内置到SpringBoot的一个方法或者定时任务当中。在这里需要注意的一个地方就是,我们在数据库中定义了一个Geometry字段来存储空间点信息。因此在信息爬取过程中需要动态生成,主要是手动构造Wkt格式的数据,通过PgGeometryTypeHandler来实现空间类型转换,看过博客的朋友应该对这种操作方法很熟悉。爬取及入库的代码如下:

package com.yelang.project;
import java.util.Date;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.xuxueli.crawler.XxlCrawler;
import com.xuxueli.crawler.parser.strategy.NonPageParser;
import com.yelang.common.utils.StringUtils;
import com.yelang.project.extend.earthquake.domain.crawler.CeicDateAdapter;
import com.yelang.project.extend.earthquake.domain.crawler.CeicEarthquake;
import com.yelang.project.extend.earthquake.domain.crawler.CeicEarthquakeCrawler;
import com.yelang.project.extend.earthquake.service.ICeicEarthquakeService;
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestXxlCrawerCeic {
	@Autowired
	private ICeicEarthquakeService service;
	@Test
	public void testGetCeic() {
		String commonUrl = "https://www.ceic.ac.cn/ajax/search?start=&&end=&&jingdu1=&&jingdu2=&&weidu1=&&weidu2=&&height1=&&height2=&&zhenji1=&&zhenji2=&_="
				+ System.currentTimeMillis();
		String[] urlList = new String[20];
		urlList[0] = commonUrl + "&&page=" + 1;
		// 构造爬虫
		XxlCrawler crawler = new XxlCrawler.Builder().setUrls(urlList).setThreadCount(3).setPauseMillis(3000)
				.setUserAgent(
						"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36")
				.setIfPost(false).setFailRetryCount(3)// 重试三次
				.setPageParser(new NonPageParser() {
					public void parse(String url, String pageSource) {
						if (!StringUtils.isBlank(pageSource)) {
							pageSource = pageSource.substring(1, pageSource.length() - 1);
							Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new CeicDateAdapter()).create();
							CeicEarthquakeCrawler crawler = gson.fromJson(pageSource, CeicEarthquakeCrawler.class);
							System.out.println("总页数:"+crawler.getNum());
							for (CeicEarthquake data : crawler.getShuju()) {
								String geom = "SRID=" + 4326 +";POINT (" + data.getEpiLon()+ " "+data.getEpiLat()+")";//拼接srid,实现动态写入
								System.out.println(data);
								System.out.println(geom);
								data.setGeom(geom);
							}
							service.saveBatch(crawler.getShuju(), 300);
						}
					}
				}).build();
		crawler.start(true);// 启动
	}
}

        上面代码的关键就是WKT的构造,默认采用4326坐标系:

String geom = "SRID=" + 4326 +";POINT (" + data.getEpiLon()+ " "+data.getEpiLat()+")";//拼接srid,实现动态写入

4、运行实例及结果

        使用Junit的测试套件运行上述方法,在控制台可以看到如下的打印结果:

        很明显在控制台中看到批量插入语句和信息爬取信息,示例信息如下:

CeicEarthquake(pkId=null, autoFlag=M, cataId=CD20240407190310.00, cataType=, epiDepth=18, epiLat=41.89, epiLon=82.17, eqCataType=, eqType=M, isDel=, locationC=新疆阿克苏地区拜城县, locationS=, locStn=0, m=4.2, mmb=0, mmb2=0, mml=0, mms=0, mms7=0, newDid=CD20240407190310, oTime=Sun Apr 07 19:03:09 CST 2024, oTimeFra=0, saveTime=Sun Apr 07 19:08:03 CST 2024, sumStn=0, syncTime=Sun Apr 07 19:08:03 CST 2024, epiId=46366, geom=null, geomJson=null)
SRID=4326;POINT (82.17 41.89)
CeicEarthquake(pkId=null, autoFlag=M, cataId=CD20240407182216.00, cataType=, epiDepth=15, epiLat=41.91, epiLon=82.00, eqCataType=, eqType=M, isDel=, locationC=新疆阿克苏地区拜城县, locationS=, locStn=0, m=3.0, mmb=0, mmb2=0, mml=0, mms=0, mms7=0, newDid=CD20240407182216, oTime=Sun Apr 07 18:22:16 CST 2024, oTimeFra=0, saveTime=Sun Apr 07 18:27:58 CST 2024, sumStn=0, syncTime=Sun Apr 07 18:27:58 CST 2024, epiId=46365, geom=null, geomJson=null)
SRID=4326;POINT (82.00 41.91)
19:43:44.403 [pool-2-thread-2] DEBUG c.y.p.e.e.m.C.insert - [debug,137] - ==>  Preparing: INSERT INTO biz_ceic_earthquake ( pk_id, auto_flag, cata_id, cata_type, epi_depth, epi_lat, epi_lon, eq_cata_type, eq_type, is_del, location_c, location_s, loc_stn, m, mmb, mmb2, mml, mms, mms7, new_did, o_time, o_time_fra, save_time, sum_stn, sync_time, epi_id, geom ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
19:43:44.548 [pool-2-thread-2] DEBUG c.y.p.e.e.m.C.insert - [debug,137] - ==> Parameters: 1780562787278299138(Long), M(String), CD20240411005512.00(String), (String), 12(BigDecimal), 24.14(String), 121.87(String), (String), M(String), (String), 台湾花莲县海域(String), (String), 0(String), 4.4(String), 0(String), 0(String), 0(String), 0(String), 0(String), CD20240411005512(String), 2024-04-11 00:55:12.0(Timestamp), 0(String), 2024-04-11 01:05:21.0(Timestamp), 0(String), 2024-04-11 01:05:21.0(Timestamp), 46385(String), SRID=4326;POINT(121.87 24.14)(PGgeometry)

         最后来看一下在PostGIS当中是否将数据成功入库,在客户端中执行以下查询语句:

select * from biz_ceic_earthquake;

        通过上述界面看到,通过XxlCrawler爬取的信息就成功的保存到了PostGIS空间数据库中。

总结

        以上就是本文的主要内容,本文即紧紧围绕着将信息保存到空间数据库的目标,重点讲解如何实现将中国地震台网爬取的地震信息保存到PostGIS空间数据库中。首先讲解在爬取过程中数据格式和响应数据类型的转换,将网站回传的json数据转成符合Java命名规范的数据。然后介绍台网地震信息表的设计,如何构建空间数据表。再次介绍如何将爬取的数据调用Mybatis-Plus组件实现批量入库。行文仓促,定有不足,欢迎朋友们在评论浏览批评指正,不胜感激。

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

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

相关文章

解决yarn第一次使用无法运行的问题

报错&#xff1a; yarn : 无法加载文件 D:\program software\NVM\nvm\v16.20.0\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 …

鲲鹏920RDMA应用示例代码

当前针对鲲鹏920服务器&#xff0c;编写了RDMA通信传输代码&#xff0c;首先采用TCP socket进行管理信息获取&#xff0c;然后调用verbs函数接口进行数据传输。需要安装rdma-core-devel库才可以编译 代码如下&#xff1a; /** rdma_lib.h** Created on: 2021年1月1日* A…

java激活

此破解码适合2023所有版本 找到idea64.exe.vmoption添加下面三行 链接:破解包下载 提取码:jqw1

软件工程 考研复试常考知识点总结

软件工程 什么是软件工程&#xff0c;这门课讲的什么&#xff1f; 软件工程就是把软件的开发、运行、维护的各个阶段进行系统化和规范化的过程&#xff0c;也就是把工程化的方法运用在软件技术之中&#xff0c;以构建和维护高质量的软件。 进一步&#xff0c;什么是工程化思想…

0基础学习SQL注入之万能账号密码(BUUctf例题-[极客大挑战 2019]EasySQL1)

做题 借助例题[极客大挑战 2019]EasySQL1来理解SQL注入中的万能账号密码。 我们现解题&#xff0c;解题过程中的知识点在后面都会说到。 打开网址&#xff0c;我们看到的是这个界面。根据题目提示应该是属于SQL注入类型的 1.寻找注入点&#xff0c;很明显&#xff0c;输入用…

JDK17的Mybatis-Plus报错问题

添加 --add-opens java.base/java.langALL-UNNAMED

物理机安装centos7并配置基本环境,网络配置,docker配置

1.首先下载镜像Download 2.下载UltraISO 安装docker 第1步&#xff1a;卸载当前版本docker yum erase docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \do…

unity制作拼接地图

前段时间有个朋友问我想要制作一款地图编辑器&#xff0c;最开始我还想着在一个平面用节点切割制作地图编辑器这倒是也行&#xff0c;但不太好控制每一个点&#xff0c;如果未来项目大了&#xff0c;更加不好维护。 偶然间翻到一篇文章&#xff1a;unity地图边缘检测 或许我们…

升级啦!探索全新 StarRocks 中文社区与高效使用秘籍!

眼尖的朋友可能已经注意到&#xff0c;StarRocks 中文社区最近换上了全新的皮肤。是的&#xff0c;我们 StarRocks 的聚集地升级了&#xff01;&#x1f389; 自成立两年半以来&#xff0c;StarRocks 中文社区不断壮大&#xff0c;现已发展成为一个拥有数万名成员的活跃社区。…

2024年团队程序设计天梯赛模拟赛 L1 + L2

目录 L1 - 6 剪切复制 L1 - 8 小偷踩点 L2 - 1 推宝塔 L2 - 2 含茶量 L2 - 3 到底爱不爱我 L2 - 4 寻宝图 L1 - 6 剪切复制 使用计算机进行文本编辑时常见的功能是剪切功能&#xff08;快捷键&#xff1a;Ctrl X&#xff09;。请实现一个简单的具有剪切和粘贴功能的文本…

MSSQL 命令行操作说明 sql server 2022 命令行下进行配置管理

说明&#xff1a;本文的内容是因为我在导入Access2019的 *.accdb 格式的数据时&#xff0c;总是出错的背景下&#xff0c;不得已搜索和整理了一下&#xff0c;如何用命令行进行sql server 数据库和用户管理的方法&#xff0c;作为从Access2019 直接导出数据到sql server 数据库…

低噪声放大器是如何实现低噪声放大的功能的

灵敏度作为接收机最重要的指标之一,直接决定了接收机能分辨的最小信号。接收机的灵敏度计算公式如下所示。 Psensitivity=-174dBm+NF+10*lg(BW)+SNR 由接收机灵敏度的计算公式可知,影响接收机灵敏度的指标有噪声系数、带宽和信噪比,因此一旦带宽和信噪比确定了,那么能决…

图像基础—图像分类

图像通常分为二值图像、灰度图像和彩色图像 图 1-3 二值图像、灰度图像和彩色图像 &#xff08;1&#xff09;二值图像 二值图像又称为黑白图像&#xff0c;图像中任何一个点非黑即白&#xff0c;要么为白色&#xff08;像素 为 255&#xff09;&#xff0c;要么为黑色&#x…

制作一个RISC-V的操作系统十一-定时器中断

文章目录 CLINT定时器中断mtimemtimecmp机制总体框架流程时间节拍系统时钟代码 CLINT 产生软件中断和定时器中断 定时器中断 mtime 类似计数器&#xff0c;按照硬件对应的固定频率递增 上电后会自动复位为0&#xff0c;有硬件自动完成 mtimecmp 需要自己设置&#xff0…

Docker安装Oracle之踩坑记

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

ai免费打造写真大片!3个宝藏工具!

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;包括摄影和图像处理领域。今天&#xff0c;我们就来揭秘那些能够让你轻松打造出专业级写真大片的AI工具&#xff0c;让你的摄影作品惊艳全场&#xff01; 迅捷图片转…

机器学习理论入门---线性回归从理论到实践

线性回归是机器学习里面最简单也是最常用的算法&#xff0c;理解了线性回归的推导之后对于后续的学习有很大帮助&#xff0c;所以我决定从这里开始深入学习相关的机器学习模型。 本篇首先从矩阵求导开始切入&#xff0c;然后介绍一次线性回归的推导&#xff0c;再到代码实现。本…

2024第十五届蓝桥杯JavaB组省赛部分题目

目录 第三题 第四题 第五题 第六题 第七题 第八题 转载请声明出处&#xff0c;谢谢&#xff01; 填空题暂时可以移步另一篇文章&#xff1a;2024第十五届蓝桥杯 Java B组 填空题-CSDN博客 第三题 第四题 第五题 第六题 第七题 第八题 制作不易&#xff0c;还请点个赞支持…

PyTorch深度学习之旅:从入门到精通的十个关键步骤

在人工智能的浪潮中&#xff0c;深度学习框架扮演着至关重要的角色。PyTorch作为其中的佼佼者&#xff0c;以其简洁、直观和灵活的特性&#xff0c;吸引了众多开发者与研究者。本文将引导您逐步掌握PyTorch&#xff0c;从基础概念到高级应用&#xff0c;让您在深度学习的道路上…

LLM推理框架Triton Inference Server学习笔记(二): Triton模型部署流程(stey by stey)

官方文档查阅: TritonInferenceServer文档 1. 写在前面 上一篇文章对triton inference server进行了一个整体的介绍&#xff0c;解答了三个经典问题what, why, how。 这篇文章就开始转入实践&#xff0c; 从实践的角度整理Triton模型部署的全流程&#xff0c; 如果我有一个训…