Java 从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)

我的目标是:从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()); 
    } 
  } 
}
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)),“(.+)”,作为方式