ClassCastException: org.postgresql.util.PGobject 无法转换为 org.postgis.Point
ClassCastException: org.postgresql.util.PGobject cannot be cast to org.postgis.Point
我从结果集中获取列并将地理位置检索为 PGObject。在下一步中,我想将其转换为 org.postgis.Point 但出现以下异常。
你知道如何从PGObject获取经纬度吗?
实际上我想将 PGObject 类型转换为 org.postgis.Point.
我试过了,但没有用。
在结果集中:
(PGobject) rs.getObject("geolocation"),
在对象的构造函数中。
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[=14=](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]
如果你想使用 org.postgis.Point
你需要安装 postgis 插件到你的 postgres 和 postgis jdbc driver 以及 postgres jdbc driver.
之后,如果您的专栏类型是postgis point,您将能够做到PGgeometry geolocation = (PGgeometry) rs.getObject("geolocation");
。请注意,postgres 几何类型 与 postGIS 几何类型不同。
最后你应该做一个额外的动作:org.postgis.Geometry geom = geolocation.getGeometry()
; geom
应该是 org.postgis.Point
类型。
这是没有任何不必要的对象创建或方法调用的最短版本:
PGobject pGobject = (PGobject) rs.getObject("geolocation");
Point postgisPoint = (Point) PGgeometry.geomFromString(pGobject.getValue());
要让它工作,您需要 PotgreSQL 和 PostGIS jar;如果您使用 Maven 或类似软件,请注意 PostGIS 从 org 域移至 net 域。
这对我有用,我认为这是正确的解决方案。
String g = geolocation.getValue();
try {
Geometry fr = new PGgeometry().geomFromString(g);
Point p = fr.getPoint(0); this.geolocation = p;
} catch (SQLException e)
{
e.printStackTrace();
}
我从未使用过 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"));
我从结果集中获取列并将地理位置检索为 PGObject。在下一步中,我想将其转换为 org.postgis.Point 但出现以下异常。
你知道如何从PGObject获取经纬度吗? 实际上我想将 PGObject 类型转换为 org.postgis.Point.
我试过了,但没有用。 在结果集中:
(PGobject) rs.getObject("geolocation"),
在对象的构造函数中。
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[=14=](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]
如果你想使用 org.postgis.Point
你需要安装 postgis 插件到你的 postgres 和 postgis jdbc driver 以及 postgres jdbc driver.
之后,如果您的专栏类型是postgis point,您将能够做到PGgeometry geolocation = (PGgeometry) rs.getObject("geolocation");
。请注意,postgres 几何类型 与 postGIS 几何类型不同。
最后你应该做一个额外的动作:org.postgis.Geometry geom = geolocation.getGeometry()
; geom
应该是 org.postgis.Point
类型。
这是没有任何不必要的对象创建或方法调用的最短版本:
PGobject pGobject = (PGobject) rs.getObject("geolocation");
Point postgisPoint = (Point) PGgeometry.geomFromString(pGobject.getValue());
要让它工作,您需要 PotgreSQL 和 PostGIS jar;如果您使用 Maven 或类似软件,请注意 PostGIS 从 org 域移至 net 域。
这对我有用,我认为这是正确的解决方案。
String g = geolocation.getValue();
try {
Geometry fr = new PGgeometry().geomFromString(g);
Point p = fr.getPoint(0); this.geolocation = p;
} catch (SQLException e)
{
e.printStackTrace();
}
我从未使用过 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"));