2011-07-08 13 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 

私は働く、このように見えるように最初の2行を変更した:

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

私の問題を今すぐGeographyのために働くコードサンプルの第3行を修正する方法がわかりません。 Geometryのためのタイプなので、おそらくPolygonタイプにキャストすべきではありませんが、Geographyと同等のものはありますか?地理学は部分的にしかサポートされていないので、私はここで何ができるかできないのか分かりません。

+0

'st_geometryn'と' st_pointn'を試しましたか?擬似コード:while(st_geometryn(i)){while(st_pointn(k)){process_pt(); k ++} i ++} '? – unmounted

+0

多角形をサーバから「幾何学」にキャストする必要があります。 –

+0

@bvmou:ST_GeometryNとST_PointNはジオメトリのみで動作しますが、私はGeographyを使用します。私は、Java側ではなく、データベース側のポイントを取得しようとは考えていませんでした。私はちょうど 'ST_AsText(ポリゴン)'を実行して、何かをより良く理解できなければ、そこからポイントを解析することができると思います。それでも、JDBCを使ってこれを行うより良い方法がなければならないようですが、私はそれを知らないだけです。 – Steph

答えて

3

JavaのGeographyオブジェクトからそれらを抽出するのではなく、ST_AsText()メソッドを使用してPostgresから座標を取得することになりました。それからJavaでポリゴン文字列を解析しました。

私は実行PostgreSQLの文は次のようになります。私は私のJDBCクエリを実行した後のResultSetから文字列を抽出するJavaで

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

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

をそして、私はこのようになります何かを得ます:

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

次に、私はちょうどその点を解析しました。

これが最良の方法であるかどうかはわかりませんが、自分で把握するには最良の方法です。

+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を解析し、これであなたが望むことを何でもすることができます。

関連する問題