2013-02-07 26 views
0

我使用jdbc将ormlite连接到postgresql数据库。我的数据结构是预定义的,并且包含一个名为geometry的Postgis数据类型。该数据类型可以包含GIS应用程序的不同几何结构(点,线串,多边形等)。 Natively Postgis可以将此数据类型转换为geoJson或任何其他字符串格式相关的格式。使用PostGIS与ormLite

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

在SQL它看起来像这样:

select ST_AsGeoJson(geometrycolumn) from table; 

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

在这种几何列应该访问的模式(读/写)为一个字符串。

我试图使用ormlite persisters但这已经太晚了。目前,使用persister(通过resultToSqlArgparseDefaultString),查询被发送到数据库,我无法编辑从postgres请求的列。 Mrog有一个solution与此有关的问题,但也使用persisters。

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

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

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

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

回答

0

我也试图把它整理出来,虽然设置稍有不同。我一直专注于从MSSQL中获取WKT中的多边形。

由于我只使用矩形,我决定制作一个矩形数据类型。因为我实现返回

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

就剩下选择的问题,该工程对插入和更新由于javaToSqlArg罚款。我发现修复这个问题的唯一方法是有点肮脏。

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

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

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