[JAVA] mybatis 使用 geometry

mybatis 使用 geometry

創建表

DROP TABLE IF EXISTS `geo`;
CREATE TABLE `geo`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `g` geometry NULL,
  `s` json NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

生成實體以及mapper

  • 實體我們對geometry字段使用String類型

public class Geo {
    private Integer id;

    private String g;

    private String s;

//  get&set
}
  • mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.GeoMapper">
  <resultMap id="BaseResultMap" type="com.example.demo.entity.Geo">
    <[email protected]>
    <!--@Table geo-->
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="g" jdbcType="OTHER" property="g" />
    <result column="s" jdbcType="OTHER" property="s" />
  </resultMap>
  <sql id="Base_Column_List">
    <[email protected]>
    id, `g`, s
  </sql>

  <insert id="insert">
    insert into geo (g)  values ( geomfromtext(#{g,jdbcType=VARCHAR}) )
  </insert>

  <select id="selectAll" resultMap="BaseResultMap">
    select id , astext(g) as g  from geo
  </select>
</mapper>
  • 這樣就可以執行mapper的基本操作
Geo geo = new Geo();
geo.setG("POINT(1 1)");

geoMapper.insert(geo);

geo.setG("LINESTRING(2 1, 6 6)");
geoMapper.insert(geo);
geo.setG("POLYGON((0 5, 2 5, 2 7, 0 7, 0 5))");
geoMapper.insert(geo);
  • 以上這些基本使用已經滿足,但是我們可能會需要對查詢結果進行運算需要將String表示的字符串轉換成GEOTOOLS支持的類型或者其他GIS框架

更新實體

public abstract class ParentGeo {
    private String g;

    /**
     * 通過字符串直接判斷
     *
     * @return
     */
    private boolean isPoint() {
        return this.g.startsWith("point") || this.g.startsWith("POINT");

    }

    private boolean isLine() {
        return this.g.startsWith("linestring") || this.g.startsWith("LINESTRING");
    }

    private boolean isPolygon() {
        return this.g.startsWith("polygon") || this.g.startsWith("POLYGON");
    }

    public String getG() {
        return g;
    }

    public void setG(String g) {
        this.g = g;
    }
}
public class Geo extends ParentGeo {
    private Integer id;


    private String s;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }


    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }
}
  • 帶有可操作的gis實體
public class RelGeo {
    private Geo geo;
    private GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);

    public RelGeo(Geo geo) {
        this.geo = geo;
    }

    public Geo getGeo() {
        return geo;
    }

    public GeometryFactory getGeometryFactory() {
        return geometryFactory;
    }

    public LineString getLineString() throws ParseException {
        if (this.geo.isLine()) {
            WKTReader reader = new WKTReader(geometryFactory);
            return (LineString) reader.read(geo.getG());
        }
        return null;
    }

    public Point getPoint() throws ParseException {
        if (geo.isPoint()) {
            WKTReader reader = new WKTReader(geometryFactory);
            return (Point) reader.read(geo.getG());
        }
        return null;
    }

    public Polygon getPolygon() throws ParseException {
        if (geo.isPolygon()) {
            WKTReader reader = new WKTReader(geometryFactory);
            return (Polygon) reader.read(geo.getG());
        }
        return null;
    }
}
  • 使用
    List<Geo> geos = geoMapper.selectAll();
        for (Geo geo1 : geos) {
            RelGeo relGeo = new RelGeo();
            BeanUtils.copyProperties(geo1, relGeo);
            if (relGeo.getPoint() != null) {
                Point point = relGeo.getPoint();
                System.out.println(point);
            } else if (relGeo.getLineString() != null) {
                LineString lineString = relGeo.getLineString();
                System.out.println(lineString);
            } else {
                Polygon polygon = relGeo.getPolygon();
                System.out.println(polygon);
            }

        }
  • 轉換過之後就可以對Point這些geom數據類型進行操作了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章