一、网安学习成长路线图
网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网安视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
三、精品网安学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、网络安全源码合集+工具包
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、网络安全面试题
最后就是大家最关心的网络安全面试题板块
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
序号 | 参数 | 说明 |
1 | 文件格式 | ESRI Shapefile |
2 | 文件编码 | GBK |
3 | 元素类型 | Point |
4 | 坐标参考系 | EPSG:4326 - WGS 84 |
5 | 数据单位 | 度 |
6 | 数据总数 | 14,847 |
2、属性表说明
在shp文件中,除了有空间数据的定义,还有属性数据的定义,A级景区shp数据一共有15个字段,详情请看下面的表定义。
序号 | 字段名 | 数据类型 | 长度 |
1 | 景区名称 | String | 254 |
2 | 等级 | String | 254 |
3 | 所属省份 | String | 254 |
4 | 地址 | String | 254 |
5 | 评定时间 | String | 254 |
6 | 发布时间 | String | 254 |
7 | 发布链接 | String | 254 |
8 | lng_GCJ02(高德经度) | Double | 18 |
9 | lat_GCJ02(高德纬度) | Double | 18 |
10 | lng_BD09(百度经度) | Double | 18 |
11 | lat_BD09(百度纬度) | Double | 18 |
12 | lng_WGS84 | Double | 18 |
13 | lat_WGS84 | Double | 18 |
14 | 所属城市 | String | 254 |
15 | 所属区县 | String | 254 |
3、QGIS数据预览
我们使用qgis对数据进行简单标绘,使用景区名字进行标注,使用景区等级做分类。可以看到如下的分类结果展示。
二、PostGIS空间数据库设计
空间数据库我们采用PostGIS进行存储,这里来简单设计一下如何存储景区数据。完整的景区数据条数在1万5千条左右。因此我们只需要设计一张景区表即可。与其空间属性保持一一对应的关系,我们来看一下数据表的表结构信息。
1、空间表结构
下面给出风景区空间数据库表的表结构:
/*==============================================================*/
/* Table: biz_scenic_spot */
/*==============================================================*/
create table biz_scenic_spot (
id INT8 not null,
name VARCHAR(255) null,
level VARCHAR(4) null,
province VARCHAR(255) null,
city VARCHAR(255) null,
area VARCHAR(255) null,
address VARCHAR(255) null,
evaluation_time VARCHAR(255) null,
publish_time VARCHAR(255) null,
publish_link VARCHAR(255) null,
lng_GCJ02 VARCHAR(30) null,
lat_GCJ02 VARCHAR(30) null,
lng_BD09 VARCHAR(30) null,
lat_BD09 VARCHAR(30) null,
lng_WGS84 VARCHAR(30) null,
lat_WGS84 VARCHAR(30) null,
geom geometry null,
constraint PK_BIZ_SCENIC_SPOT primary key (id)
);
comment on table biz_scenic_spot is
'全国风景区信息表';
comment on column biz_scenic_spot.id is
'主键';
comment on column biz_scenic_spot.name is
'景区名称';
comment on column biz_scenic_spot.level is
'景区级别';
comment on column biz_scenic_spot.province is
'所属省份';
comment on column biz_scenic_spot.city is
'所属城市';
comment on column biz_scenic_spot.area is
'所属区县';
comment on column biz_scenic_spot.address is
'地址';
comment on column biz_scenic_spot.evaluation_time is
'评定时间';
comment on column biz_scenic_spot.publish_time is
'发布时间';
comment on column biz_scenic_spot.publish_link is
'发布链接';
comment on column biz_scenic_spot.lng_GCJ02 is
'lng_GCJ02';
comment on column biz_scenic_spot.lat_GCJ02 is
'lat_GCJ02';
comment on column biz_scenic_spot.lng_BD09 is
'lng_BD09';
comment on column biz_scenic_spot.lat_BD09 is
'lat_BD09';
comment on column biz_scenic_spot.lng_WGS84 is
'lng_WGS84';
comment on column biz_scenic_spot.lat_WGS84 is
'lat_WGS84';
为了在后面的应用中应用空间索引,我们在geom字段上创建空间索引,创建语句如下:
-- ----------------------------
CREATE INDEX "idx_biz_scenic_spot_geom" ON "public"."biz_scenic_spot" USING gist (
"geom" "public"."gist_geometry_ops_2d"
);
三、Java空间入库
这里主要讲解如何使用Java语言将shp数据进行导入到PostGis数据库中,主要采用的组件还是Gdal,如果大家对gdal不太熟悉,可以翻看博主以前的博客,有关于gdal的部署和具体使用方法。下面从代码实现来详细讲解具体的入库过程。后台开发框架采用Springboot,ORM框架采用Mybatis-plus,都是熟悉的组件。如果看博客的朋友对上述框架不是很熟悉,可以先学习一下相关的知识,对于理解和代码掌握有很大的帮助。
1、实体定义
示例工程采用MVC三层开发模式,这里只讲解M层,V和C在后续博文中讲解。
package com.yelang.project.extend.scenicspot.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 wzh
*
*/
@TableName(value = "biz_scenic_spot", autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class ScenicSpot implements Serializable{
private static final long serialVersionUID = 1830004907219610805L;
@TableId
private Long id;
private String name;//景区名称
private String level;//景区级别
private String province;//所属省份
private String city;//所属城市
private String area;//所属区县
private String address;//地址
@TableField(value="evaluation_time")
private String evaluationTime;//评定时间
@TableField(value="publish_time")
private String publishTime;//发布时间
@TableField(value="publish_link")
private String publishLink;//发布时间
@TableField(value="lng_GCJ02")
private String lngGCJ02;
@TableField(value="lat_GCJ02")
private String latGCJ02;
@TableField(value="lng_BD09")
private String lngBD09;
@TableField(value="lat_BD09")
private String latBD09;
@TableField(value="lng_WGS84")
private String lngWGS84;
@TableField(value="lat_WGS84")
private String latWGS84;
@TableField(typeHandler = PgGeometryTypeHandler.class)
private String geom;
@TableField(exist=false)
private String geomJson;
public ScenicSpot(String name, String level, String province, String city, String area, String address,
String evaluationTime, String publishTime, String publishLink,String lngGCJ02, String latGCJ02, String lngBD09, String latBD09,
String lngWGS84, String latWGS84, String geom) {
super();
this.name = name;
this.level = level;
this.province = province;
this.city = city;
this.area = area;
this.address = address;
this.evaluationTime = evaluationTime;
this.publishTime = publishTime;
this.publishLink = publishLink;
this.lngGCJ02 = lngGCJ02;
this.latGCJ02 = latGCJ02;
this.lngBD09 = lngBD09;
this.latBD09 = latBD09;
this.lngWGS84 = lngWGS84;
this.latWGS84 = latWGS84;
this.geom = geom;
}
}
这里有几个地方要注意的就是,在类最开始定义的地方,@TableName(value = “biz_scenic_spot”, autoResultMap = true),这里一定要这么写,否则后续将无法操作geometry数据。其次是@TableField(typeHandler = PgGeometryTypeHandler.class),通过绑定typehandler来设置具体的处理函数。
2、数据操作Mapper
熟悉Mybatis-Plus(mp)的朋友一定了解ORM操作的三个重要对象之一就是Mapper,相当与对jdbc的封装。下面是mapper的实现:
package com.yelang.project.extend.scenicspot.mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yelang.project.extend.scenicspot.domain.ScenicSpot;
public interface ScenicSpotMapper extends BaseMapper<ScenicSpot>{
static final String FIND_GEOJSON_SQL="<script>"
+ "select st_asgeojson(geom) as geomJson from biz_scenic_spot "
+ "where id = #{id} "
+ "<if test='null != name'>and name like concat('%', #{name}, '%')</if>"
+ "</script>";
@Select(FIND_GEOJSON_SQL)
ScenicSpot findGeoJsonById(@Param("id")Long id,@Param("name")String name);
}
3、业务层实现
为了方便做景区数据的批量入库,我们在Mp之上实现serviceimpl,好直接调用其的批量处理方法,示例代码如下:
package com.yelang.project.extend.scenicspot.service.impl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yelang.project.extend.scenicspot.domain.ScenicSpot;
import com.yelang.project.extend.scenicspot.mapper.ScenicSpotMapper;
import com.yelang.project.extend.scenicspot.service.IScenicSpotService;
@Service
public class ScenicSpotServiceImpl extends ServiceImpl<ScenicSpotMapper, ScenicSpot> implements IScenicSpotService{
@Override
public ScenicSpot findGeoJsonById(Long id) {
return this.baseMapper.findGeoJsonById(id, null);
}
}
4、入库
学习路线:
这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!