2011-07-08 60 views
6

我的目标:读取存储在我的PostGIS数据库中的地理多边形中的点。从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()); 
    } 
    } 
} 

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

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

我已经修改了前两行看起来是这样,它的工作原理:现在

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

我的问题是我无法弄清楚如何修改代码示例的第三行来为地理工作。我可能不应该将它转换为Polygon类型,因为这是用于几何,但是是否有与地理相当的功能?我知道地理只受到很多东西的部分支持,所以我不确定我能做什么或不能做什么。

+0

你尝试过'st_geometryn'和'st_pointn'吗?伪代码:'while(st_geometryn(i)){while(st_pointn(k)){process_pt(); k ++} i ++}'? – unmounted

+0

您需要将多边形从服务器以某种方式投射到“GEOMETRY” –

+0

@bvmou:ST_GeometryN和ST_PointN仅适用于几何,而我正在使用地理。虽然我没有考虑尝试在数据库端检索点,而不是在Java端。我想我可以只是做一个'ST_AsText(多边形)'并且解析出那些点,如果我无法找出更好的结果。尽管如此,似乎通过JDBC必须有更好的方法来做到这一点,我只是不知道它。 – Steph

回答

3

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

我执行PostgreSQL的说法是这样的:

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

在Java中我提取ResultSet中的字符串做我的JDBC查询后:

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

我不知道这是否是最好的办法,但这是我自己想出的最好方法。

+0

我会亲自使用正则表达式来获得积分。 – grasshopper

1

如果您知道该对象是一个多边形,它非常简单。

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

使用ST_AsGeoJSON,然后只解析JSON:

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

然后你就可以得到面积为JSON是这样的:

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

而现在,你有它作为geoJSON,你可以解析JSON并做任何你想要的东西。

相关问题