由于项目需要,用到了Geometry类型的字段,但是Java中没有提供相应的数据类型与空间数据库进行映射,经过长达两三天的踩坑,终于找到了解决方案~~
https://github.com/lonelyleaf/postgis-java-demo
上面代码用的 gradle(不太会),因为 gradle 版本问题,一直无法编译通过,因此在上面代码基础上用 maven 写了一个示范程序,供参考。
https://gitee.com/fyhcug/springboot_mybatis_postgis
<dependency>
<groupId>org.postgresqlgroupId>
<artifactId>postgresqlartifactId>
dependency>
<dependency>
<groupId>net.postgisgroupId>
<artifactId>postgis-jdbcartifactId>
<version>2.5.0version>
dependency>
<dependency>
<groupId>org.locationtech.jtsgroupId>
<artifactId>jts-coreartifactId>
<version>1.16.1version>
dependency>
<dependency>
<groupId>org.locationtech.spatial4jgroupId>
<artifactId>spatial4jartifactId>
<version>0.7version>
dependency>
<dependency>
<groupId>com.graphhopper.externalgroupId>
<artifactId>jackson-datatype-jtsartifactId>
<version>1.0-2.7version>
dependency>
来自 参考代码
https://github.com/lonelyleaf/postgis-java-demo
需要修改 url 和 driver-class-name
需要修改 url 和 driver-class-name
需要修改 url 和 driver-class-name
url 改为:jdbc:postgres_jts://xxx:5432/db
driver-class-name 需要根据自己的项目进行配置(如下下图所示)
spring:
datasource:
url: jdbc:postgres_jts://localhost:5432/jtstest?characterEncoding=utf8
driver-class-name: com.jtstest.demo.config.wrapper.JtsWrapper
mybatis-plus:
type-handlers-package: "com.jtstest.demo.config.jts"
左右两个白色图中的代码,来自上面提到的 参考代码
测试之前需要修改一个字段的类型,修改为 Point 类型,来自: org.locationtech.jts.geom.Point
测试代码
@Test
void contextLoads() {
QueryWrapper<TGps> wrapper = new QueryWrapper<>();
wrapper.orderByAsc("time");
wrapper.last("limit 10");
List<TGps> list = tGpsDao.selectList(wrapper);
for (TGps entity : list) {
System.out.println(entity);
}
}
运行结果
@Test
void insertTest(){
TGps tGps = new TGps();
tGps.setTime(new Date());
tGps.setDevId("abcdef");
tGps.setLocation(JtsUtil.newPoint(113.0,34.0));
tGps.setGpsNum(17);
tGps.setGpsType("差分定位");
tGps.setAzimuth(300.93);
tGps.setGndRate(0.0);
int insert = tGpsDao.insert(tGps);
System.out.println("插入成功--> " + insert);
}
插入后查询是否插入成功
@Test
void selectTest(){
QueryWrapper<TGps> wrapper = new QueryWrapper<>();
wrapper.eq("dev_id","abcdef");
List<TGps> list = tGpsDao.selectList(wrapper);
for (TGps entity : list) {
System.out.println(entity);
}
}
@Test
void deleteTest() {
QueryWrapper<TGps> wrapper = new QueryWrapper<>();
wrapper.eq("dev_id","abcdef");
int delete = tGpsDao.delete(wrapper);
System.out.println("删除成功--> " + delete);
}
@Test
void updateTest() {
TGps tGps = new TGps();
tGps.setTime(new Date());
tGps.setDevId("abcdef");
tGps.setLocation(JtsUtil.newPoint(113.0,34.0));
tGps.setGpsNum(17);
tGps.setGpsType("GPS定位");
tGps.setAzimuth(300.93);
tGps.setGndRate(0.0);
QueryWrapper<TGps> wrapper = new QueryWrapper<>();
wrapper.eq("dev_id","abcdef");
int update = tGpsDao.update(tGps, wrapper);
System.out.println("更新成功--> " + update);
}
查询是否更新成功
@Test
void createGeometry() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper().registerModule(new JtsModule());
/*
* 创建点
*/
// Point point = JtsUtil.newPoint(113.0,34.0);
// System.out.println(point);
// objectMapper.registerModule(new JtsModule());
// System.out.println(objectMapper.writeValueAsString(point));
/*
* 创建线
*/
// Point[] points = new Point[10];
// for(int i = 0; i < 10; i ++){
// points[i] = JtsUtil.newPoint(106.87+i, 27.53+i);
// }
// LineString lineString = JtsUtil.newLineString(points);
// System.out.println(lineString);
// System.out.println(objectMapper.writeValueAsString(lineString));
/*
* 根据查询结果创建线,数据库查询结果放在 points 中
*/
// List points = new ArrayList<>();
// for(int i = 0; i < 10; i ++){
// points.add(JtsUtil.newPoint(106.87+i, 27.53+i));
// }
// points.add(JtsUtil.newPoint(106.87, 27.53));
// Coordinate[] points1 = points.stream()
// .map(Point::getCoordinate)
// .toArray(Coordinate[]::new);
// System.out.println(JtsUtil.geometryFactory4326.createLineString(points1));
/*
* 点创建面
*/
List<Point> points = new ArrayList<>();
for(int i = 0; i < 10; i ++){
points.add(JtsUtil.newPoint(106.87+i, 27.53+i));
}
points.add(JtsUtil.newPoint(106.87, 27.53));
Coordinate[] points1 = points.stream()
.map(Point::getCoordinate)
.toArray(Coordinate[]::new);
Polygon polygon = JtsUtil.geometryFactory4326.createPolygon(points1);
System.out.println(polygon);
System.out.println(objectMapper.writeValueAsString(polygon));
}
/**
* @Description: Geometry 工具类
* @date: 2021/3/14$ 19:15$
*/
public class JtsUtil {
/**
* srid 为 4326
*/
public static final GeometryFactory geometryFactory4326 = new GeometryFactory(new PrecisionModel(), 4326);
public static Point newPoint(double x, double y) {
return geometryFactory4326.createPoint(new CoordinateXY(x, y));
}
public static LineString newLineString(Point[] points) {
int length = points.length;
CoordinateXY[] coordinate = new CoordinateXY[length];
for(int i = 0; i < length; i ++){
coordinate[i] = new CoordinateXY(points[i].getX(), points[i].getY());
}
return geometryFactory4326.createLineString(coordinate);
}
}