Ste*_*eph 10 java postgresql postgis jdbc
我的目标:从我的PostGIS数据库中存储的地理多边形读取点.
PostGIS手册有一个很好的例子,说明如何从数据库中提取多边形.
PGgeometry geom = (PGgeometry)r.getObject(1);
if (geom.getType() == Geometry.POLYGON ) {
Polygon pl = (Polygon)geom.getGeometry();
for (int r = 0; r < pl.numRings(); r++) {
LinearRing rng = pl.getRing(r);
System.out.println("Ring: " + r);
for (int p = 0; p < rng.numPoints(); p++ ) {
Point pt = rng.getPoint(p);
System.out.println("Point: " + p);
System.out.println(pt.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在处理地理,但不是Geometry,所以这段代码对我来说并不适用.如果我尝试从表中提取多边形,我会得到以下结果ClassCastException:
org.postgresql.util.PGobject cannot be cast to org.postgis.PGgeometry
Run Code Online (Sandbox Code Playgroud)
我修改了前两行看起来像这样,它的工作原理如下:
PGobject area = (PGobject)rs.getObject("area");
if (area.getType().compareTo("geography") == 0) {
...
}
Run Code Online (Sandbox Code Playgroud)
我现在的问题是我无法弄清楚如何修改代码示例的第三行以适用于Geography.我可能不应该把它强制转换为Polygon类型,因为那是Geometry,但地理位置是否相同?我知道地理学只是部分支持很多东西,所以我不确定我能做什么或不能做什么.
我最终决定使用 ST_AsText() 方法从 Postgres 获取坐标,而不是从 Java 中的某种 Geography 对象中提取它们。然后我就用Java解析了多边形字符串。
我执行的 PostgreSQL 语句如下所示:
SELECT id, name, ST_AsText(area) FROM area_table;
Run Code Online (Sandbox Code Playgroud)
在 Java 中,我在执行 JDBC 查询后从结果集中提取字符串:
String area = rs.getString("ST_AsText");
Run Code Online (Sandbox Code Playgroud)
我得到的东西看起来像这样:
"POLYGON((-49 52,123 52,123 -4,-49 -4,-49 52))"
Run Code Online (Sandbox Code Playgroud)
然后我就分析了其中的要点。
double[] bounds = new double[8];
int k = 0;
for (int i = 0; i < points.length; i++) {
String[] lonLat = points[i].split(" ");
for (int j = 0; j < lonLat.length; j++) {
bounds[k++] = Double.parseDouble(lonLat[j]);
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道这是否是最好的方法,但这是我自己能想到的最好的方法。
| 归档时间: |
|
| 查看次数: |
6609 次 |
| 最近记录: |