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. NCNN 模型推理详解及实战

    一,依赖库知识速学 aarch64 OpenMP AVX512 submodule apt upgrade 二,硬件基础知识速学 2.1,内存 2.2,CPU 三,ncnn 推理模型 3.1,shuf ...

  2. springboot 复杂邮件发送

    application.yml配置 密码为邮箱开启smtp时邮箱服务商提供的密码

  3. 佛祖保佑永无 BUG 代码注释

    // // _oo0oo_ // o8888888o // 88" . "88 // (| -_- |) // 0\ = /0 // ___/`---'\___ // .' \\| ...

  4. 大便系统怎样安装RPM包

    alien包转换工具 如果我们有很喜欢的RPM包,而又没有deb版本. 怎么办~? 可以同过alien来转换或者直接安装,这个小家伙可是个很方便的东西! 基本命令如下: 首先通过apt-get ins ...

  5. 一键SSH免密脚本

    大型项目一键SSH免密脚本 #!/usr/bin/env bash root=$( cd $(dirname $0)/.. pwd ) source ${root}/dragonrc read -p ...

  6. 超实用!阿里云应用——Air780EP低功耗4G模组AT开发示例

    ​ Air780EP是合宙推出的一款低功耗4G全网通模组,兼容模组行业1618经典封装,支持OpenCPU开发及全功能数传AT开发,可广泛应用于多样化的物联网终端. 针对客户朋友需求反馈,本期特别推出 ...

  7. 硬件设计很简单?合宙低功耗4G模组Air780E—开机启动及外围电路设计

    ​ Air780E是合宙低功耗4G-Cat.1模组经典型号之一,上期我们解答了大家关心的系列问题,并讲解了选型的注意要点. 有朋友问:能不能讲些硬件设计相关的内容? 模组的上电开机,是硬件设计调试的第 ...

  8. 如何进行个人wiki写作

    Wiki是一种内容管理系统,它的特点包括:多人协作模式.内容逐步积累.网状知识链接.而用作个人知识管理的个人wiki,就利用了内容逐步积累和网状知识链接这两个特点.因为是个人的,所以用不着协作. 怎么 ...

  9. golang之项目部署

    介绍 Go 语言可以使用内置命令行工具 go build 编译生成可执行文件.自 Go1.5 版本开始实现自举后,交叉编译也很方便,只需使用 GOOS.GOARCH 环境变量指定目标平台和架构. 部署 ...

  10. Kafka 1.1.1 源码编译

    下载源码 git clone -b 1.1.1 https://github.com/apache/kafka.git --depth=1   使用这样的方式下载主要是解决两个问题:其一,下载指定分支 ...