簡體   English   中英

從 PostGIS 數據庫中的地理多邊形讀取點

[英]Reading points from a Geography Polygon in a PostGIS database

我的目標:從存儲在我的 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()); 
    } 
  } 
}

然而,我正在處理地理,而不是幾何,所以這段代碼對我來說不太適用。 如果我嘗試從表中提取多邊形,我會得到以下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類型,因為那是針對 Geometry 的,但是 Geography 是否有等價物? 我知道很多東西只部分支持地理,所以我不確定我能在這里做什么或不能做什么。

我最終決定使用 ST_AsText() 方法從 Postgres 獲取坐標,而不是從 Java 中的某種地理 object 中提取坐標。 然后我只是解析了Java中的多邊形字符串。

我執行的 PostgreSQL 語句如下所示:

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

在 Java 中,我在執行 JDBC 查詢后從 ResultSet 中提取字符串:

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

我不知道這是否是最好的方法,但這是我自己能想到的最好方法。

如果你知道 object 是一個多邊形,那就很簡單了。

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 並使用它做任何您想做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM