一、环境搭建
1.1 docker安装PostGis(新建postgis.yaml)
java
name: postgis
services:
postgis:
image: postgis/postgis:12-3.2
container_name: postgis
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: gis_db
ports:
- "6432:5432"
volumes:
- postgis_data:/var/lib/postgis/data
- pg_data2:/var/lib/postgresql/data
volumes:
postgis_data:
pg_data2:
1.2 执行docker yaml配置文件
java
docker compose -f postgis.yaml up -d
1.3 创建数据库
java
create extension 数据库名称;
1.4 进入创建好的数据库
java
\c 数据库名称
1.5 启用PostGis扩展( 启用后会生成spatial_ref_sys表**)**
java
# 启用扩展
CREATE EXTENSION postgis;
# 启用所有扩展
CREATE EXTENSION postgis_topology;
# 查看是否启用
SELECT PostGIS_Full_Version();
二、GeoTools介绍
文档地址:
https://docs.geotools.org/latest/userguide/tutorial/quickstart/maven.html
三、搭建Springboot项目测试集成
3.1 maven配置
java
// 用于GeoTools使用
<repositories>
<repository>
<id>osgeo</id>
<name>OSGeo Release Repository</name>
<url>https://repo.osgeo.org/repository/release/</url>
<snapshots><enabled>false</enabled></snapshots>
<releases><enabled>true</enabled></releases>
</repository>
<repository>
<id>osgeo-snapshot</id>
<name>OSGeo Snapshot Repository</name>
<url>https://repo.osgeo.org/repository/snapshot/</url>
<snapshots><enabled>true</enabled></snapshots>
<releases><enabled>false</enabled></releases>
</repository>
</repositories>
// 依赖包
// MP依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.15</version>
</dependency>
// PostGreSql依赖
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
// GeoTools依赖
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>34.2</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>34.2</version>
</dependency>
<dependency>
<groupId>net.postgis</groupId>
<artifactId>postgis-jdbc</artifactId>
<version>2.5.0</version>
</dependency>
3.2 yml配置文件
java
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:6432/test_gis?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
username: postgres
password: postgres
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: auto
3.3 自定义字段插件
java
package org.panda.geo.geodemo.handle;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgis.Geometry;
import org.postgis.PGgeometry;
@MappedTypes({String.class})
public class PgGeometryTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
PGgeometry pGgeometry = new PGgeometry(parameter);
Geometry geometry = pGgeometry.getGeometry();
//4326坐标系的定义,统一投影坐标系
geometry.setSrid(4326);
ps.setObject(i, pGgeometry);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
String string = rs.getString(columnName);
return getResult(string);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String string = rs.getString(columnIndex);
return getResult(string);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String string = cs.getString(columnIndex);
return getResult(string);
}
private String getResult(String string) throws SQLException {
PGgeometry pGgeometry = new PGgeometry(string);
String s = pGgeometry.toString();
return s.replace("SRID=4326;", "");
}
}
3.4 创建数据库
java
create table biz_point_test(
id int8 primary key,
name varchar(100),
geom geometry(Point,4326)
);
3.5 创建实体类
java
package org.panda.geo.geodemo.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.panda.geo.geodemo.handle.PgGeometryTypeHandler;
@TableName(value ="biz_point_test",autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class PointTest {
@TableId
private Long id;
private String name;
@TableField(typeHandler = PgGeometryTypeHandler.class)
private String geom;
@TableField(exist=false)
private String geomJson;
}
3.6 Mapper文件
java
package org.panda.geo.geodemo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.panda.geo.geodemo.domain.PointTest;
import java.util.List;
@Mapper
public interface TestMapper extends BaseMapper<PointTest> {
@Select("select * from spatial_ref_sys")
List<Object> selectTest();
static final String FIND_GEOJSON_SQL="<script>"
+ "select *,st_asgeojson(geom) as geomJson from biz_point_test "
+ "where id = #{id} "
+ "<if test='null != name'>and p.name like concat('%', #{name}, '%')</if>"
+ "</script>";
@Select(FIND_GEOJSON_SQL)
PointTest findGeoJsonById(@Param("id")Long id, @Param("name")String name);
}
3.7 测试
java
package org.panda.geo.geodemo;
import org.junit.jupiter.api.Test;
import org.panda.geo.geodemo.domain.PointTest;
import org.panda.geo.geodemo.mapper.TestMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class GeoDemoApplicationTests {
@Autowired
private TestMapper testMapper;
@Test
void contextLoads() {
// PointTest point = new PointTest();
// point.setId(1559371184090423297L);
// point.setName("中寨社区");
// point.setName("中寨居委会");
// point.setGeom("POINT(109.262605 27.200669)");
// testMapper.insert(point);
// testMapper.selectTest();
PointTest geoJsonById = testMapper.findGeoJsonById(1559371184090423297L, null);
System.out.println("查询数据如下");
System.out.println(geoJsonById);
}
}
完结,其他功能可自行在GeoTools官网学习或期待我下一步更新