Чтение точек из полигона географии в базе данных PostGIS
моя цель: прочитать точки из полигона географии, хранящегося в моей базе данных 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) {
...
}
моя проблема теперь в том, что я не могу понять, как изменить третью строку образца кода для работы с географией. Я, наверное, не должен бросать его в Polygon
type, так как это для геометрии, но есть ли эквивалент для географии? Я знаю, что география только частично поддерживается для многих вещей, поэтому я не уверен, что я могу или не могу сделать здесь.
4 ответов
Я решил получить координаты из Postgres с помощью метода ST_AsText (), а не извлекать их из какого-то объекта Geography в Java. Затем я просто проанализировал полигональную строку на 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]);
}
}
Я не знаю, лучший ли это способ сделать это, но это лучший способ, который я мог бы выяснить самостоятельно.
Если вы знаете, что объект является многоугольником, это довольно просто.
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 и делать с ним все, что пожелаете.