Mybatis-plus读取(GeoJson)和保存Postgis geography数据

在入库和查询中需要自动的让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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值