# gtwithpg **Repository Path**: startgis/gtwithpg ## Basic Information - **Project Name**: gtwithpg - **Description**: 利用SpringBoot+Mabatis-Plus+Maven+Postgres+PostGIS+GeoTool搭建GIS空间分析平台 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2024-08-27 - **Last Updated**: 2024-08-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1.创建SpringBoot工程 ![使用IDEA的Spring Initializr创建SpringBoot项目](https://images.gitee.com/uploads/images/2021/0413/163115_6e4e8930_6533949.png "1.png") ![输入项目名称,公司名称](https://images.gitee.com/uploads/images/2021/0413/163150_0420ca01_6533949.png "在这里输入图片标题") ![勾选需要的工具](https://images.gitee.com/uploads/images/2021/0413/163219_d67ce48c_6533949.png "3.png") ![点击finish](https://images.gitee.com/uploads/images/2021/0413/163308_0393425a_6533949.png "4.png") # 2.Maven依赖 ```xml 1.8 UTF-8 26-SNAPSHOT org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.geotools gt-shapefile ${geotools.version} org.geotools gt-geojson ${geotools.version} org.geotools gt-csv ${geotools.version} commons-lang commons-lang 2.6 org.postgresql postgresql runtime net.postgis postgis-jdbc 2.5.0 org.projectlombok lombok true com.baomidou mybatis-plus-boot-starter 3.4.0 com.alibaba fastjson 1.2.62 osgeo OSGeo Release Repository https://repo.osgeo.org/repository/release/ false true osgeo-snapshot OSGeo Snapshot Repository https://repo.osgeo.org/repository/snapshot/ true false ``` 此处主要是添加mybatis-plus的依赖 # 3.编写配置文件 ```yaml server: port: 8081 spring: datasource: url: jdbc:postgresql://localhost:5432/spatialDB?characterEncoding=utf8 username: postgres password: wang driver-class-name: org.postgresql.Driver mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射 map-underscore-to-camel-case: true # 这个配置会将执行的sql打印出来 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 主要是配置数据源和mybatis-plus # 4.编写代码 ![image-20210413111844502](https://images.gitee.com/uploads/images/2021/0413/163355_b3f9290a_6533949.png "5.png") controller层->service层->mapper层 建立数据库表对应的实体类 - controller ```java @RestController @RequestMapping("/shp") public class ShpController { @Autowired private ShpService shpService; @RequestMapping("/hello") public String test(){ return "hello"; } @RequestMapping("/getShp") public JSONObject getShpBy(Integer id){ YjjbntPo shp = shpService.getShpBy(id); return (JSONObject) JSON.toJSON(shp); } } ``` - service ```java public interface ShpService { YjjbntPo getShpBy(Integer id); } ``` ```java @Service public class ShpServiceImpl implements ShpService { @Autowired private ShpMapper shpMapper; @Override public YjjbntPo getShpBy(Integer id) { return shpMapper.selectById(id); } } ``` - mapper ```java public interface ShpMapper extends BaseMapper { } ``` - 实体类 ```java /** * 永久基本农田实体类 * * @author WSY * @date 2021/04/13 */ @Data @TableName("t_2020") public class YjjbntPo { private Integer gid; private Integer id; private Float shapeLen; private Float shapeArea; /** * 空间对象(WKB:Well-Known-Binary) */ private String geom; } ``` # 5.结果 ![image-20210413113339361](https://images.gitee.com/uploads/images/2021/0413/163433_96fbb8c8_6533949.png "6.png") **注意:** 返回的geom字段看着像一串十六进制字符串,尝试对其进行转换: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0413/163506_8fe92c4e_6533949.png "7.png") 仍然解析不了,事实上,该字符串为WKB(Well-known Binary,WKB)。 > WKB的全称是The Well-known Binary,也简称WKB,OGC与ISO/TC211都做出了同样的规范,它是用来几何体的表达。即**用连续的二进制流来表达几何体**,这样在**GIS互操作方面**也有好处。现代GIS软件的底层模块中可以说都有关于WKB解析代码。在二进制存储中有大尾端和小尾端之分,通常在二进制流的第一个字节就指定,这样在这个字节之后的字节流就可以按照相应的大小尾端模式进行解析。分大小尾端是为了适应不同平台环境。在一些开源和商业GIS软件中都支持几何体的WKB表示,这样做也是为了**异构平台之间互操作**。 > ———————————————— > 版权声明:本文为CSDN博主「周旭光」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 > 原文链接:https://blog.csdn.net/zhouxuguang236/article/details/49303871 WKB和WKT一样,是OGC中的简单服务标准(Simple Features Interface Standard,SFS)因此,还需要对WKB进行解析。 # 6.解析wkb ## 1.引入Maven依赖 ```xml com.vividsolutions jts 1.13 ``` 事实上,该包已经在GeoTools中集成,此处只是为了更加清晰的展示提供WKB解析功能的类的来源。 ## 2.解析 WKB的解析需要用到org.locationtech.jts.io.WKBReader类。WKBReader提供了一个静态方法hexToBytes(),用于将十六进制字符串转为Bytes数组。hexToBytes()方法的详细如下: ```java public static byte[] hexToBytes(String hex){...} ``` 获取到Bytes数组后,还需要使用WKBReader的实例方法read()来获取空间数据的几何对象。read()方法的详细如下: ```java public Geometry read(byte[] bytes) throws ParseException{...} ``` 解析完的结果如下: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0413/163526_afabe64b_6533949.png "8.png") 可以看到,geom字段的值已经变成了我们的空间对象字符串。 # 7.空间分析 获取到空间对象后,可以进行一系列的空间分析操作,此处不再赘述,请参考另一文档。