PostGIS代码操作简介

1. 代码操作POSTGIS的可选方案

  1. jdbc
  2. postgis-java
  3. geotools
  4. gdal

2. JDBC


public void testJdbc() {
String sql = "select st_area(st_geomfromtext('MULTIPOLYGON (((39364656.2504190132021904 2701523.9713633288629353, 39364650.82893280684947968 2701491.44244607863947749, 39364683.77488745748996735 2701504.16208679834380746, 39364683.77488745748996735 2701504.16208679834380746, 39364656.2504190132021904 2701523.9713633288629353)))'))";
DataSource ds = new SimpleDataSource("jdbc:postgresql://localhost:5432/postgres",
"postgres", "123456");
Connection connection = ds.getConnection();
ResultSet rs = connection.createStatement().executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString(1));
}
connection.close();
}

3. PostGIS-Java


public void testPostgisJava(){
String wkt = "MULTIPOLYGON (((39364656.2504190132021904 2701523.9713633288629353, 39364650.82893280684947968 2701491.44244607863947749, 39364683.77488745748996735 2701504.16208679834380746, 39364683.77488745748996735 2701504.16208679834380746, 39364656.2504190132021904 2701523.9713633288629353)))";
Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres",
"postgres", "123456");
PGgeometry geom = new PGgeometry(wkt);
PreparedStatement ps = connection.prepareStatement("select st_area(?)");
ps.setObject(1, geom);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1));
}
connection.close();
}

4. GeoTools


public void testGeotools(){
Map<String, Object> params = new HashMap<>();
params.put("dbtype", "postgis");
params.put("host", "127.0.0.1");
params.put("port", "5432");
params.put("schema", "public");
params.put("database", "postgres");
params.put("user", "postgres");
params.put("passwd", "123456");
params.put("preparedStatements", true);
params.put("encode functions", true); String sql = "select st_area(st_geomfromtext('MULTIPOLYGON (((39364656.2504190132021904 2701523.9713633288629353, 39364650.82893280684947968 2701491.44244607863947749, 39364683.77488745748996735 2701504.16208679834380746, 39364683.77488745748996735 2701504.16208679834380746, 39364656.2504190132021904 2701523.9713633288629353)))'))";
JDBCDataStore jdbcDataStore = (JDBCDataStore) DataStoreFinder.getDataStore(params);
Statement statement = jdbcDataStore.getConnection(Transaction.AUTO_COMMIT).createStatement();
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString(1));
}
statement.close();
jdbcDataStore.dispose();
}

5. GDAL


public void testGdal(){
String path = "PG: host=127.0.0.1 port=5432 dbname=postgres user=postgres password=123456 active_schema=public";
ogr.RegisterAll();
org.gdal.ogr.Driver driver = ogr.GetDriverByName("PostgreSQL");
org.gdal.ogr.DataSource dataSource = driver.Open(path, 1);
String sql = "select st_area(st_geomfromtext('MULTIPOLYGON (((39364656.2504190132021904 2701523.9713633288629353, 39364650.82893280684947968 2701491.44244607863947749, 39364683.77488745748996735 2701504.16208679834380746, 39364683.77488745748996735 2701504.16208679834380746, 39364656.2504190132021904 2701523.9713633288629353)))'))";
Layer layer = dataSource.ExecuteSQL(sql);
System.out.println(layer.GetFeature(0).GetFieldAsDouble(0));
dataSource.delete();
}

6. Geometry与Geography区别

PostGIS提供了两种主要的空间数据类型:GEOMETRYGEOGRAPHY。这两种数据类型都可以用来存储地理空间数据,如点、线和多边形,但它们在处理这些数据时有一些重要的区别:

  1. 坐标系统GEOMETRY数据类型使用笛卡尔坐标系统(平面坐标系统),而GEOGRAPHY数据类型使用球面坐标系统(经纬度)。这意味着GEOMETRY类型更适合处理本地或区域数据,而GEOGRAPHY类型更适合处理全球数据。

  2. 计算GEOMETRY类型在计算距离、面积和长度时使用的是笛卡尔坐标系统,这可能会导致结果不准确,特别是在处理大范围的数据时。相反,GEOGRAPHY类型在计算这些值时会考虑地球的曲率,因此结果更准确。

  3. 性能GEOMETRY类型通常比GEOGRAPHY类型更快,因为笛卡尔计算通常比球面计算更简单。然而,这种性能差异通常只在处理大量数据时才显著。

  4. 空间函数支持GEOMETRY类型支持更多的空间函数,而GEOGRAPHY类型只支持一部分空间函数。

在选择使用GEOMETRY还是GEOGRAPHY时,你应该根据你的具体需求和数据来决定。如果你需要处理全球数据,并且需要准确的距离和面积计算,那么GEOGRAPHY可能是更好的选择。如果你需要处理本地或区域数据,或者需要使用更多的空间函数,那么GEOMETRY可能是更好的选择。

PostGIS代码操作简介的更多相关文章

  1. 通过 C# 代码操作 Google 日历

    原文:通过 C# 代码操作 Google 日历 本文主题 借助 Google .NET APIs Client Library,通过 C# 代码在 Google 日历中创建会议邀请. 本文背景 最近, ...

  2. JavaScript后台代码操作HTML TABLE的方法

    原文:JavaScript后台代码操作HTML TABLE的方法 var rowNum = 0,fileNum = 0; //行号与列号 var oNewRow; //定义插入行对象 var oNew ...

  3. 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式

    由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...

  4. SVN SVN合并(Merge)与拉取分支(Branch/tag)操作简介

    SVN合并(Merge)与拉取分支(Branch/tag)操作简介 合并(Merge) 例子:把对feature_branch\project_name_v3.3.7_branch的修改合并到deve ...

  5. Java代码操作HDFS测试类

    1.Java代码操作HDFS需要用到Jar包和Java类 Jar包: hadoop-common-2.6.0.jar和hadoop-hdfs-2.6.0.jar Java类: java.net.URL ...

  6. (转)python 列表与元组的操作简介

    python 列表与元组的操作简介 原文:https://www.cnblogs.com/QG-whz/p/4782809.html 阅读目录 列表 list函数 列表的基本操作 列表方法 元组 tu ...

  7. 使用java代码操作Redis

    1导入pom.xml依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis ...

  8. java代码操作Redis

    1.导入需要的pom依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEn ...

  9. Zookeeper学习笔记(三)——java客户端代码操作

    Zookeeper客户端java代码操作 上篇博客记录了shell命令操作zookeeper集群的方式,这次尝试采用java代码来操作.通过查阅API,发现并不困难. 1. 首先获得客户端与服务器的连 ...

  10. Java代码操作zookeeper

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

随机推荐

  1. Web渗透07_脚本代码注入和OS命令注入( 恐怖级别 )

    1 PHP代码注入 1.1 原理成因 网站对用户的输入过滤出现问题,同时网站的脚本编写用到一些危险函数 eval(),assert().如果被攻击者发现漏洞,直接可能造成攻击者完全控制整个web甚至是 ...

  2. Xor-FWT 的另一种理解方式

    Xor-FWT 的另一种理解方式 学习 \(\text{Fennec's Algorithm}\) 的额外收获,顺手记录一下. 假设我们要求两个长度为 \(n\) 的数组的异或卷积,为方便起见令 \( ...

  3. 使用Roslyn的源生成器生成DTO

    前言 源生成器的好处很多, 通过在编译时生成代码,可以减少运行时的反射和动态代码生成,从而提高应用程序的性能, 有时候需要对程序AOT以及裁剪编译的dll也是需要用SG来处理的. 我们开发程序应该都绕 ...

  4. JAVA 传输post传输长字符、数据编码解码 反序列化字符串

    JAVA 传输post传输长字符.数据编码解码 1.前段传输 这是传输的数组对象 2.后端接收格式已解码 JS代码: $.ajax({ url:prefix+"/importModelTre ...

  5. MySQL 主从复制之多线程复制

    目录 一.MySQL 多线程复制的背景 二.MySQL 5.5 主从复制 1.原理 2.部署主从复制 2.1.主节点安装配置MySQL 5.5 2.2.从节点安装配置MySQL 5.5 3.检查主从库 ...

  6. nemu-wsl-环境配置

    实在是不愿意用学校的虚拟平台,觉得在自己的电脑上留存一部分真的很有意思,也想捣鼓一下,于是在自己电脑上配置下最基本的环境,做下记录 准备好wsl 因为要求环境是 Ubuntu 18.04 和 gcc- ...

  7. uni app 封装接api接口

    创建文件  base.js let baseURL = ''; // 是否在控制台显示接口请求日志,本地环境启用,打包环境禁用 let showHttpLog = false; // 测试环境 bas ...

  8. BUU get_started_3dsctf_2016

    先checksec一下 32位程序,没开PIE,再观察一下主函数 gets函数有可能是栈溢出,再观察一下后门函数 方法一: 考虑栈溢出后直接跳转到if判断后面的语句,进而跳过if条件判断 from p ...

  9. VLM-OCR-Demo:一个使用VLM用于OCR任务的示例

    前言 上一篇文章TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面中我们构建了一个方便使用TesseractOCR的用户界面,今天构建一个类似的界面,使用 ...

  10. Teable 团队 Sealos 最佳实践,创业公司的完美选择

    大家好,我是开源多维表格项目 Teable 的创始人陈加贝. 作为飞书多维表格的最早期负责人,我参与并见证了这个产品从 0 到 1 的全过程.这段经历也让我深入理解了企业在数据协作方面的真实需求. 以 ...