2011-07-08 32 views
6

Mi objetivo: leer los puntos de un polígono de geografía almacenado en mi base de datos PostGIS.Leer puntos de un polígono de geografía en una base de datos PostGIS

El manual de PostGIS tiene a great example de cómo extraer un polígono de una base de datos.

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

Estoy tratando con Geografía, sin embargo, no Geometría, por lo que este código no funciona para mí. Si trato de extraer un polígono de mi mesa, me sale el siguiente ClassCastException:

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

He modificado las dos primeras líneas para tener este aspecto, que trabaja:

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

Mi problema ahora es que no puedo descifrar cómo modificar la tercera línea de la muestra del código para trabajar en Geografía. Probablemente no debería lanzarlo al tipo Polygon, ya que eso es para Geometría, ¿pero hay un equivalente para Geografía? Sé que Geography es solo parcialmente compatible con muchas cosas, así que no estoy seguro de lo que puedo o no puedo hacer aquí.

+0

¿Has probado 'st_geometryn' y' st_pointn'? Pseudocódigo: 'while (st_geometryn (i)) {while (st_pointn (k)) {process_pt(); k ++} i ++} '? – unmounted

+0

necesita convertir el polígono a 'GEOMETRY' del servidor de alguna manera –

+0

@bvmou: ST_GeometryN y ST_PointN solo funcionan para Geometry, mientras estoy trabajando con Geography. Sin embargo, no había considerado tratar de recuperar los puntos en el lado de la base de datos, en lugar de hacerlo en Java.Supongo que podría hacer un 'ST_AsText (polygon)' y analizar los puntos si no puedo encontrar nada mejor. Aún así, parece que debe haber una mejor forma de hacerlo a través de JDBC, simplemente no lo sé. – Steph

Respuesta

3

Terminé decidiendo obtener las coordenadas de Postgres usando el método ST_AsText(), en lugar de extraerlas de algún tipo de objeto Geography en Java. Luego analicé la cadena de polígonos en Java.

La declaración PostgreSQL ejecuté se parece a esto:

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

En Java extraigo la cadena desde el conjunto de resultados después de hacer mi JDBC consulta:

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

Y consigo algo que se parece a esto :

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

Luego analicé los puntos de eso.

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

No sé si esta es la mejor manera de hacerlo, pero es la mejor manera de que pudiera averiguar por mi cuenta.

+0

Yo personalmente usaría expresiones regulares para obtener los puntos. – grasshopper

1

Si sabe que el objeto es un polígono, es bastante simple.

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

Uso ST_AsGeoJSON, y luego simplemente analizar el JSON:

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

entonces se puede obtener el área como JSON como esto:

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

Y ahora que tiene como geoJSON, puede analizar el JSON y hacer lo que quiera con él.

Cuestiones relacionadas