# 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工程




# 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.编写代码

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.结果

**注意:**
返回的geom字段看着像一串十六进制字符串,尝试对其进行转换:

仍然解析不了,事实上,该字符串为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{...}
```
解析完的结果如下:

可以看到,geom字段的值已经变成了我们的空间对象字符串。
# 7.空间分析
获取到空间对象后,可以进行一系列的空间分析操作,此处不再赘述,请参考另一文档。