gpt4 book ai didi

java - 从 Polygon 对象从 Java 更新 Geometry 的 PostGIS

转载 作者:搜寻专家 更新时间:2023-11-01 01:34:43 25 4
gpt4 key购买 nike

我正在尝试使用外部文件中的数据更新 PostGIs 几何列。一些多边形中的点数超过 35k,并且 ST_GeomFromText 方法不起作用,因为文本字符串太长。我可以将这些点读入 Polygon 对象,我想做类似的事情:

PreparedStatement ps = conn.preparedStatment("update x set y = ? where z = ?");
ps.setBinary(1, polygon);
ps.setString(2, key);
ps.executeUpdate();

我还没有找到任何关于如何做到这一点的例子。有人可以指出我的文档或举一个我可以遵循的例子吗?

谢谢

最佳答案

因此,为了您的利益,我做了一些测试并制作了以下示例。我也刚刚将它作为 GIST on Github 提供。 ,请随意克隆和探索。

首先,这是我在新数据库 gis_data 中创建的表的 DDL,该数据库基于 template_postgis 数据库模板构建:

CREATE TABLE sample_table
(
"key" character varying(20) NOT NULL,
large_poly geometry NOT NULL,
CONSTRAINT simple_pl PRIMARY KEY (key)
)

此表在我的 Java 示例中使用,如下所列。请务必使用您的凭据修改 DriverManager.getConnection() 行。

import java.sql.*;
import java.util.*;
import java.lang.*;
import org.postgis.*;

public class JavaGIS {

public static void main(String[] args) {
java.sql.Connection conn;
try {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost:5432/gis_data";
conn = DriverManager.getConnection(url, "postgres", "");

((org.postgresql.PGConnection)conn).addDataType("geometry",Class.forName("org.postgis.PGgeometry"));
((org.postgresql.PGConnection)conn).addDataType("box3d",Class.forName("org.postgis.PGbox3d"));

Polygon geo = new Polygon(
new LinearRing[] {
new LinearRing(
new Point[] {
new Point(-1.0d, -1.0d, 0.5d),
new Point( 1.0d, -1.0d, 0.0d),
new Point( 1.0d, 1.0d, -0.5d),
new Point(-1.0d, 1.0d, 0.0d),
new Point(-1.0d, -1.0d, 0.5d)
}
)
}
);
PreparedStatement s = conn.prepareStatement("INSERT INTO sample_table (key_value, large_poly) VALUES (?, ?)");
s.setString(1, "poly1");
s.setObject(2, new PGgeometry(geo));

int rows = s.executeUpdate();

if (rows > 0) {
System.out.println(" Successful insert! ");
} else {
System.out.println(" Failed insert!");
}
s.close();

Statement qs = conn.createStatement();
ResultSet r = qs.executeQuery("SELECT key_value, large_poly FROM sample_table");
while( r.next() ) {
/*
* Retrieve the geometry as an object then cast it to the geometry type.
* Print things out.
*/
String key = r.getString(1);
PGgeometry geom = (PGgeometry)r.getObject(2);

if (geom.getGeoType() == Geometry.POLYGON) {
System.out.println("Found a polygon with key " + key);
} else {
System.out.println("Found a PostGIS geometry object " + geom.getGeoType() + " having key " + key);
}
}
qs.close();
conn.close();
}
catch( Exception e ) {
e.printStackTrace();
}
}
}

一定要包含 recent Postgresql jdbc driver jar , 和 PostGIS jar file在编译和执行此示例时在类路径中。

此示例主要基于 PostGIS example这说明了 select 如此美丽和简单。由于 PostGIS 在其扩展方面所做的出色工作,插入也同样容易。

如果您的数据已经存在于 PostGIS Geometry 对象中,只需像我的示例一样将其包装在 PGgeometry 对象中以便插入到数据库中。这将使数据库驱动程序处理如何准确地传输它(可能是二进制数据)。有一次我真的关注了instructions on how to construct Polygons ,一切都很好。

免责声明:我只用简单的多边形尝试过,但原则是正确的。让我知道它如何处理您正在处理的非常大的多边形!

关于java - 从 Polygon 对象从 Java 更新 Geometry 的 PostGIS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22074866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com