ClassCastException:org.postgresql.util.PGobject无法强制转换为org.postgis.Point

时间:2016-06-19 08:55:25

标签: java postgresql postgis classcastexception

我从结果集中获取列并检索地理位置为PGObject。在下一步中,我想将其转换为org.postgis.Point,但我得到以下异常。

你知道如何从PGObject获得经度和纬度吗? 实际上我想将PGObject类型转换为org.postgis.Point。

我尝试了这个,但是没有用。 在结果集中:

(PGobject) rs.getObject("geolocation"),

在object的构造函数中。

this.geolocation = (Point) geolocation;

例外:

java.lang.ClassCastException: org.postgresql.util.PGobject cannot be cast to org.postgis.Point
at com.kaloudia.api.domain.custom.CompanyResultView.<init>(CompanyResultView.java:87) ~[classes/:na]
at com.kaloudia.api.manager.SearchManager.lambda$searchCompanies$0(SearchManager.java:166) ~[classes/:na]
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) ~[spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]

4 个答案:

答案 0 :(得分:4)

如果您想使用org.postgis.Point,您需要在postgres和 postgis jdbc驱动程序以及postgres jdbc驱动程序中安装postgis插件。

之后,如果您的列类型为 postgis point ,则可以执行PGgeometry geolocation = (PGgeometry) rs.getObject("geolocation");。请注意,postgres几何类型与postGIS几何类型不同

最后你应该做一些额外的行动:org.postgis.Geometry geom = geolocation.getGeometry(); geom应为org.postgis.Point类型。

答案 1 :(得分:1)

这是没有任何不必要的对象创建或方法调用的最短版本:

PGobject pGobject = (PGobject) rs.getObject("geolocation");
Point postgisPoint = (Point) PGgeometry.geomFromString(pGobject.getValue());

要使它工作,你需要PotgreSQL和PostGIS罐子;如果你使用Maven或类似的,请注意PostGIS从org移动到net domain。

答案 2 :(得分:0)

这对我有用,我认为这是正确的解决方案。

String g = geolocation.getValue(); 
try { 
    Geometry fr = new PGgeometry().geomFromString(g); 
    Point p = fr.getPoint(0); this.geolocation = p; 
} catch (SQLException e) 
{ 
    e.printStackTrace(); 
}

答案 3 :(得分:0)

我从来没有使用过postGIS,但我敢打赌,对于安装postgis jdbc驱动程序(如Marat所建议的),可能(对于大多数情况而言)更容易解决。您始终可以从PGobject扩展类型并以这种方式将其添加到您的连接中:

Connection conn = Database.getConnectionFromPool(); // you probably have something like this

((org.postgresql.PGConnection)conn).addDataType("PGgeometry", (Class<? extends PGobject>) Class.forName("org.postgis.PGgeometry"));