将 PostGIS 与 ormLite 一起使用

Posted

技术标签:

【中文标题】将 PostGIS 与 ormLite 一起使用【英文标题】:Using PostGIS with ormLite 【发布时间】:2013-02-07 12:41:48 【问题描述】:

我将 ormlite 与 jdbc 连接到一个 postgresql 数据库。我的数据结构是预定义的,包含一个称为几何的 Postgis 数据类型。此数据类型可以包含 GIS 应用程序的不同几何结构(点、线串、多边形……)。原生 Postgis 可以将此数据类型转换为 geoJson 或任何其他字符串类型的 gis 相关格式。

当我直接将 ormLite 与 Postgis(作为字符串)一起使用时,它给了我一个二进制格式。所以我想使用 postgis 函数将此二进制格式转换为例如geoJson,KML。

在 SQL 中是这样的:

select ST_AsGeoJson(geometrycolumn) from table;

update table set geometrycolumn = ST_GeomFromGeoJSON('"type":"Point","coordinates":[-5.5,7.2]')

在模型中,此几何列应作为字符串访问(读/写)。

我尝试使用 ormlite 持久化器,但为时已晚。此时,使用持久化器(通过resultToSqlArgparseDefaultString),查询已发送到数据库,我无法编辑从 postgres 请求的列。 Mrog 有一个 solution 用于解决与此相关但也使用持久性的问题。

我也尝试用 jdbc 覆盖特定的类。但不知道如何“注入” sql-functions。

或者我可以使用原始 SQL 查询。但是我需要使用表中的许多其他属性。而且我必须对数据库使用两次查询(一次用于常规属性,一次用于几何列)。而且我的 orm 感觉是不要使用原始的 sql 语句。

另一种解决方案是在数据库端创建一个 geoJson 列。 ormLite 可以从中读取并使用 sql-trigger 将其写入原始列。但这是一个糟糕的解决方案。

我真的必须创建自定义数据类型并在服务器端进行转换,而不是在数据库上进行吗?或者有没有使用原生数据库功能的解决方案?

【问题讨论】:

【参考方案1】:

我也在尝试解决这个问题,尽管设置略有不同。我一直专注于从 MSSQL 中获取 WKT 中的多边形。

看到我只使用矩形,我决定创建一个矩形数据类型。由于javaToSqlArg,当我的实现返回时,这对插入和更新工作正常

return String.format("geometry::STGeomFromText('POLYGON ((%d %d, %d %d, %d %d, %d %d, %d %d))',0)",etc...)

留下选择作为问题。我发现解决这个问题的唯一方法有点脏。

我在表中创建了另一列作为几何类型的基于字符串的表示。然后我添加了一个触发器以使它们保持同步。当一个更新另一个得到转换和更新。

如果我没有将数据库几何函数用于相交等。我可能只是将字段设为文本。

也许还值得一看:WKB4J 它可能能够读取从 ormlite 返回的二进制数据并使它们更加有形。

【讨论】:

以上是关于将 PostGIS 与 ormLite 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

将 ORMLite 与 Oracle 一起使用时,列名不是大写

将 SELECT DISTINCT ON 与 OrmLite 一起使用

java 与ormlite一起使用的mysql6 db类型

在 Spring 中让 Postgis/JDBC 与 BoneCP 一起工作

在 Android 上使用 OrmLite 进行 Proguard

ORMLite整合SQLCipher