0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKT方案

大纲

  • 几何结构构建
    • 点集合
    • 线
    • 线集合
    • 面集合
    • 几何信息集合
  • TypeHandler
  • SQL操作
    • 写入操作
    • 读取操作
    • 完整XML
  • Mapper
  • 测试代码
  • 建表SQL
  • 总结
  • 代码
  • 参考资料

WKT全称是Well-Known Text。它是一种表达几何信息的字符串内容。比如点可以用WKT表示为POINT (3 3);线可以用WKT表示为LINESTRING (1 1, 2 2)。
Mysql数据库可以存储一些几何类型数据,比如点、线、多边形等。这在一些基于地理信息的服务上比较有用,比如在地图上的商店地理坐标(点),或者路径规划中的行进路线(线)等。
目前我使用的Mysql是8.4.0版本,它支持如下几何类型数据结构。

类型说明样例图例
POINT (3 3)在这里插入图片描述
点集合MULTIPOINT ((1 1), (2 2), (3 3))
线LINESTRING (1 1, 2 2)在这里插入图片描述
线集合MULTILINESTRING ((1 1, 2 2), (3 3, 4 4))
多边形POLYGON ((1 1, 2 2, 3 3, 1 1))在这里插入图片描述
多边形集合MULTIPOLYGON (((1 1, 2 2, 3 3, 1 1)), ((4 4, 5 5, 6 6, 4 4)))
多种几何类型集合GEOMETRYCOLLECTION (POINT (1 1), LINESTRING (1 1, 2 2), POLYGON ((1 1, 2 2, 3 3, 1 1)))

一般我们会使用org.locationtech.jts的Geometry类来表达几何信息。

<dependency><groupId>org.locationtech.jts</groupId><artifactId>jts-core</artifactId><version>1.19.0</version>
</dependency>

然后使用下面的方法构建各种结构

几何结构构建

GeometryFactory geometryFactory = new GeometryFactory();
Geometry geometry = geometryFactory.createPoint(new Coordinate(3, 3));

点集合

GeometryFactory geometryFactory = new GeometryFactory();
LineString lineString = geometryFactory.createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) });

线

GeometryFactory geometryFactory = new GeometryFactory();
LineString lineString = geometryFactory.createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) });

线集合

GeometryFactory geometryFactory = new GeometryFactory();
MultiLineString multiLineString = geometryFactory.createMultiLineString(new LineString[] {geometryFactory.createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) }),geometryFactory.createLineString(new Coordinate[] { new Coordinate(3, 3), new Coordinate(4, 4) })
});

GeometryFactory geometryFactory = new GeometryFactory();
Polygon polygon = geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1),new Coordinate(2, 2), new Coordinate(3, 3), new Coordinate(1, 1) });

面集合

GeometryFactory geometryFactory = new GeometryFactory();
MultiPolygon multiPolygon = geometryFactory.createMultiPolygon(new Polygon[] {geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2),new Coordinate(3, 3), new Coordinate(1, 1) }),geometryFactory.createPolygon(new Coordinate[] { new Coordinate(4, 4), new Coordinate(5, 5),new Coordinate(6, 6), new Coordinate(4, 4) })
});

几何信息集合

GeometryFactory geometryFactory = new GeometryFactory();
GeometryCollection geometryCollection = geometryFactory.createGeometryCollection(new Geometry[] {geometryFactory.createPoint(new Coordinate(1, 1)),geometryFactory.createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) }),geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2),new Coordinate(3, 3), new Coordinate(1, 1) })
});

下面我们需要将这些结构保存到Mysql数据库中。
由于org.locationtech.jts.geom.Geometry和Mysql内部存储的Geometry不配,所以需要转换操作,于是就要引入typehandler。

TypeHandler

package org.example.typehandlers;import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.PrecisionModel;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.WKTWriter;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class GeometryTypeWKTHandler extends BaseTypeHandler<Geometry>  {private static GeometryFactory factory = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING), 4326);@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Geometry parameter, JdbcType jdbcType) throws SQLException {String str = serializeGeometry(parameter);ps.setString(i, str);;}@Overridepublic Geometry getNullableResult(ResultSet rs, String columnName) throws SQLException {String str = rs.getString(columnName);try {return deserializeGeometry(str);} catch (ParseException e) {throw new SQLException(e);}}@Overridepublic Geometry getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String str = rs.getString(columnIndex);try {return deserializeGeometry(str);} catch (ParseException e) {throw new SQLException(e);}}@Overridepublic Geometry getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String str = cs.getString(columnIndex);try {return deserializeGeometry(str);} catch (ParseException e) {throw new SQLException(e);}}private static String serializeGeometry(Geometry geometry) {WKTWriter writer = new WKTWriter(2);return writer.write(geometry);}private static Geometry deserializeGeometry(String wkt) throws ParseException {return new WKTReader(factory).read(wkt);}}

WKTWriter会将org.locationtech.jts.geom.Geometry转换为String,然后交由SQL语句处理;
WKTReader会将SQL语句读取出来的String转换为org.locationtech.jts.geom.Geometry对象。
在这里插入图片描述

SQL操作

在上图我们看到,TypeHandler主要使用String类型作为媒介来和SQL语句联系。那么SQL语句是如何把String转成Mysql的Geometry内部结构的呢?
这就需要引入ST_GeomFromText和ST_AsText。
ST_GeomFromText可以将WKT格式的几何信息转换为Mysql内部的Geometry结构。比如

ST_GeomFromText('MULTIPOINT (1 1, 2 2, 3 3)')

ST_AsText则可以将Mysql内部的Geometry结构转换为WKT格式的几何信息
在这里插入图片描述

在Mybatis的SQL XML中

写入操作

对org.locationtech.jts.geom.Geometry结构(即geometry字段)使用org.example.typehandlers.GeometryTypeWKTHandler处理成WTK(字符串)几何信息格式后,用ST_GeomFromText转换成Mysql内部的Geometry结构,然后存储。

    <insert id="insertOne" parameterType="org.example.model.GeometryData"  useGeneratedKeys="true" keyProperty="id">insert into geometry_data(id, geometry, update_time, create_time) values(#{id}, ST_GeomFromText(#{geometry, jdbcType=BLOB, typeHandler=org.example.typehandlers.GeometryTypeWKTHandler}), now(), now())</insert>

这儿需要注意的是ST_GeomFromText不是万能的。比如针对“几何信息集合”(GeometryCollection)则需要使用ST_GeomCollFromText来转换

    <insert id="insertGeometryCollection" parameterType="org.example.model.GeometryData"  useGeneratedKeys="true" keyProperty="id">insert into geometry_data(id, geometry, update_time, create_time) values(#{id}, ST_GeomCollFromText(#{geometry, jdbcType=BLOB, typeHandler=org.example.typehandlers.GeometryTypeWKTHandler}), now(), now())</insert>

读取操作

由于需要对geometry字段特殊处理,所以不能使用Select * From geometry_data,而需要把每个参数都写好。
ST_AsText会将Mysql的内部的Geometry结构转换成WKT格式(字符串)的几何信息,然后交由org.example.typehandlers.GeometryTypeWKTHandler转换成org.locationtech.jts.geom.Geometry结构。

    <resultMap id="GeometryDataResultMap" type="org.example.model.GeometryData"><result property="id" column="id"/><result property="geometry" column="geometry" typeHandler="org.example.typehandlers.GeometryTypeWKTHandler" jdbcType="BLOB"/><result property="updateTime" column="update_time"/><result property="createTime" column="create_time"/></resultMap><select id="findAll" resultMap="GeometryDataResultMap">select id, ST_AsText(geometry) AS geometry, update_time, create_time from geometry_data</select>

完整XML

<?xml version="1.0" encoding="UTF-8"?>
<!-- AllTypeMapper-1.xml -->
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.GeometryDataWKTMapper"><resultMap id="GeometryDataResultMap" type="org.example.model.GeometryData"><result property="id" column="id"/><result property="geometry" column="geometry" typeHandler="org.example.typehandlers.GeometryTypeWKTHandler" jdbcType="BLOB"/><result property="updateTime" column="update_time"/><result property="createTime" column="create_time"/></resultMap><select id="findAll" resultMap="GeometryDataResultMap">select id, ST_AsText(geometry) AS geometry, update_time, create_time from geometry_data</select><select id="find" resultMap="GeometryDataResultMap">select id, ST_AsText(geometry) AS geometry, update_time, create_time from geometry_data where id = #{id}</select><insert id="insertOne" parameterType="org.example.model.GeometryData"  useGeneratedKeys="true" keyProperty="id">insert into geometry_data(id, geometry, update_time, create_time) values(#{id}, ST_GeomFromText(#{geometry, jdbcType=BLOB, typeHandler=org.example.typehandlers.GeometryTypeWKTHandler}), now(), now())</insert><insert id="insertList" parameterType="list">insert into geometry_data(id, geometry, update_time, create_time) values<foreach item="item" collection="list" separator=",">(#{item.id}, ST_GeomFromText(#{item.geometry, jdbcType=BLOB, typeHandler=org.example.typehandlers.GeometryTypeWKTHandler}), now(), now())</foreach></insert><update id="updateOne" parameterType="org.example.model.GeometryData">update geometry_data set geometry = ST_GeomFromText(#{geometry, jdbcType=BLOB, typeHandler=org.example.typehandlers.GeometryTypeWKTHandler}), update_time = now() where id = #{id} </update><insert id="insertGeometryCollection" parameterType="org.example.model.GeometryData"  useGeneratedKeys="true" keyProperty="id">insert into geometry_data(id, geometry, update_time, create_time) values(#{id}, ST_GeomCollFromText(#{geometry, jdbcType=BLOB, typeHandler=org.example.typehandlers.GeometryTypeWKTHandler}), now(), now())</insert></mapper>

Mapper

package org.example.mapper;import java.util.List;import org.example.model.GeometryData;public interface GeometryDataWKTMapper {public List<GeometryData> findAll();public GeometryData find(Long id);public Long insertOne(GeometryData geometryData);public Long insertList(List<GeometryData> geometryDataList);public Long updateOne(GeometryData geometryData);public Long insertGeometryCollection(GeometryData geometryData);
} 

测试代码

package org.example;import static org.junit.jupiter.api.Assertions.fail;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.example.mapper.GeometryDataWKTMapper;
import org.example.model.GeometryData;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryCollection;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.LineString;
import org.locationtech.jts.geom.MultiLineString;
import org.locationtech.jts.geom.MultiPoint;
import org.locationtech.jts.geom.MultiPolygon;
import org.locationtech.jts.geom.Polygon;public class GeometryDataWKTTest {private static SqlSessionFactory sqlSF;@BeforeAllstatic void CreateSessionFactory() throws IOException {InputStream in = Resources.getResourceAsStream("mybatis/config/mybatis-config-geometry-wkt.xml");sqlSF = new SqlSessionFactoryBuilder().build(in);}@Testpublic void testFindAll() {List<GeometryData> all = null;try (SqlSession session = sqlSF.openSession()) {all = session.getMapper(GeometryDataWKTMapper.class).findAll();} catch (Exception e) {System.out.println(e.getMessage());}for (GeometryData a : Objects.requireNonNull(all)) {System.out.println(a.getGeometry());}}@Testpublic void testFind() {try (SqlSession session = sqlSF.openSession()) {GeometryDataWKTMapper GeometryDataWKTMapper = session.getMapper(GeometryDataWKTMapper.class);GeometryData one = GeometryDataWKTMapper.find(1L);System.out.println(one.getGeometry());} catch (Exception e) {System.out.println(e.getMessage());}}@Testpublic void testInsert() {try (SqlSession session = sqlSF.openSession()) {GeometryDataWKTMapper GeometryDataWKTMapper = session.getMapper(GeometryDataWKTMapper.class);GeometryData geometryData = new GeometryData();GeometryFactory geometryFactory = new GeometryFactory();Coordinate coordinate = new Coordinate(1, 1);Geometry geometry = geometryFactory.createPoint(coordinate);geometryData.setGeometry(geometry);long count = GeometryDataWKTMapper.insertOne(geometryData);System.out.println(count);session.commit();} catch (Exception e) {System.out.println(e.getMessage());fail();}}@Testpublic void testUpdate() {try (SqlSession session = sqlSF.openSession()) {GeometryDataWKTMapper GeometryDataWKTMapper = session.getMapper(GeometryDataWKTMapper.class);GeometryData geometryData = new GeometryData();GeometryFactory geometryFactory = new GeometryFactory();Coordinate coordinate = new Coordinate(2, 2);Geometry geometry = geometryFactory.createPoint(coordinate);geometryData.setId(1L);geometryData.setGeometry(geometry);long count = GeometryDataWKTMapper.updateOne(geometryData);System.out.println(count);session.commit();} catch (Exception e) {System.out.println(e.getMessage());fail();}}@Testpublic void testInsertList() {try (SqlSession session = sqlSF.openSession()) {GeometryDataWKTMapper GeometryDataWKTMapper = session.getMapper(GeometryDataWKTMapper.class);List<GeometryData> geometryDataList = new ArrayList<>();{GeometryData geometryData = new GeometryData();GeometryFactory geometryFactory = new GeometryFactory();Coordinate coordinate = new Coordinate(3, 3);Geometry geometry = geometryFactory.createPoint(coordinate);geometryData.setGeometry(geometry);geometryDataList.add(geometryData);}{GeometryData geometryData = new GeometryData();GeometryFactory geometryFactory = new GeometryFactory();LineString lineString = geometryFactory.createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) });geometryData.setGeometry(lineString);geometryDataList.add(geometryData);}{GeometryData geometryData = new GeometryData();GeometryFactory geometryFactory = new GeometryFactory();MultiLineString multiLineString = geometryFactory.createMultiLineString(new LineString[] {geometryFactory.createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) }),geometryFactory.createLineString(new Coordinate[] { new Coordinate(3, 3), new Coordinate(4, 4) })});geometryData.setGeometry(multiLineString);geometryDataList.add(geometryData);}{GeometryData geometryData = new GeometryData();GeometryFactory geometryFactory = new GeometryFactory();MultiPolygon multiPolygon = geometryFactory.createMultiPolygon(new Polygon[] {geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2),new Coordinate(3, 3), new Coordinate(1, 1) }),geometryFactory.createPolygon(new Coordinate[] { new Coordinate(4, 4), new Coordinate(5, 5),new Coordinate(6, 6), new Coordinate(4, 4) })});geometryData.setGeometry(multiPolygon);geometryDataList.add(geometryData);}// {//     GeometryData geometryData = new GeometryData();//     GeometryFactory geometryFactory = new GeometryFactory();//     LinearRing linearRing = geometryFactory.createLinearRing(new Coordinate[] { new Coordinate(1, 1),//             new Coordinate(2, 2), new Coordinate(3, 3), new Coordinate(1, 1) });//     geometryData.setGeometry(linearRing);//     geometryDataList.add(geometryData);// }{GeometryData geometryData = new GeometryData();GeometryFactory geometryFactory = new GeometryFactory();MultiPoint multiPoint = geometryFactory.createMultiPointFromCoords(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2), new Coordinate(3, 3) });geometryData.setGeometry(multiPoint);geometryDataList.add(geometryData);}{GeometryData geometryData = new GeometryData();GeometryFactory geometryFactory = new GeometryFactory();Polygon polygon = geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1),new Coordinate(2, 2), new Coordinate(3, 3), new Coordinate(1, 1) });geometryData.setGeometry(polygon);geometryDataList.add(geometryData);}// {//     GeometryData geometryData = new GeometryData();//     GeometryFactory geometryFactory = new GeometryFactory();//     GeometryCollection geometryCollection = geometryFactory.createGeometryCollection(new Geometry[] {//             geometryFactory.createPoint(new Coordinate(1, 1)),//             geometryFactory.createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) }),//             geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2),//                     new Coordinate(3, 3), new Coordinate(1, 1) })//     });//     geometryData.setGeometry(geometryCollection);//     geometryDataList.add(geometryData);// }long count = GeometryDataWKTMapper.insertList(geometryDataList);System.out.println(count);session.commit();} catch (Exception e) {System.out.println(e.getMessage());fail();}}@Testpublic void testInsertGeometryCollection() {try (SqlSession session = sqlSF.openSession()) {GeometryDataWKTMapper GeometryDataWKTMapper = session.getMapper(GeometryDataWKTMapper.class);GeometryData geometryData = new GeometryData();GeometryFactory geometryFactory = new GeometryFactory();GeometryCollection geometryCollection = geometryFactory.createGeometryCollection(new Geometry[] {geometryFactory.createPoint(new Coordinate(1, 1)),geometryFactory.createLineString(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2) }),geometryFactory.createPolygon(new Coordinate[] { new Coordinate(1, 1), new Coordinate(2, 2),new Coordinate(3, 3), new Coordinate(1, 1) })});geometryData.setGeometry(geometryCollection);Long index = GeometryDataWKTMapper.insertGeometryCollection(geometryData);System.out.println(index);session.commit();} catch(Exception e) {System.out.println(e.getMessage());fail();}}
}

在这里插入图片描述

建表SQL

CREATE TABLE `geometry_data` (`id` BIGINT(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',`geometry` GEOMETRY NOT NULL COMMENT '几何信息',`create_time` timestamp  NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp  NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',`deleted` boolean DEFAULT false COMMENT '是否已被删除',PRIMARY KEY (`id`),SPATIAL INDEX `spatial_geometry` (`geometry`)
) COMMENT='几何数据表';

总结

很多数据库为了兼容Mysql,针对Geometry类型,在WKT模式下是兼容的。因为如何将WKT转换成自己数据库内部的结构,即对ST_GeomFromText等方法的实现是可以自己内部处理,让用户不会感知。这让WKT方案在跨数据库时有比较好的兼容性。
但是如果只是针对Mysql数据库,或者像OceanBase这类对Mysql底层也兼容很好的数据库,则可以考虑WKB方案。这块的内容我们会在《0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKB方案》中介绍。

代码

https://github.com/f304646673/mybatis_demo

参考资料

  • https://dev.mysql.com/doc/refman/8.0/en/gis-data-formats.html#gis-wkb-format
  • https://dev.mysql.com/doc/refman/8.0/en/gis-wkt-functions.html#function_st-geomfromtext
  • https://www.keene.edu/campus/maps/tool/

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

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

相关文章

Playwright教程

Playwright简介 支持多数浏览器 在Chromium&#xff0c;Firefox和WebKit上进行测试。Playwright拥有适用于所有现代浏览器的完整API覆盖&#xff0c;包括Google Chrome和Microsoft Edge&#xff08;带有Chromium&#xff09;&#xff0c;Apple Safari&#xff08;带有WebKit&a…

【哈希映射 字符串 乘法原理】2227. 加密解密字符串

本文涉及知识点 哈希映射 字符串 乘法原理 LeetCode 2227. 加密解密字符串 给你一个字符数组 keys &#xff0c;由若干 互不相同 的字符组成。还有一个字符串数组 values &#xff0c;内含若干长度为 2 的字符串。另给你一个字符串数组 dictionary &#xff0c;包含解密后所…

SpringCloud微服务03-微服务保护-分布式事务-MQ基础-MQ高级

一、微服务保护 1.雪崩问题 如何做好后备方案就是后续&#xff1a; 2.雪崩解决方案 某一个服务的线程是固定的&#xff0c;出现故障线程占满后&#xff0c;就不会让取调用这个服务&#xff0c;对其他服务就没有影响。 3.Sentinel ①初识Sentinel 配置过程&#xff1a;day05-服…

C++之多态详解

1. 多态的概念 1.1 概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&a…

源码编译安装LAMP

目录 1.LAMP概述 2.编译安装Apache httpd服务 1.关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径&#xff0c;并把httpd服务的可执行程序文件放入路径环境变量的目录中便于系统识别 6.添…

数据清洗(ETL)案例实操

文章目录 数据清洗&#xff08;ETL&#xff09;概述案例需求和分析代码实现和结果分析 数据清洗&#xff08;ETL&#xff09;概述 “ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;Extract&#xff09;、转换&…

查询一个字符串在另一个字符串中出现的次数(java)

查询一个字符串在另一个字符串中出现的次数 例&#xff1a; String str1“helloworld,java,python,hellokafka,world big table helloteacher”; String str2“hello”; 字符串str2在str1中出现3次 代码 package exercise.test8;public class Demo8 {public static void mai…

【网络安全】2030年十大新兴网络安全威胁

欧盟网络安全局&#xff08;ENISA&#xff09;已发布了一份全面的清单&#xff0c;列出了预计到2030年将影响数字领域的十大新兴网络安全威胁。 该预测是为期八个月的广泛研究的成果&#xff0c;融合了ENISA前瞻专家小组、CSIRTs网络以及欧盟CyCLONe专家的见解。 这项研究突显…

[技术报告]InternLM2 Technical Report

摘要 像ChatGPT和GPT-4这样的大型语言模型&#xff08;llm&#xff09;的进化引发了人们对人工通用智能&#xff08;AGI&#xff09;出现的讨论。然而&#xff0c;在开源模型中复制这种进步一直是一个挑战。本文介绍了InternLM2&#xff0c;这是一个开源的大语言模型&#xff…

【面试干货】矩阵对角线元素之和

【面试干货】矩阵对角线元素之和 1、实现思想2、代码实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、实现思想 创建一个3x3的二维数组来表示输入的矩阵。通过嵌套循环读取输入的矩阵元素&#xff0c;并将其保存到数组中。再次嵌套循…

揭秘齿轮加工工艺的选用原则:精准打造高效传动的秘密武器

在机械制造领域&#xff0c;齿轮作为传动系统中的重要组成部分&#xff0c;其加工工艺的选择至关重要。不同的齿轮加工工艺会影响齿轮的精度、耐用性和效率。本文将通过递进式结构&#xff0c;深入探讨齿轮加工工艺的选用原则&#xff0c;带您了解如何精准打造高效传动的秘密武…

Web应用防火墙的重要性

网络安全是一个永恒的话题&#xff0c;尤其是在未知威胁不断涌现的情况下。企业网络安全是保障业务稳定运行的基础&#xff0c;Web应用防火墙(WAF)是企业网络安全的重要屏障&#xff0c;其性能直接影响到网络服务的质量和安全。 Web应用防火墙是什么&#xff1f; Web应用防火墙…

试试这个自动备份工具!

需要定时备份数据&#xff01; 在这个科技迅速发展的时代&#xff0c;数据安全变得极为重要。作为普通用户&#xff0c;我们需要了解数据备份的重要性。数据备份就像一把保护我们的伞&#xff0c;让我们不用担心重要文件意外丢失带来的困扰。如果我们忽视数据备份&#xff0c;…

SpringIOCDI—第一讲

文章目录 什么是IOC什么是控制&#xff0c;谁控制谁什么是反转&#xff0c;从什么反转到什么了 IOC的注解五大类注解Controller注解&#xff08;控制器存储&#xff09;Service&#xff08;服务存储&#xff09;Repository&#xff08;仓库存储&#xff09;Componet(组件存储)C…

云端漫步:搭建个人博客的移动云之旅

&#x1f482;作者简介&#xff1a; Thunder Wang&#xff0c;阿里云社区专家博主&#xff0c;华为云云享专家&#xff0c;腾讯云社区认证作者&#xff0c;CSDN SAP应用技术领域优质创作者。在学习工作中&#xff0c;我通常使用偏后端的开发语言ABAP&#xff0c;SQL进行任务的完…

每日一题(3)——统计合格率(不会哦)

我们来看一个案例&#xff1a; 如何理解 pass【j】 ? 为什么pass[0]3,pass[1]4? 我一直没有想通&#xff0c;自己重新测试了一些数据&#xff0c;还是没有想明白&#xff0c;希望大家能够集思广益&#xff0c;点拨点拨&#xff1a; 下面的数组我随便使用的数据&#xff0c; …

基于EBAZ4205矿板的图像处理:09基于sobel边缘检测的图像锐化

基于EBAZ4205矿板的图像处理&#xff1a;09基于sobel边缘检测的图像锐化 项目全部文件 随后会上传项目全部文件 先看效果 锐化的有点过头了&#xff0c;不过我也懒得改了&#xff0c;想要改也很简单&#xff0c;无非就是给卷积运算后的结果加个系数&#xff0c;通过改系数调…

【数据分析】Numpy和Pandas库基本用法及实例--基于Japyter notebook实现

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 承接上篇的博客 数据分析—技术栈和开发环境搭…

家政预约小程序03分类管理

目录 1 创建数据源2 搭建导航菜单3 搭建小程序4 设置变量5 变量绑定总结 家政预约小程序里&#xff0c;在首页需要展示家政可以开展的各类业务。我们把业务按照类别进行划分&#xff0c;本篇我们介绍一下管理后台的维护功能以及小程序的展示功能。 1 创建数据源 为了管理和展示…

2024年二建准考证打印入口已开通!

24年二建将于6月1日、2日举行&#xff0c;目前西藏、陕西准考证打印入口已开通&#xff0c;各省也将陆续开始准考证打印工作。 2024二建考试时间安排 2024二建准考证打印时间 二建准考证打印须知 01 准考证打印信息显示空白怎么办? 1)使用电脑自带的浏览器重新试一下。 2)…