首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgis -如何通过JDBC处理数据类型“地理”

Postgis -如何通过JDBC处理数据类型“地理”
EN

Stack Overflow用户
提问于 2015-04-20 10:03:41
回答 3查看 4.2K关注 0票数 3

在使用postgresql 9.3 postgis 2.1的web项目上工作。

表中有一个类型为geography的列,它只存储一个point

现在,我需要使用Java对象通过JDBC插入/选择类型。

在阅读了postgis手册之后,没有发现太多相关的信息。

的问题是:

  1. 在java模型类中,列应该使用什么Java数据类型?
  2. 如何编写插入sql?
  3. 如何编写select sql来检索值并放入Java对象中?
  4. 如果使用mybatis,那么它会对上述问题的答案产生影响吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-21 03:55:20

POINT几何图形不需要特殊的类型。只需使用像double这样的原始数据类型作为坐标。

例如,若要通过lonlat参数插入新的lat类型,请使用几何构造函数

代码语言:javascript
运行
复制
INSERT INTO my_table (geog)
VALUES (ST_SetSRID(ST_MakePoint(:lon, :lat), 4326)::geography);

或将它们作为浮点数返回,请使用几何存取函数

代码语言:javascript
运行
复制
SELECT ST_Y(geog::geometry) AS lat, ST_X(geog::geometry) AS lon FROM my_table;

还有其他输入/输出格式,如GeoJSON、WKT等。

票数 10
EN

Stack Overflow用户

发布于 2017-09-20 07:07:19

如果使用MyBatis,MyBatis中有一个用于Postgis类型的小项目。并且它已经添加到maven central中,因此您可以直接从maven使用它。

https://github.com/eyougo/mybatis-typehandlers-postgis

票数 2
EN

Stack Overflow用户

发布于 2017-02-08 09:49:04

如果您正在使用TypeHandler,则可以透明地进行纬度和经度之间的转换。下面是我是如何在一个场景中这样做的,比如你的,PostGIS,Mybatis,和地理需要。使用TypeHandler可以处理不同的类,您可以将几何类型打包到其中。在我的例子中,坐标有两个double属性,latitudelongitude

坐标类

代码语言:javascript
运行
复制
public class Coordinate {
    private Double latitude;
    private Double latitude;
    ... getters, setters, etc
}

声明Ibati的TypeHandler

代码语言:javascript
运行
复制
@MappedJdbcTypes(JdbcType.JAVA_OBJECT)
@MappedTypes({Coordinate.class})
public class CoordinateTypeHandler extends BaseTypeHandler<Coordinate> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Coordinate parameter, JdbcType jdbcType) throws SQLException {
        // Convert Coordinate to Ibatis representation of Postgis point, e.g., "SRID=4326;POINT(2.294801 48.858007)"
        Point point = new Point(parameter.getLongitude(), parameter.getLatitude());
        point.setSrid(4326);
        ps.setString(i, point.toString());
    }

    // Convert data read from Ibatis to actual Coordinate class
    @Override
    public Coordinate getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return from(rs.getString(columnName));
    }

    @Override
    public Coordinate getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return from(rs.getString(columnIndex));
    }

    @Override
    public Coordinate getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return from(cs.getString(columnIndex));
    }

    protected Coordinate from(String pointAsText) throws SQLException {
        if (pointAsText != null) {
            Point point = new Point(pointAsText);
            return new Coordinate(point.getY(), point.getX());
        }
        return null;
    }
}

然后,准备你的选择在伊巴提斯的界面。参考这里的用法'as coordinate',它告诉Ibatis查找坐标类型的表示,这是您刚才定义的CoordinateTypeHandler处理的。

重要的是要知道,在您的表定义中,location bellow被声明为location geography(POINT, 4326)

代码语言:javascript
运行
复制
@Select("SELECT " +
        "ST_AsText(location) AS coordinate" +
    "FROM " +
        "mytable " +
    "WHERE " +
        "tableattribute = #{myattribute}")
List<Result> myFindMethod(
        @Param("myattribute") Integer myattribute
);

该解决方案将为坐标类提供一个干净的抽象,该类将latitudelongitude属性封装到PostGIS上的SRID=4326;POINT(2.294801 48.858007)表示。考虑到Mike的解决方案,您需要为要在API/服务上创建的每个查询重写相同的(ST_SetSRID(ST_MakePoint(:lon, :lat), 4326)::geography)

使用TypeHandler的目的是避免这种情况,一旦您更改/添加了您的TypeHandler的表示,它将直接反映在您使用as coordinate的每个查询上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29744816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档