从PostGIS数据库中的Geography Polygon读取点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从PostGIS数据库中的Geography Polygon读取点相关的知识,希望对你有一定的参考价值。

我的目标:从我的PostGIS数据库中存储的地理多边形读取点。

PostGIS手册中包含了如何从数据库中提取多边形的a great example

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()); 
    } 
  } 
}

我正在处理地理,但不是Geometry,所以这段代码对我来说并不适用。如果我尝试从我的表中提取多边形,我得到以下ClassCastException

org.postgresql.util.PGobject cannot be cast to org.postgis.PGgeometry

我修改了前两行看起来像这样,它的工作原理如下:

PGobject area = (PGobject)rs.getObject("area");
if (area.getType().compareTo("geography") == 0) {
    ...
}

我现在的问题是我无法弄清楚如何修改代码示例的第三行以适用于Geography。我可能不应该把它投射到Polygon类型,因为那是几何学,但是地理学是否相同?我知道地理学只是部分支持很多东西,所以我不确定我能做什么或不能做什么。

答案

我最终决定使用ST_AsText()方法从Postgres获取坐标,而不是从Java中的某种Geography对象中提取它们。然后我只用Java解析了多边形字符串。

我执行的PostgreSQL语句如下所示:

SELECT id, name, ST_AsText(area) FROM area_table;

在Java中,我在执行JDBC查询后从ResultSet中提取String:

String area = rs.getString("ST_AsText");

我得到的东西看起来像这样:

"POLYGON((-49 52,123 52,123 -4,-49 -4,-49 52))"

然后我只是解析了那些点。

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]);
    }
}

我不知道这是否是最好的方法,但这是我能够自己解决的最好方法。

另一答案

如果您知道对象是多边形,那么它非常简单。

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));
    }
另一答案
PGgeometry geo = (PGgeometry)rs.getObject("coords");
Geometry poly = foo.getGeometry();
for (int i = 0; i < poly.numPoints(); i++)
{
    System.out.println("-->"+poly.getPoint(i).y+", "+ poly.getPoint(i).x);
}
另一答案

使用ST_AsGeoJSON,然后只解析json:

SELECT id, name, ST_AsGeoJSON(area) FROM area_table;

然后你可以像json一样得到这个区域:

String area = rs.getString("area");

现在您将它作为geoJSON,您可以解析JSON并随心所欲地执行它。

以上是关于从PostGIS数据库中的Geography Polygon读取点的主要内容,如果未能解决你的问题,请参考以下文章

PostGIS的具体函数参考了解

PostgreSQL 添加postgis插件实现获取经纬度间的距离

PostGIS 错误:类型“地理”不存在

PostgreSQL , PostGIS , 球坐标 , 平面坐标 , 球面距离 , 平面距离

如何将纬度/经度对转换为 PostGIS 地理类型?

如何在 Postgis 上更快地进行选择查询