Java 从PostGIS数据库中的地理多边形读取点
我的目标是:从PostGIS数据库中存储的地理多边形中读取点Java 从PostGIS数据库中的地理多边形读取点,java,postgresql,jdbc,postgis,Java,Postgresql,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)
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());
}
}
}
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());
}
}
}
我已经修改了前两行,使其看起来像这样,这很有效:
PGobject area = (PGobject)rs.getObject("area");
if (area.getType().compareTo("geography") == 0) {
...
}
我现在的问题是,我不知道如何修改代码示例的第三行以适用于地理环境。我可能不应该将其转换为
Polygon
类型,因为这是用于几何体的,但是对于地理,是否有一个等价物?我知道很多东西只部分支持地理,所以我不确定我在这里能做什么或不能做什么。我最终决定使用ST_AsText()方法从Postgres获取坐标,而不是从Java中的某种地理对象提取坐标。然后我用Java解析了多边形字符串
我执行的PostgreSQL语句如下所示:
SELECT id, name, ST_AsText(area) FROM area_table;
"POLYGON((-49 52,123 52,123 -4,-49 -4,-49 52))"
String area = rs.getString("area");
在Java中,我在执行JDBC查询后从ResultSet中提取字符串:
String area = rs.getString("ST_AsText");
我得到的结果是这样的:
SELECT id, name, ST_AsText(area) FROM area_table;
"POLYGON((-49 52,123 52,123 -4,-49 -4,-49 52))"
String area = rs.getString("area");
然后我就从中分析了要点
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]);
}
}
double[]界限=新的double[8];
int k=0;
对于(int i=0;i
我不知道这是否是最好的方法,但这是我自己能找到的最好的方法。如果你知道对象是多边形,它很简单
PGpolygon polygon = (PGpolygon)rs.getObject("area");
for (int i = 0; i < polygon.points.length; i++)
{
System.out.println(String.format("(%d,%d)" polygon.points[i].x, polygon.points[i].y));
}
PGpolygon polygon=(PGpolygon)rs.getObject(“区域”);
对于(int i=0;i
PGgeometry geo=(PGgeometry)rs.getObject(“coords”);
几何多边形=foo.getGeometry();
对于(int i=0;i”+poly.getPoint(i.y+”,“+poly.getPoint(i.x));
}
使用ST_AsGeoJSON,然后只解析json:
SELECT id, name, ST_AsGeoJSON(area) FROM area_table;
然后您可以将该区域作为json获取,如下所示:
SELECT id, name, ST_AsText(area) FROM area_table;
"POLYGON((-49 52,123 52,123 -4,-49 -4,-49 52))"
String area = rs.getString("area");
现在您已经将其作为geoJSON,您可以解析JSON并使用它做任何您想做的事情。您是否尝试过
st_geometryn
和st_pointn
?伪代码:while(st_geometryn(i)){while(st_pointn(k)){process_pt();k++}i++}
?需要从服务器将多边形强制转换为几何体
somehow@bvmou:ST_GeometryN和ST_PointN仅适用于几何,而我则适用于地理。不过,我没有考虑在数据库端而不是Java端检索点。我想我可以做一个ST_AsText(polygon)
,如果我想不出更好的方法,就从那里解析点。不过,似乎有更好的方法通过JDBC来实现这一点,我只是不知道。@Mike Toews:我真的必须投下它吗?如果可以的话,我希望避免这种情况,因为数据在跨越日期线、极点以及覆盖多个UTM区域的大型几何体或几何体对时可能无法按预期运行。几何体可能出现错误的地方(围绕日期线、极点等)是在尝试面积和长度函数时。我相信这两种类型之间的数据结构是相同的(即1:1),因此您始终可以将几何体转换回地理位置,以进行存储或面积/距离计算。但是,我不支持JDBC接口,因此您可能希望与postgis用户邮件列表上的人员进行检查。我个人会使用正则表达式来获取这些点。还可以在SQL中使用子字符串,以避免发送单词“POLYGON”(“for every row substring(ST_AsText(ST_Transform(l.way,4326)),“(.+)”,作为方式