2024年网安最全使用Java和PostGis的全国A级风景区数据入库实战_postgis java(1)

前言

星垂平野阔,月涌大江流”“晴川历历汉阳树,芳草萋萋鹦鹉洲”……祖国的每一寸土地,都饱含着诗情画意。旅行一定是很多朋友的爱好,有人说:“人生至少要有两次冲动:一场奋不顾身的爱情和一段走就走的旅行。”不知道在看博文的朋友,是否也是一位旅行爱好者呢。

随着后疫情时代的到来,许多人又开始踏上旅行。旅游可以放松自己身心,缓解工作和生活方面的压力.旅行的过程中是不需要有任何的心理负担的,可以使人达到一种完全放松的状况.感受最原始的快乐。旅行的时候不仅可以观赏风景,还可以尝美食,住宾馆,听故事,感受全国各地的饮食文化.增长自己的见识,可以看到更多的人.了解更多的民俗文化,看到更多的景色使自己的内心感到充实。旅游可以开阔眼界,观察到丰富的人文景观,了解各地的文化风俗,饮食习惯和宗教信仰,广交朋友。旅游还可以锤炼人的意志,增加人的智慧,尤其是去一些有挑战性的景区游玩,征服一座山,跨过一条河学会一项新技能,都可以使自己变的更加勇敢。

中华大地,旅游景点众多,那我们国家到底有多少旅游景区呢?在前面的很多博文中,我们讲过如何将空间数据进行入库。那么文本将采用Java语言,重点讲述如何将全国A级风景区数据导入到PostGis数据库中,为后续我们进行旅游资源和旅游路线的推荐和展示打下坚实的基础。如果您也是WebGis的爱好者,可以从本文了解空间数据的入库开发方式,知道空间数据库的设计和操作。

一、数据介绍

数据说明,本文下载的数据是朋友分享的2023年全国A级风景区数据。数据大小为36MB左右,数据格式shapfile,下面是数据展示。

1、空间数据

这里我们采用Qgis对空间数据进行导入前查看。其基础信息如下表所示:

序号参数说明
1文件格式ESRI Shapefile
2文件编码GBK
3元素类型Point
4坐标参考系EPSG:4326 - WGS 84
5数据单位
6数据总数14,847

2、属性表说明

在shp文件中,除了有空间数据的定义,还有属性数据的定义,A级景区shp数据一共有15个字段,详情请看下面的表定义。

序号字段名数据类型长度
1景区名称String254
2等级String254
3所属省份String254
4地址String254
5评定时间String254
6发布时间String254
7发布链接String254
8lng_GCJ02(高德经度)Double18
9lat_GCJ02(高德纬度)Double18
10lng_BD09(百度经度)Double18
11lat_BD09(百度纬度)Double18
12lng_WGS84Double18
13lat_WGS84Double18
14所属城市String254
15所属区县String254

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);


### 一、网安学习成长路线图


网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/aa7be04dc8684d7ea43acc0151aebbf1.png)


### 二、网安视频合集


观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f0aeee2eec7a48f4ad7d083932cb095d.png)


### 三、精品网安学习书籍


当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/078ea1d4cda342f496f9276a4cda5fcf.png)


### 四、网络安全源码合集+工具包


光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e54c0bac8f3049928b488dc1e5080fc5.png)


### 五、网络安全面试题


最后就是大家最关心的网络安全面试题板块  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/15c1192cad414044b4dd41f3df44433d.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/b07abbfab1fd4edc800d7db3eabb956e.png)  



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值