在入库和查询中需要自动的让geography的类型和实体类中的类型映射。
实体类中接收参数是String类型(geoJson)
PostGis中的geography类型是十六进制的扩展WKB类型(EWKB),
虽然Postgis数据库中提供类类型转换函数,能转换各种类型:postgis常用命令_yaoct的博客-CSDN博客
但是基于mybatis框架查询时,就需要用java代码来转换。初步方案时mybatis中的类型转换器。
先引入java处理GIS的库,这里用的是Geotools库。
1、geotools的maven引入
<properties>
<geotools.version>20.0</geotools.version>
</properties>
<dependencies>
<!-- geotools相关jar包 -->
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-swing</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-jdbc</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools.jdbc</groupId>
<artifactId>gt-jdbc-postgis</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-shapefile</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-api</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-opengis</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-data</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-referencing</artifactId>
<version>${geotools.version}</version>
</dependency>
<dependency>
<groupId>net.postgis</groupId>
<artifactId>postgis-jdbc</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
<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>
2、Geotools工具类转换WKB和Geojson
WKBReader reader = new WKBReader( );
Geometry geometry = reader.read(WKBReader.hexToBytes("0101000020E61000002C39382229FD5D4085716007088C3E40"));
// 设置保留6位小数,否则GeometryJSON默认保留4位小数
GeometryJSON geometryJson = new GeometryJSON(7);
String s = geometryJson.toString(geometry);
System.out.println(s);
//{"type":"Point","coordinates":[119.9556356,30.5469975]}
//EWKB->转geojson丢失信息
Geometry read = geometryJson.read("{\"type\":\"Point\",\"coordinates\":[119.9556356,30.5469975]}");
System.out.println(read.toString());
WKBWriter wkbWriter = new WKBWriter();
byte[] write = wkbWriter.write(geometry);
String s1 = WKBWriter.toHex(write);
System.out.println(s1);
3、mybatis-plus类型转换器
package org.jeecg.oyz.modules.ost.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecg.oyz.common.config.MyGeographyTypeHandler;
import java.io.Serializable;
//一标三识_单体化表
@TableName(value = "oyz_ost_monomer",autoResultMap = true)
@Data
public class Monomer implements Serializable {
@TableId(value = "id",type = IdType.AUTO)
@ApiModelProperty(value = "主键ID")
private Integer id;
@ApiModelProperty(value = "名称")
private String name;
@ApiModelProperty(value = "酒店(OST_HOTEL)、住宅房屋(OST_HOME)、党政机关(OST_PARTY)、小区楼宇(OST_BUILDING)、店铺(OST_SHOP)")
private String type;
//楼层高
@ApiModelProperty(value = "楼层高")
private Double floorHeig;
@ApiModelProperty(value = "基础高")
private Double baseHeigh;
@ApiModelProperty(value = "顶高")
private Double topHeight;
@ApiModelProperty(value = "地理数据")
@TableField(exist = false)
private String geometry;
@ApiModelProperty(value = "地理数据")
@TableField(typeHandler = MyGeographyTypeHandler.class)
private String geog;
@ApiModelProperty(value = "颜色")
private String color;
@ApiModelProperty(value = "小区名称")
private String communityName;
@ApiModelProperty(value = "楼号")
private String buildingNo;
@ApiModelProperty(value = "单元")
private String unit;
@ApiModelProperty(value = "小区名称")
private String doorNo;
@ApiModelProperty(value = "楼层")
private String floorName;
@ApiModelProperty(value = "相机坐标")
private String viewingAngle;
}
自定义GeoJson数据对象:
package org.jeecg.oyz.common.entity;
import com.alibaba.fastjson.JSONObject;
import java.util.List;
/**
* 自定义geojson对象
*/
public class MyGeoJson {
private String type;
private List features;
private JSONObject crs;
public MyGeoJson() {
this.type = "FeatureCollection";
this.crs = new JSONObject();
this.crs.put("type","name");
JSONObject properties = new JSONObject();
properties.put("name","EPSG:4326");
this.crs.put("properties",properties);
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public List getFeatures() {
ret