Java使用GDAL来解析KMZ及KML实战

news2024/11/17 21:46:15

目录

前言

一、在GQIS中浏览数据

1、关于空间参考

 2、属性表格

二、GDAL的相关驱动及解析实战

1、GDAL中的KMZ驱动

2、GDAL实际解析

三、数据解析成果

1、KML解析结果

2、KMZ文件入库

四、总结


前言

        在前面的博客中讲过纯Java实现Google地图的KMZ和KML文件的解析,不知道有没有小伙伴在工作中实用了。如果有了实战的朋友一定会发现,虽然在前面的博客中,能解决我们对KMZ和KML文件的解析,也能正确的构造WKT数据,也就是意味着我们可以将数据插入到数据库中或者是转为其它的数据格式。但是,使用纯Java解析的方式还是存在一些问题的。

        下面我们首先来看看使用纯Java的解析模式会存在什么问题。这里我们先说结论,然后再使用针对性的解决办法。其实使用纯Java解析模式主要的问题是:1、没有完全识别出KMZ文件的属性值,有一些属性值丢失(当然,这里是通过桌面软件来进行属性的查看),如果想其实是可以解析到。但确实从之前的解析包中没有发现其它属性的获取方法。2、获取不到空间参考。3、对于KMZ文件,首先需要进行解压缩,然后再读取KML文件,解析代码比较繁琐。

        针对上面的这些问题,本文主要采用GDAL组件来进行KMZ和KML文件的解析,在C站或者其它的技术博客中查找相关知识点会发现,使用JAVA和GDAL实现数据解析的相关介绍内容比较少,很多都是C++或者其它语言的示例,因此这里分享如何使用JAVA语言来进行开发。博文首先使用Qgis软件展示KMZ或者KML文件的全部属性和空间参考,然后介绍GDAL中对于读取KMZ和KML的驱动的讲解,基于GDAL的统一解析模式来实现对KMZ和KML文件的统一解析,避免了过多的代码,最后将KMZ数据进行了数据库插入的操作,从而实现从数据解析、转换、存储的一个完整过程。通过本文您可以掌握使用Java语言通过GDAL实现对KMZ和KML文件的统一处理和存储操作,如果您当前也有这样的需求,欢迎进行交流。

一、在GQIS中浏览数据

        既然KMZ和KML也是一种空间矢量数据,那么QGIS也是一定提供了支持的。为了展示在空间矢量数据中的所有属性数据,这里我们采用QGIS来展示。当然您也可以采用Arcgis或者SuperMap等桌面端软件同样也是可以的。

1、关于空间参考

        首先打开QGIS这款软件,在左边的菜单中选择需要展示的KMZ数据,如下图所示:

        然后将所有的图层都加载到地图中,点击全选。然后点击OK,所有的图层就会自动添加到地图中。 在图层窗口中就可以看到这些子图层的数据和具体的信息。

        使用鼠标右键,点击图层的属性,可以看到这个图层的属性信息,比如基础信息、属性信息等。 这里以空间参考信息为例:

序号参数信息参数值
1存储

LIBKML

2编码

UTF-8

3几何图形

Point (PointZ)

4空间参考CRS

EPSG:4326 - WGS 84 - 地理的

5单位

6要素数目

457

 2、属性表格

        矢量数据中,属性表格是很重要的数据,因此十分有必要介绍一下属性信息。在QGIS中,可以查看空间数据的属性表格,同样的属性查看选项中。点击字段即可查看。

序号参数名字段类型说明
1NameString名称
2descriptionString说明
3timestampDateTime时间戳
4beginDateTime
5endDateTime
6altitudeModeString
7tessellateint
8extrudeint
9visibilityint
10drawOrderint
11iconString

        在QGIS中查看属性信息如下所示:

        我们来实际看一下表中的数据大概是什么,打开数据属性表,如下所示:

        如果您看过之前的文章,就会发现之前的数据解析,其实只解析到了description字段 ,其它字段基本上都是空值,哪怕实际上是有值的。

二、GDAL的相关驱动及解析实战

        在使用Qgis软件对上述数据进行了深度解析之后,我们基本对数据有了一个大概的任务。接下来我们来看看GDAL中对于KMZ和KML文件解析驱动的说明相关的知识。为实际的文件解析提供坚实的基础。

1、GDAL中的KMZ驱动

        既然KML和KMZ文件也是矢量文件的一种,那么首先我们来看看GDAL是否支持这两种文件。首先打开GDAL的矢量驱动连接GDAL矢量驱动器。界面如下图所示:

        其实GDAL支持的矢量文件是非常多的,这里仅将我们关注的KMZ和KML文件进行展示,其它的文件格式在后续的博文中我们慢慢讲解。

JML

JML:OpenJUMP JML格式

Yes

Yes

(读取支持需要libexpat)

KML

锁眼标记语言

Yes

Yes

(读取支持需要libexpat)

LIBKML

LIBKML驱动程序(.kml.kmz)

Yes

Yes

libkml语言

LVBAG

荷兰卡达斯特LV包2.0提取物

libexpat公司

MapML

地图管理语言

Yes

Yes

默认内置

Memory

Memory

Yes

Yes

默认内置

MITAB

MapInfo TAB和MIF/MID

Yes

Yes

默认内置

MongoDBv3

MongoDBv3

Yes

Yes

Mongo CXX>=3.4.0客户端库

MSSQLSpatial

Microsoft SQL Server空间数据库

Yes

Yes

ODBC库

MVT

MVT:地图框矢量平铺

Yes

Yes

(需要SQLite和GEOS提供写支持)

        其中我们发现LIBKML,这个驱动是支持对应的KMZ和KML文件的读写的。关于这个驱动的说明,可以在GDAL的官网看得到。它的描述如下:

        LIBKML驱动程序是 Libkml ,的参考实现 KML 阅读和写作,以跨平台C++的形式出现。必须生成并安装Libkml才能使用此OGR驱动程序。注意:您需要构建libkml 1.3或master。 注意,如果您构建并包含这个LIBKML驱动程序,它将成为ogr的KML的默认读取器,覆盖前面的 KML driver . 仍然可以通过命令行指定KML或LIBKML作为输出驱动程序 来自Google的Libkml为任何有效的KML文件提供读取服务。但是,请注意,一些KML设施并没有映射到OGR用作其内部结构的简单功能规范中。因此,驱动程序将尽最大努力理解libkml读入ogr的KML文件的内容,但是您的里程数可能会有所不同。请尝试一些KML文件作为示例,以了解理解的内容。特别是,多个深度的特征集嵌套将被展平以支持ogr的内部格式。

        它的数据来源如下:

        其它更多的属性信息,请大家及时的去GDAL的官网进行查询。有了上述的知识后,我们就可以采用GDAL来进行数据的解析。

2、GDAL实际解析

        本小节将重点以代码的形式对GDAL如何解析KMZ和KML文件进行深入说明。在上面一个小节中我们已经完成了驱动包说明,GDAL是一个支持很多种格式的数据解析程序包,在程序运行的时候,它通过驱动的桥接口实现了不同的数据解析,然后给予统一的数据格式返回对应的属性数据。为我们下一步进行数据的存储和分析提供基础。

        下面以KML文件为例,给出具体的针对KML的解析代码。

@Test
	public void testReadKml() {
		//指定文件的名字和路径
        String strVectorFile ="C:/BaiduDownload/基地-地图数据(kmz)/usa.kml";
        // 注册所有的驱动
        ogr.RegisterAll();
        // 为了支持中文路径,请添加下面这句代码
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
        // 为了使属性表字段支持中文,请添加下面这句
        gdal.SetConfigOption("SHAPE_ENCODING","CP936");
        //读取数据,这里以ESRI的shp文件为例
        String strDriverName = "LIBKML";
        //创建一个文件,根据strDriverName扩展名自动判断驱动类型
        org.gdal.ogr.Driver oDriver =ogr.GetDriverByName(strDriverName);
        if (oDriver == null) {
            System.out.println(strDriverName+ " 驱动不可用!\n");
            return;
        }
        DataSource dataSource = oDriver.Open(strVectorFile);
        System.out.println("图层总数=="+dataSource.GetLayerCount());
        //System.out.println(data);
        for(int w =0;w<dataSource.GetLayerCount();w++) {
        	//Layer layer = dataSource.GetLayer("test");
        	Layer layer = dataSource.GetLayer(w);
        	String layerName = layer.GetName();
        	System.out.println("图层名称:"+layerName);
        	SpatialReference spatialReference = layer.GetSpatialRef();
        	FeatureDefn featureDefn = layer.GetLayerDefn();
        	int fieldCount = featureDefn.GetFieldCount();
        	Map<String,Object> fieldMap = new HashMap<String,Object>();
        	List<String> filedList = new ArrayList<String>(fieldCount);
        	for(int i=0; i<fieldCount; i++){
        		FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);
        		//得到属性字段类型
        		int fieldType = fieldDefn.GetFieldType();
        		String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType);
        		//得到属性字段名称
        		String fieldName = fieldDefn.GetName();
        		//fieldMap.put(fieldTypeName,fieldName);
        		filedList.add(fieldName);
        	}
        	System.out.println(filedList);
        	System.out.println("**************************************");
        	long featureCount = layer.GetFeatureCount();
        	System.out.println("图层要素个数:"+featureCount);
        	for(int i=0; i<featureCount; i++){
        		Feature feature = layer.GetFeature(i);
        		if(null == feature) continue;
        		for(int k=0; k<filedList.size(); k++){
        			String fvalue = feature.GetFieldAsString(filedList.get(k));
        			System.out.print(filedList.get(k) + ":"+fvalue + "\t");
        		}
        		System.out.println();
        	}
        }
        
	}

        如果看过我之前的博客的话,对于GDAL如何实现空间矢量数据的解析应该比较了解。这里需要注意的只有一点,就是解析驱动。对于KML文件,一定要设置对应的驱动,如String strDriverName = "LIBKML";

三、数据解析成果

        以上的代码重点演示了如何使用GDAL来解析KML数据,本节将把上面小节的程序运行起来,然后把运行结果反馈给用户。对于KML数据,仅将数据在控制台进行输出打印,而对于KMZ数据,我们需要将数据保存的空间数据库中。

1、KML解析结果

        在程序IDE中运行上面的代码,在控制台中可以看到以下输出。

Name:NAS Keflavik IC	description:	timestamp:	begin:	end:	altitudeMode:	tessellate:-1	extrude:0	visibility:-1	drawOrder:	icon:	
Name:Campbell Barracks	description:	timestamp:	begin:	end:	altitudeMode:	tessellate:-1	extrude:0	visibility:-1	drawOrder:	icon:	
Name:Giebelstadt Army Airfield	description:	timestamp:	begin:	end:	altitudeMode:	tessellate:-1	extrude:0	visibility:-1	drawOrder:	icon:	
Name:NAF Atsugi JA	description:	timestamp:	begin:	end:	altitudeMode:	tessellate:-1	extrude:0	visibility:-1	drawOrder:	icon:	
Name:Leighton Barracks	description:	timestamp:	begin:	end:	altitudeMode:	tessellate:-1	extrude:0	visibility:-1	drawOrder:	icon:	

        如果能看到以上的信息,说明已经正确的解析了KML文件。

2、KMZ文件入库

        使用GDAL来解析KMZ文件,因为驱动类型是一样的,因此不需要更换驱动,值需要把文件名给修改下,关键代码如下(重复代码已删除):

 String strVectorFile ="C:/BaiduDownload/基地-地图数据(kmz)/全球基地.kmz";

        为了实现对Kmz保存到数据库中,因此这里我们需要创建对应的数据表,同时要基于MP新建业务处理实现类。首先将数据库的表结构分享给大家,需要的同学可以在这里复制。

CREATE TABLE "public"."biz_usa_military_base" (
  "id" int8 NOT NULL,
  "en_name" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
  "en_desc" varchar(1024) COLLATE "pg_catalog"."default",
  "cn_name" varchar(255) COLLATE "pg_catalog"."default",
  "remark" varchar(255) COLLATE "pg_catalog"."default",
  "geom" "public"."geometry",
  "create_by" varchar(64) COLLATE "pg_catalog"."default",
  "create_time" timestamp(6),
  "update_by" varchar(64) COLLATE "pg_catalog"."default",
  "update_time" timestamp(6),
  CONSTRAINT "pk_biz_usa_military_topics" PRIMARY KEY ("id")
);
ALTER TABLE "public"."biz_usa_military_base" 
  OWNER TO "ghy01";
CREATE INDEX "idx_biz_usa_military_base_geom" ON "public"."biz_usa_military_base" USING gist (
  "geom" "public"."gist_geometry_ops_2d"
);
COMMENT ON COLUMN "public"."biz_usa_military_base"."id" IS '主键';
COMMENT ON COLUMN "public"."biz_usa_military_base"."en_name" IS '英文名称';
COMMENT ON COLUMN "public"."biz_usa_military_base"."en_desc" IS '英文描述';
COMMENT ON COLUMN "public"."biz_usa_military_base"."cn_name" IS '英文名称';
COMMENT ON COLUMN "public"."biz_usa_military_base"."remark" IS '备注';
COMMENT ON COLUMN "public"."biz_usa_military_base"."geom" IS '空间信息';
COMMENT ON COLUMN "public"."biz_usa_military_base"."create_by" IS '创建人';
COMMENT ON COLUMN "public"."biz_usa_military_base"."create_time" IS '创建时间';
COMMENT ON COLUMN "public"."biz_usa_military_base"."update_by" IS '更新人';
COMMENT ON COLUMN "public"."biz_usa_military_base"."update_time" IS '更新时间';
COMMENT ON TABLE "public"."biz_usa_military_base" IS '基地信息表';

根据数据的表结构,我们需要定义Mapper和实体类来进行对应。

package com.yelang.project.extend.militarytopics.domain;
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 com.yelang.framework.web.domain.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
 * 基地实体类
 * @author 夜郎king
 */
@TableName(value ="biz_usa_military_base",autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class UsaMilitaryBase extends BaseEntity{
	private static final long serialVersionUID = 9052078556566456025L;
    @TableId
    private Long id;//主键
    @TableField(value = "en_name")
    private String enName;
    @TableField(value = "en_desc")
    private String enDesc;
    @TableField(value = "cn_name")
    private String cnName;
    private String remark;
    @TableField(typeHandler = PgGeometryTypeHandler.class)
	private String geom;
	@TableField(exist=false)
	private String geomJson;
}

        其它的业务类代码比较简单,只是将批量提交的集合进行保存,这里不赘述。重点介绍一下就是GDAL解析完数据后,我们需要将属性信息保存到对象中,然后把每个对象添加到集合中,最后把集合保存到数据库中。获取信息后将数据设置到对象中的关键代码如下:

for(int i=0; i<featureCount; i++){
        Feature feature = layer.GetFeature(i);
        if(null == feature) continue;
        String enName = feature.GetFieldAsString("Name");
        String enDesc = feature.GetFieldAsString("description");
        UsaMilitaryBase base = new UsaMilitaryBase();
        base.setEnName(enName);
        base.setEnDesc(enDesc);
        base.setCreateTime(now);
        Geometry geom = feature.GetGeometryRef();
    	//step 1、生成原始wkt
    	String wkt = geom.ExportToWkt();
    	wkt = "SRID=" + srid +";" + wkt;//拼接srid,实现动态写入
    	base.setGeom(wkt);
        dataList.add(base);
}

        最后调用Service的批量更新功能进行数据的插入。

if(dataList.size() >0) {
       usaMilitaryBaseService.saveBatch(dataList, 300);
        

        在测试用例中执行以上代码,在数据库中查询这张表的数据,可以看到以下信息。

        到此就完成了KML数据的解析以及KMZ数据的解析及入库。这里没有复杂的业务逻辑,因此实现起来并不是很复杂。

四、总结

        以上就是本文的主要内容,本文主要采用GDAL组件来进行KMZ和KML文件的解析,在C站或者其它的技术博客中查找相关知识点会发现,使用JAVA和GDAL实现数据解析的相关介绍内容比较少,很多都是C++或者其它语言的示例,因此这里分享如何使用JAVA语言来进行开发。博文首先使用Qgis软件展示KMZ或者KML文件的全部属性和空间参考,然后介绍GDAL中对于读取KMZ和KML的驱动的讲解,基于GDAL的统一解析模式来实现对KMZ和KML文件的统一解析,避免了过多的代码,最后将KMZ数据进行了数据库插入的操作,从而实现从数据解析、转换、存储的一个完整过程。通过本文您可以掌握使用Java语言通过GDAL实现对KMZ和KML文件的统一处理和存储操作,如果您当前也有这样的需求,欢迎进行交流。行文仓促,难免有不足之处,欢迎专家朋友们在评论区留言批评指正,不慎感激。

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

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

相关文章

java第二十一课 —— 快捷键,包,访问修饰符

IDEA 快捷键 删除行&#xff1a;Ctrl Y复制行&#xff1a;Ctrl D补全代码&#xff1a;Alt /添加取消注释&#xff1a;Ctrl /导入该行需要的类&#xff1a;Alt Enter快速格式化代码&#xff1a;Ctrl Shift L快速运行程序&#xff1a;Ctrl Shift F10生成构造器&#xf…

Python实现调用并执行Linux系统命令

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

Oracle数据库设计规范指南(Word原件)

方便业务功能实现、业务功能扩展&#xff1b;方便设计开发、增强系统的稳定性和可维护性&#xff1b;保证数据完整性和准确性&#xff1b;提高数据存储效率&#xff0c;在满足业务需求的前提下&#xff0c;使时间开销和空间开销达到优化平衡。资料获取&#xff1a;本文本个人名…

tmux工具使用鼠标滚动窗口及分屏命令

tmux工具使用鼠标滚动窗口及分屏命令 1. tmux source配置文件 长期生效2. 临时生效3. 实现分屏 1. tmux source配置文件 长期生效 vim ~/.tmux.conf echo "set -g mouse on" > ~/.tmux.conf tmux source-file ~/.tmux.conf2. 临时生效 1. 进入到tmux命令窗口 2.…

【echarts】如何制作,横坐标每个日期点如何对应一条竖线的图,以及 markline设置后不生效问题

图的样式如下&#xff1a; 在线演示 每一个日期&#xff0c;对应一条竖线展示。 echarts配置内容&#xff1a; 在线演示 option {xAxis: {type: category,data: [20240601, 20240602, 20240603, 20240604, 20240605, 20240606, 20240607] // X轴数据},yAxis: {type: valu…

【Postman接口测试】第四节.Postman接口测试项目实战(中)

文章目录 前言五、Postman断言 5.1 Postman断言介绍 5.2 响应状态码断言 5.3 包含指定字符串断言 5.4 JSON数据断言六、参数化 5.1 Postman参数化介绍 5.2 Postman参数化实现 5.3 针对项目登录接口参数化实现 总结 前言 五、Postman断言 5.1 Postman断言介…

m3u8视频怎么打开?教你三招!

m3u8 是一种文本文件格式&#xff0c;用于创建媒体播放列表&#xff0c;现在大部分的视频流媒体都是m3u8格式。当我们从网上下载下来m3u8文件的时候会发现&#xff0c;它本身不是一段视频&#xff0c;而是一个索引纯文本文件。想要正常打开播放m3u8视频其实也很简单&#xff0c…

javaWeb4 Maven

Maven-管理和构建java项目的工具 基于POM的概念 1.依赖管理&#xff1a;管理项目依赖的jar包 &#xff0c;避免版本冲突 2.统一项目结构&#xff1a;比如统一eclipse IDEA等开发工具 3.项目构建&#xff1a;标准跨平台的自动化项目构建方式。有标准构建流程&#xff0c;能快速…

jvm学习笔记(三) ----- 垃圾回收器

这里写目录标题 1.单线程/串行收集器2.多线程回收器-吞吐量优先3. 多线程回收器-响应时间优先4.G1收集器5.GC参数 链接: jvm学习笔记(一) ----- JAVA 内存 链接: jvm学习笔记(二) ----- 垃圾回收 JVM垃圾回收性能有以下两个主要的指标: 吞吐量 &#xff1a;工作时间&#xff08…

牛客小白月赛95

vp&#xff0c;为后面的比赛做准备 A.相遇 #include <iostream> #include <vector> #include <algorithm> #include <set> #include <unordered_map> #include <cstring> #include <cstdio> #include <string> #include <…

vue-el-steps 使用2[代码示例]

效果图 代码 element代码 <template> <div class"app-container"> <el-form :model"queryForm" size"small" :inline"true"> <el-form-item label"内容状态"> <el-button-group> <el-bu…

代码随想录算法训练营day31|455.分发饼干、376.摆动序列、53.最大子序和

分发饼干 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 贪心算法&#xff0c;让每个饼干给到能够满足的孩子&#xff0c;所以需要对饼干尺寸和孩子的满足值先进行排序&#xff0c;然后针对每一个饼干的尺寸&#xff0c;挑选恰好能够满足的孩子&#xff08;这里表述…

fps游戏如何快速定位矩阵

fps游戏如何快速定位矩阵 矩阵特点: 1、第一行第一列值的范围在**-1 ---- 1**之间&#xff0c;如果开镜之后值会变大。 2、第一行第三列的值始终为 0。 3、第一行第四列 的值比较大 &#xff0c; >300或者**<-300**。 根据这三个特点&#xff0c;定位矩阵已经足够了…

DevExpress winForm gridView 设置复选框并可多选

OptionsSelection.MultiSelect True OptionsSelection.MultiSelectMode CheckBoxRowSelect

LabVIEW电路板性能与稳定性测试系统

LabVIEW电路板性能与稳定性测试系统 概述&#xff1a; 开发基于LabVIEW的电路板性能与稳定性测试系统&#xff0c;通过集成多种测试仪器&#xff0c;实现对电路板的电气性能和长期稳定性的全面评估。系统涵盖了电压、电流、温度等多项参数的监测&#xff0c;并具备自动化测试…

Towards Graph Contrastive Learning: A Survey and Beyond

目录 Towards Graph Contrastive Learning- A Survey and Beyond摘要IntroductionPRELIMINARY符号说明GNN对比学习下游任务 GCL自监督学习增强策略基于规则随机扰动或mask子图采样图扩散 基于学习图结构学习图对抗训练图合理化 对比模式同尺度对比全局上下文局部 跨尺度对比局部…

android-JNI

1.2【静态库】的特点&#xff1a; &#xff08;.a&#xff09; ①静态库对函数库的链接是在编译期完成的。执行期间代码装载速度快。 ②使可执行文件变大&#xff0c;浪费空间和资源&#xff08;占空间&#xff09;。 ③对程序的更新、部署与发布不方便&#xff0c;需要全量更新…

G5 - Pix2Pix理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 理论知识图像翻译CGANU-NetPix2Pix损失函数模型结构生成器差别器 模型效果总结与心得体会 理论知识 前面已经学习了GAN与CGAN&#xff0c;这节开始学习P…

Android Webview 详解

一 简介 一个基于webkit引擎、展现web页面的控件 Android 4.4前&#xff1a;Android Webview在低版本 & 高版本采用了不同的webkit版本的内核Android 4.4后&#xff1a;直接使用了Chrome内核 1.1 作用 在 Android 客户端上加载h5页面在本地 与 h5页面实现交互 & …

SpringCloud 微服务中网关如何记录请求响应日志?

在基于SpringCloud开发的微服务中&#xff0c;我们一般会选择在网关层记录请求和响应日志&#xff0c;并将其收集到ELK中用作查询和分析。 今天我们就来看看如何实现此功能。 日志实体类 首先我们在网关中定义一个日志实体&#xff0c;用于组装日志对象 Data public class …