Чтение точек из полигона Geography в базе данных PostGIS - PullRequest
9 голосов
/ 09 июля 2011

Моя цель: прочитать точки из географического многоугольника, хранящегося в моей базе данных PostGIS.

Руководство PostGIS содержит отличный пример того, как извлечь Polygon из базы данных.

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

Я имею дело с географией, а не с геометрией, поэтому этот код не совсем подходит для меня. Если я пытаюсь извлечь Polygon из моей таблицы, я получаю следующее 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, поскольку это для геометрии, но есть ли эквивалент для географии? Я знаю, что география для многих вещей поддерживается лишь частично, поэтому я не уверен, что я могу или не могу здесь делать.

Ответы [ 4 ]

4 голосов
/ 12 июля 2011

В итоге я решил получить координаты из Postgres, используя метод ST_AsText (), а не извлекать их из какого-либо объекта Geography в Java. Затем я только что проанализировал строку многоугольника в Java.

Оператор PostgreSQL, который я выполнил, выглядит следующим образом:

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

В Java я извлекаю String из 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]);
    }
}

Я не знаю, является ли это лучшим способом сделать это, но это лучший способ, который я мог бы выяснить самостоятельно.

1 голос
/ 23 декабря 2013

Если вы знаете, что объект является многоугольником, это довольно просто.

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 голосов
/ 04 марта 2018

Используйте ST_AsGeoJSON, а затем просто проанализируйте json:

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

Тогда вы можете получить площадь как json, например:

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

И теперь, когда у вас есть его как geoJSON, вы можете анализировать JSON и делать с ним все, что пожелаете.

0 голосов
/ 11 июля 2015
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);
}
...