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

目录

前言

一、在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的解析代码。

@Testpublic 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;@TableIdprivate 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、生成原始wktString 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.rhkb.cn/news/343449.html

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

相关文章

python - DataFrame查询数据操作

学习目标 掌握获取df一列或多列数据的方法 知道loc和iloc的区别以及使用方法 知道df的query函数的使用方法 知道isin函数的作用和使用方法 获取DataFrame子集的基本方法 1.1 从前从后获取多行数据 案例中用到的数据集在文章顶部 LJdata.csv 前景回顾 head() & tail(…

范闲获取到庆帝与神庙的往来信件,用AES进行破解

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 在《庆余年2》中&#xff0c;范闲与庆帝和神庙之间的权谋斗争愈演愈烈。一次偶然的机会&#xff0c;范闲从庆帝的密室中获取到几封与神庙往来的密信。然而&#xff0c;这封信件…

美团面试:百亿级分片,如何设计基因算法?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的架构类/设计类的场景题&#xff1a; 1.说说分库分表的基因算法&#xff1f…

使用matplotlib绘制折线条形复合图

使用matplotlib绘制折线条形复合图 介绍效果代码 介绍 在数据可视化中&#xff0c;复合图形是一种非常有用的工具&#xff0c;可以同时显示多种数据类型的关系。在本篇博客中&#xff0c;我们将探讨如何使用 matplotlib 库来绘制包含折线图和条形图的复合图。 效果 代码 imp…

【Linux】进程2——管理概念,进程概念

1.什么是管理&#xff1f; 那在还没有学习进程之前&#xff0c;就问大家&#xff0c;操作系统是怎么管理进行进程管理的呢&#xff1f; 很简单&#xff0c;先把进程描述起来&#xff0c;再把进程组织起来&#xff01; 我们拿大学为例子 最典型的管理者——校长最典型的被管理…

短视频矩阵源码----如何做正规开发规则分享:

一、什么是SaaS化服务技术开发&#xff1f; &#xff08;短视频矩阵系统是源头开发的应该分为3个端口---- 总后台控制端、总代理端口&#xff0c;总商户后台&#xff09; SaaS是软件即服务&#xff08;Software as a Service&#xff09;的缩写。它是一种通过互联网提供软件应…

MySQL查询相邻两条记录的时间间隔

MySQL查询相邻两条记录的时间间隔。最近需要统计相邻两条记录的时间间隔&#xff0c;筛选出时间间隔大于2min的数据记录。因为是同一张表&#xff0c;又需要查询出相邻的数据&#xff0c;所以最开始想到使用子表来做&#xff0c;分别用t1、t2表示&#xff0c;但是实践后发现查询…

如何查看本地sql server数据库的ip地址

程序连线SQL数据库&#xff0c;需要SQL Server实例的名称或网络地址。 1.查询语句 DECLARE ipAddress VARCHAR(100) SELECT ipAddress local_net_address FROM sys.dm_exec_connections WHERE SESSION_ID SPID SELECT ipAddress As [IP Address]SELECT CONNECTIONPROPERTY(…

鸢尾花分类和手写数字识别(K近邻)

鸢尾花分类 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import pandas as pd import mglearn# 加载鸢尾花数据集 iris load_iris() X_train, X_test, y_train, y_test train_test_split(iris.data,iris.target,test_siz…

【Linux】Centos7升级内核的方法:yum更新(ELRepo)

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

路径

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 用于定位一个文件或者目录的字符串被称为一个路径。在程序开发时&#xff0c;通常涉及两种路径&#xff0c;一种是相对路径&#xff0c;另一种是绝对…

Intel VT-x怎么开启?如何解决VMware打开虚拟机报错问题?

许多小伙伴在安装完VMware不能打开虚拟机&#xff0c;每次打开都会出现一个“此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态”的报错&#xff0c;然后因此启动不了虚拟机。今天小编就带来如何解决这个报错的方法。 什么是Intel VT-x&#xff1f; 这是英特尔cp…

黑龙江等保测评流程

黑龙江的等保测评过程是一个系统严谨的过程&#xff0c;目的在于保证信息系统的安全与机密性符合国家规定的要求。下面将详细介绍黑龙江等保测评的流程&#xff1a; 一、定级与备案 首先&#xff0c;企业要依据自身的业务特点、信息系统的重要性和所承载的信息的敏感程度&…

【Text2SQL 论文】C3:使用 ChatGPT 实现 zero-shot Text2SQL

论文&#xff1a;C3: Zero-shot Text-to-SQL with ChatGPT ⭐⭐⭐⭐ arXiv:2307.07306&#xff0c;浙大 Code&#xff1a;C3SQL | GitHub 一、论文速读 使用 ChatGPT 来解决 Text2SQL 任务时&#xff0c;few-shots ICL 的 setting 需要输入大量的 tokens&#xff0c;这有点昂贵…

玩转微服务-GateWay

目录 一. 背景二. API网关1. 概念2. API网关定义3. API网关的四大职能4. API网关分类5. 开源API网关介绍6. 开源网关的选择 三. Spring Cloud Gateway1. 文档地址2. 三个核心概念3. 工作流程4. 运行原理4.1 路由原理4.2 RouteLocator 5. Predicate 断言6. 过滤器 Filter6.1. 过…

Docker的网络管理

文章目录 一、Docker容器之间的通信1、直接互联&#xff08;默认Bridge网络&#xff09;1.1、Docker安装后默认的网络配置1.2、创建容器后的网络配置1.2.1、首先创建一个容器1.2.2、ip a 列出网卡变化信息1.2.3、查看新建容器后的桥接状态 1.3、容器内安装常见的工具1.4、容器间…

Spring Cloud系列——使用Sentinel进行微服务保护

文章目录 一、引言1. 雪崩问题的产生原因2. 解决雪崩问题的思路 二、微服务保护1. 服务保护方案1.1 请求限流1.2 线程隔离1.3 服务熔断 2. Sentinel2.1 安装2.2 微服务整合2.2.1 请求限流2.2.2 线程隔离①OpenFeign整合Sentinel②配置线程隔离 2.2.3 服务熔断①编写降级逻辑②配…

路由器重启真的好吗?多久重启一次更好?

前言 小白前段时间发现自己家的OpenWRT软路由上网特别慢&#xff0c;有时候通话还有点卡顿。 然而有个朋友用的普通路由器也有类似的问题&#xff0c;而且有时候根本上不去网。 解决的办法很简单&#xff1a;重启路由器。 重启路由器&#xff1f; 但路由器重启是真的好吗&a…

Android无障碍服务

Hi I’m Shendi Android无障碍服务 最近想制作一个记录点击操作并重复播放的工具&#xff0c;用以解放双手&#xff0c;因现在的Android高版本基本上难以Root&#xff0c;所以选择了使用无障碍来实现&#xff0c;在这里记录下来。 Android无障碍 可参考文档&#xff1a;https:…

Linux网络编程:网络层协议|IP

目录 前言&#xff1a; 1.IP协议 1.1.IP协议格式 1.2.网段划分 1.2.1.知识引入 1.2.2.IP地址划分和子网掩码 1.3.IP地址分类 1.3.1.特殊IP地址 ​编辑 1.3.2.私有IP和公网IP 1.3.3.浅谈NAT技术 1.4.路由 1.4.1.什么是路由 1.4.2.路由表 1.5.网络层数据切片和组装…