PostGIS之Java入门
相关的功能也可以使用jts.jar包实现
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.junit.Before; import org.junit.Test; import org.postgresql.geometric.PGcircle; import org.postgresql.geometric.PGpoint; public class GeometricTest { private Connection conn; @Before public void init() throws Exception { Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql://localhost:5432/postgis"; conn = DriverManager.getConnection(url, "username", "password"); Statement stmt = conn.createStatement(); stmt.execute("CREATE TEMP TABLE geomtest(mycirc circle)"); stmt.close(); } public void destroy() throws SQLException { if (conn != null) { conn.close(); } } @Test public void insertCircle() throws SQLException { PGpoint center = new PGpoint(1, 2.5); // PGpolygon polygon = new PGpolygon(points); double radius = 4; PGcircle circle = new PGcircle(center, radius); PreparedStatement ps = conn.prepareStatement("INSERT INTO geomtest(mycirc) VALUES (?)"); ps.setObject(1, circle); ps.executeUpdate(); ps.close(); } @Test public void retrieveCircle() throws SQLException { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT mycirc, area(mycirc) FROM geomtest"); rs.next(); PGcircle circle = (PGcircle) rs.getObject(1); double area = rs.getDouble(2); // PG PGpoint center = circle.center; double radius = circle.radius; System.out.println("Center (X, Y) = (" + center.x + ", " + center.y + ")"); System.out.println("Radius = " + radius); System.out.println("Area = " + area); } @Test public void getWKTFromGEOM() throws SQLException { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT ST_AsText(geom) FROM sheng where name = '新疆维吾尔自治区'"); rs.next(); String wkt = rs.getString(1); System.out.println(wkt); } @Test public void getWKBFromGEOM() throws SQLException { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT ST_AsBinary(geom) FROM sheng"); rs.next(); String wkt = rs.getString(1); System.out.println("wkt = " + wkt); } @Test public void getEWKTFromGEOM() throws SQLException { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT ST_AsEWKT(geom) FROM sheng"); rs.next(); String wkt = rs.getString(1); System.out.println("wkt = " + wkt); } @Test public void getBufferFromGEOM() throws SQLException { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT ST_AsEWKT(ST_Buffer(geom, 0.2)), ST_AsEWKT(geom) FROM sheng where id = 1"); rs.next(); String wkt = rs.getString(1); String wkt2 = rs.getString(2); //System.out.println("tt " + wkt.substring(0, 100)); //System.out.println("tt " + wkt2.substring(0, 100)); } /** * 需要在postGis中模拟一个dual表(注意指明空间字段) */ @Test public void getBufferFromWKT() throws SQLException { // 新疆维吾尔自治区 String wkt = PropertiesUtility.getInstance().findFileValue("system.properties", "wkt"); long startTime = new java.util.Date().getTime(); System.out.println(startTime); String sql = "SELECT ST_AsText(ST_Buffer(st_geomfromtext('" + wkt + "'), 0.2)) FROM dual"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); rs.next(); long endTime = new java.util.Date().getTime(); System.out.println(endTime); System.out.println("缓冲时间:" + (endTime - startTime)); System.out.println("坐标点数:" + wkt.split(",").length); } /** * 根据指定的缓冲距离进行缓冲,以米为单位 */ @Test public void getBufferFromWKT2() throws SQLException { // 新疆维吾尔自治区 wkt=MULTIPOLYGON(((79.036744 34.3364............. String wkt = PropertiesUtility.getInstance().findFileValue("system.properties", "wkt"); long startTime = new java.util.Date().getTime(); System.out.println(startTime); // 缓冲距离为10.8KM String sql = "SELECT ST_AsText(st_transform(st_setsrid(ST_Buffer(st_transform(st_setsrid(st_geomfromtext('" + wkt + "'), 4326), 2333), 10800), 2333), 4326)) FROM dual"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); rs.next(); String resultWKT = rs.getString(1); System.out.println(resultWKT); long endTime = new java.util.Date().getTime(); System.out.println(endTime); System.out.println("缓冲时间:" + (endTime - startTime)); System.out.println("坐标点数:" + wkt.split(",").length); } // 判断点是否在多边形内 @Test public void getWithin() throws SQLException { Statement stmt = conn.createStatement(); String sql = "SELECT name FROM sheng where ST_Within(ST_MakePoint(116.561, 40.276), geom)"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { String wkt = rs.getString(1); System.out.println(wkt); } } }
转载自:https://blog.csdn.net/shihuacai/article/details/9203125