在此介绍用sql对超图的空间数据库(sdx)进行空间查询,优点如下:

1。超图推荐的方式是用iobject,此方法要引入iobject

2。超图另一个推荐的方式是用iserver的REST接口,但web接口缺点在于性能一般,尤其是返回数据比较多以及并发频繁的情况下性能不好

超图空间数据库支持多种数据库产品(DBMS),可这种方式只支持PostGIS,也即是下图的

PS:注意在超图sdx的体系,Postgresql和PostGIS是两种数据库,而开源空间数据库PostGIS依赖于postgresql,可以说空间数据库PostGIS也是postgresql,注意区别

PS:超图idesktop部分版本不支持PostGIS,例如我只在idesktop 9D java 2019(9.1.0)能成功使用

当超图PostGIS数据库建好后,建立好jdbc连接(本文略,总之按postgresql建连接就行),然后就可以用sql做空间查询,以及输出几何对象

sql中使用空间查询的“接口”跟开源空间数据库PostGIS是一样的,原理是超图PostGIS也兼容开源PostGIS的功能

开源PostGIS的空间查询接口遵循OpenGIS标准,以下是开源PostGIS的官方文档,有接口的详细说明:https://postgis.net/docs/manual-dev/reference.html

另外个人也可以baidu关键词:postgis查询,来找到相关文章

以下贴一些代码

/**

* 属性查询

*

* @throws Exception

*/

private void attrQuery() throws Exception {

//属性查询

//例子:查询名称为f1的字段,值等于 面1 的要素(数据/行)

//图层名

//sde数据库带空间属性的表叫图层,因此图层跟表类似

String layerName = "polygon1";

//获取默认数据库连接

Connection conn = JdbcConnConfigUtil.getDefaultConn();

//查询使用的是sql,就是普通的sql

//select至from之间是输出的字段,其中ST_AsText(smgeometry)是输出几何对象并转成wkt格式,smgeometry代表几何对象,ST_AsText是一个函数可以把几何对象转成wkt格式的字符串

//ST_开头的函数属于开源空间数据库PostGIS的功能,可以理解为写在sql语句里的一些函数,详细api在这https://postgis.net/docs/manual-dev/reference.html

String sql = "select f1,ST_AsText(smgeometry) as wkt" +

" from " + layerName + " t " +

//查询条件,本demo是属性查询因此跟一般sql一样

"where t.f1='面1'";

//查询代码,跟jdbc一样的用法

PreparedStatement pst = null;

ResultSet rs = null;

try {

pst = conn.prepareStatement(sql);

//执行查询

rs = pst.executeQuery();

//while循环变量查询结果

while (rs.next()) {

//通过字段索引获取字段值,注意:索引从1开始!!!!

//获取几何对象,wkt格式

//wkt格式既可以构建几何对象(如何构建后面有说),也可以输出到前端供前端使用

String wkt = rs.getString(2);

//获取普通字段的值

Long f1 = DataConvertUtil.strToLong(rs.getString(1));

}

} finally {

//关闭连接,清除各种对象

DbUtils.closeQuietly(conn, pst, rs);

}

}

/**

* 空间查询,点查询面图层

*

* @throws Exception

*/

private void pointQueryPolygonLayer() throws Exception {

//空间查询,点查询面图层

//图层名

//sde数据库带空间属性的表叫图层,因此图层跟表类似

String layerName = "polygon1";

//点以坐标形式存在

double x = 38794.80;

double y = 25327.295;

//获取默认数据库连接

Connection conn = JdbcConnConfigUtil.getDefaultConn();

//获取图层的srid

//srid代表图层的空间参考(也可以说是坐标系),sr=spatial reference

String srid = SdxUtil.getSridByTableName(conn, layerName, JdbcConnConfigUtil.getDefaultMapProperties());

conn = JdbcConnConfigUtil.getDefaultConn();

//查询使用的是sql,就是普通的sql

//因为是普通sql,所以在navicat也能运行,调试sql可以直接在navicat中调试

String sql = "select ST_AsText(smgeometry) as wkt" +

" from " + layerName + " t " +

//查询条件,以下写法意思是查询面图层中与点(点坐标值就是x,y变量)相交的面

//其中ST_Intersects是相交的判断函数,参数是两个几何对象,第一个t.smgeometry代表本表的几何对象

//第二个ST_PointFromText('POINT(" + x + " " + y + ")', " + srid + "),这里使用了ST_PointFromText函数通过xy坐标值构建点的几何对象,其中srid是直接使用了图层的srid

//关于srid:所以空间对象,例如图层和几何对象,都有坐标系(也可叫做空间参考),srid就代表坐标系

//在空间查询,一般来说,被查询的图层和作为查询条件的几何对象的坐标系要统一,否则很可能出错或造成查询结果不对

//ST_Intersects的详细描述请看api

"where ST_Intersects(t.smgeometry,ST_PointFromText('POINT(" + x + " " + y + ")', " + srid + ")) = true";

//查询代码,跟jdbc一样的用法

PreparedStatement pst = null;

ResultSet rs = null;

try {

pst = conn.prepareStatement(sql);

//执行查询

rs = pst.executeQuery();

//while循环变量查询结果

while (rs.next()) {

//通过字段索引获取字段值,注意:索引从1开始!!!!

//获取几何对象,wkt格式

//wkt格式既可以构建几何对象(如何构建后面有说),也可以输出到前端供前端使用

String wkt = rs.getString(1);

}

} finally {

//关闭连接,清除各种对象

DbUtils.closeQuietly(conn, pst, rs);

}

}

/**

* 空间查询,点缓冲区查询面图层

*

* @throws Exception

*/

private void pointBufferQueryPolygonLayer() throws Exception {

//空间查询,点缓冲区查询面图层

//图层名

//sde数据库带空间属性的表叫图层,因此图层跟表类似

String layerName = "polygon1";

//点以坐标形式存在

double x = 38821.471;

double y = 25274.206;

//缓冲半径

double bufferDistance = 100.0;

//获取默认数据库连接

Connection conn = JdbcConnConfigUtil.getDefaultConn();

//获取图层的srid

//srid代表图层的空间参考(也可以说是坐标系),sr=spatial reference

String srid = SdxUtil.getSridByTableName(conn, layerName, JdbcConnConfigUtil.getDefaultMapProperties());

conn = JdbcConnConfigUtil.getDefaultConn();

//查询使用的是sql,就是普通的sql

String sql = "select ST_AsText(smgeometry) as wkt" +

" from " + layerName + " t " +

//查询条件,以下写法意思是查询面图层中与点的缓冲区相交的面

//此方法常用于点击地图查询点和线,因为点击通常很难绝对点中点和线,所有要加一个小小的缓冲范围

//ST_Buffer是构建缓冲区的意思,在此例中是对点对象建立半径为xx(值在变量bufferDistance)的缓冲区,参数1是几何对象,参数2是缓冲半径

//ST_Buffer外部有select sde.ST_Buffer.... ,大家可能会觉得加这一步多余(实际上也不会影响查询结果)

//ST_Buffer的详细描述请看api

"where st_intersects(t.smgeometry,(select ST_Buffer(ST_PointFromText('POINT(" + x + " " + y + ")', " + srid + ")," + bufferDistance + "))) = true";

//查询代码,跟jdbc一样的用法

PreparedStatement pst = null;

ResultSet rs = null;

try {

pst = conn.prepareStatement(sql);

//执行查询

rs = pst.executeQuery();

//while循环变量查询结果

while (rs.next()) {

//通过字段索引获取字段值,注意:索引从1开始!!!!

//获取几何对象,wkt格式

//wkt格式既可以构建几何对象(如何构建后面有说),也可以输出到前端供前端使用

String wkt = rs.getString(1);

}

} finally {

//关闭连接,清除各种对象

DbUtils.closeQuietly(conn, pst, rs);

}

}

/**

* 空间查询,线查询面图层,也包括使用参数查询

*

* @throws Exception

*/

private void lineQueryPolygonLayer() throws Exception {

//空间查询,线查询面图层

//此demo中查询条件的线的格式是wkt,因此此demo同样适用于wkt格式的点线面作为查询条件

//图层名

//sde数据库带空间属性的表叫图层,因此图层跟表类似

String layerName = "polygon1";

//作为查询条件的线,wkt格式

String queryConditionWkt = "LINESTRING (38778.80641398 25400.74843392, 38829.229274779995 25320.265790719997, 38787.53344758 25269.35809472)";

//获取默认数据库连接

Connection conn = JdbcConnConfigUtil.getDefaultConn();

//获取图层的srid

//srid代表图层的空间参考(也可以说是坐标系),sr=spatial reference

String srid = SdxUtil.getSridByTableName(conn, layerName, JdbcConnConfigUtil.getDefaultMapProperties());

conn = JdbcConnConfigUtil.getDefaultConn();

//查询使用的是sql,就是普通的sql

String sql = "select st_astext(t.smgeometry) as wkt,t.f1" +

" from " + layerName + " t " +

//查询条件,以下写法意思是查询面图层中与线(不止线,同样可用于点和面)相交的面

//ST_GeomFromText是传入的值生成几何对象,此demo的值是wkt格式,实际不止支持wkt,详细可看api

//ST_GeomFromText第一个参数是问号(?)而不是具体的值,问号意思是参数化查询,把值用参数传入(如何传入参数下面有写),参数查询是jdbc的特性

//为何要用参数查询(而不是直接把值内容拼成string)?因为wkt的长度通常都很长,以本demo为例,一个点的字符串长度就有31,假设一条线有1000个点字符长度就是310000,sql语句会超长

//构建几何对象的函数还有ST_GeomFromWKB,ST_Polygon,ST_PolygonFromText等等,具体请看api

" where st_intersects(t.smgeometry,(select ST_GeomFromText(?," + srid + "))) = true" +

//字符型字段的参数查询例子(字符,整形,浮点型的参数化使用都比较简单,而且类似)

" and t.f1=?";

//查询代码,跟jdbc一样的用法

PreparedStatement pst = null;

ResultSet rs = null;

try {

pst = conn.prepareStatement(sql);

//wkt字符字段参数查询例子

pst.setString(1, queryConditionWkt);

//字符字段参数查询例子

pst.setString(2, "面2");

//执行查询

rs = pst.executeQuery();

//while循环变量查询结果

while (rs.next()) {

//通过字段索引获取字段值,注意:索引从1开始!!!!

//获取几何对象,wkt格式

//wkt格式既可以构建几何对象(如何构建后面有说),也可以输出到前端供前端使用

String wkt = rs.getString(1);

String f1 = rs.getString(2);

}

} finally {

//关闭连接,清除各种对象

DbUtils.closeQuietly(conn, pst, rs);

}

}

supermap mysql_超图supermap sdx数据库用sql实现空间查询相关推荐

  1. 【小白学数据库】SQL批量模糊查询

    当你需要在一个表中查询包含多个关键词的所有数据,可以使用以下SQL语句: SELECT * FROM tablename WHERE column1 LIKE '%关键词1%' OR column L ...

  2. db2 删除存储过程_数据库教程-SQL Server存储过程使用及异常处理

    SQL Server存储过程 存储过程(Procedure)是数据库重要对象之一,也是数据库学习的重点之一.本文,我们以SQL Server为例对存储过程的概念.定义.调用.删除及存储过程调用异常等通 ...

  3. Mysql 数据库 -------- SQL语句进阶查询 ------- 后部分

    Mysql ---- SQL高级查询 连接查询 内连接 外连接 数据库函数 数学函数 聚合函数(给数据表用的) 字符串函数(字符串用''格式) 日期时间函数 存储过程 创建存储过程 创建存储过程中的传 ...

  4. SuperMap GIS基础软件中数据库使用指南

    作者:Carlo 一.支持的主流数据库类型 1.主流数据库介绍 数据库名称 版本 不支持的数据集类型 需要配置 客户端 支持工作空间 支持集群模式 SQLPlus 2008/2012/2016/201 ...

  5. 将Excel文件数据库导入SQL Server

    将Excel文件数据库导入SQL Server的三种方案//方案一: 通过OleDB方式获取Excel文件的数据,然后通过DataSet中转到SQL Server openFileDialog = n ...

  6. JetBrains发布DataGrip 1.0——数据库与SQL领域中的瑞士军刀

    近日,来自捷克的软件公司JetBrains发布了全新的重量级产品DataGrip 1.0--号称数据库与SQL领域中的瑞士军刀.DataGrip的前身0xDBE已经发布一年多的时间了,这也是JetBr ...

  7. R语言构建仿真数据库(sqlite)并使用dplyr语法和SQL语法查询数据库、将dplyr语法查询语句翻译为SQL查询语句

    R语言构建仿真数据库(sqlite)并使用dplyr语法和SQL语法查询数据库.将dplyr语法查询语句翻译为SQL查询语句 目录

  8. mysql2005备份_创建完整数据库备份 - SQL Server | Microsoft Docs

    完整数据库备份Create a Full Database Backup 09/12/2019 本文内容 适用于:Applies to: SQL ServerSQL Server(所有支持的版本)SQ ...

  9. 应用程序的数据库从Sql Server迁移到Oracle

    应用程序的数据库从Sql Server迁移到Oracle 迁移案例一:数据库: Sql Server 2008到Oracle 9i 工具: Sybase PowerDesiner 12 试用版, PL ...

最新文章

  1. Rocksdb 的优秀代码(三)-- 工业级 线程池实现分享
  2. 使用Action启动/关闭Service
  3. win7 绿色版MySQL安装与配置
  4. PingingLab传世经典系列《CCNA完全配置宝典》-2.7 EIGRP基本配置
  5. 实体类blob类型_Mysql的数据类型和JPA的实体类
  6. [ ERROR ] Can not init Myriad device: NC_ERROR
  7. 大佬写的orm框架,mark一下稍后阅读
  8. 链家大数据多维分析引擎实践
  9. ubuntu16.04 安装cuda9.0+cudnn7.0.5+tensorflow+nvidia-docker配置GPU服务
  10. Windows 7 With SP1 MSDN版 含简体中文版
  11. 百度长语音识别免费开放 大幅提升语音转写效率
  12. Eclipse中使用google代码风格
  13. Java计算加权平均成绩
  14. k8s命令对node调度 cordon,drain,delete 区别
  15. SQL查询结果四舍五入的方法
  16. Brave浏览器或许是你打开元宇宙的正确方式
  17. 在IDEA中给项目同时配置git和svn
  18. 一条命令导出电脑中所有wifi账号密码
  19. 解决ubuntu下kazam录制视频无法在windows播放问题
  20. bzoj1415 聪聪与可可 概率dp

热门文章

  1. 微信不显示王者荣耀连接服务器,王者荣耀省级不显示,王者荣耀不用微信怎么登录...
  2. SQL/MYSQL在CMD命令操作符中创建数据库 、表单并插入数据查看
  3. rabbitMQ的使用概述及使用rabbitMQ进行短信验证码发送案例
  4. r语言echarts画箱线图_echarter: Echarts的R语言接口
  5. Android中PopupWindow遮罩层的设置
  6. 无人值守u盘安装linux,U盘无人值守安装Linux操作系统
  7. win7修改网络计算机名字,Win7系统中不能修改计算机名字是怎么回事?
  8. 电脑快捷修改计算机名
  9. 毕业设计-基于微信小程序的图书馆咨询服务系统
  10. 大学毕业4年-回顾和总结 10 -资金账务系统的架构设计(产品视角+技术视角)(图文并茂)