Oracle查询多边形对象SDO_GEOMETRY并转换为java对象举例
最近实现了一个判断点是否与多边形交互的功能,这里的点是一个经纬度,多边形是一个区域,包含多个经纬度,最后看下这个点是否在这个区域内。就好比你打开百度地图,然后看你自己的位置(点)是不是在某个小区(多边形)里。在Oracle里几何对象用的是MDSYS的SDO_GEOMETRY类型,第一次碰到这种数据类型,先看下定义
SQL> desc MDSYS.SDO_GEOMETRY;
Element Type
------------- -------------------------
SDO_GTYPE NUMBER
SDO_SRID NUMBER
SDO_POINT MDSYS.SDO_POINT_TYPE
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY
GET_GTYPE FUNCTION
GET_DIMS FUNCTION
GET_LRS_DIM FUNCTION
GET_WKB FUNCTION
GET_WKT FUNCTION
ST_COORDDIM FUNCTION
ST_ISVALID FUNCTION
SDO_GEOMETRY FUNCTION
这里不细讲这个数据类型,我们只需要知道我这里有张表里包含了这种类型的字段
create table GRID
(
ID VARCHAR2(),
NAME VARCHAR2(),
INSERT_TIME DATE,
LOCA_TION MDSYS.SDO_GEOMETRY
)
现在我需要查loca_tiom字段值,得到多边形的数据,我们试试直接查这个字段
SQL> select loca_tion from grid where rownum < ; LOCA_TION
---------
<Object>
<Object>
<Object>
<Object>
<Object>
<Object>
<Object>
<Object>
<Object> rows selected
查不到,因为SDO_GEOMETRY是一种定义出来的数据类型,所以是一个对象。再试试用oracle自带的工具包方法
SQL> select to_char(sdo_util.to_gmlgeometry(loca_tion)) from i2_grid_info_cur where rownum < ; TO_CHAR(SDO_UTIL.TO_GMLGEOMETR
--------------------------------------------------------------------------------
<gml:Polygon srsName="SDO:8307" xmlns:gml="http://www.opengis.net/gml"><gml:oute
<gml:Polygon srsName="SDO:8307" xmlns:gml="http://www.opengis.net/gml"><gml:oute
<gml:Polygon srsName="SDO:8307" xmlns:gml="http://www.opengis.net/gml"><gml:oute
<gml:Polygon srsName="SDO:8307" xmlns:gml="http://www.opengis.net/gml"><gml:oute
<gml:Polygon srsName="SDO:8307" xmlns:gml="http://www.opengis.net/gml"><gml:oute
<gml:Polygon srsName="SDO:8307" xmlns:gml="http://www.opengis.net/gml"><gml:oute
<gml:Polygon srsName="SDO:8307" xmlns:gml="http://www.opengis.net/gml"><gml:oute
<gml:Polygon srsName="SDO:8307" xmlns:gml="http://www.opengis.net/gml"><gml:oute
<gml:Polygon srsName="SDO:8307" xmlns:gml="http://www.opengis.net/gml"><gml:oute rows selected
这时可以查到了,但得到的是一个定义元数据的类似xml文本,这种格式叫GML。我们需要解析这个文本才行,这也不是我们想要的。接着用另一个工具方法
SQL> select ID, t.x LONGITUDE, t.y LATITUDE from I2_GRID_INFO_CUR,table (sdo_util.getvertices(LOCA_TION)) t where rownum < ; ID LONGITUDE LATITUDE
-------------------------------- ---------- ----------
W_12101_1267 120.020046 30.0552959
W_12101_1267 120.025472 30.0546780
W_12101_1267 120.037507 30.0530230
W_12101_1267 120.033047 30.0475079
W_12101_1267 120.032709 30.0457979
W_12101_1267 120.020461 30.0510129
W_12101_1267 120.020046 30.0552959
W_12101_1269 120.371666 30.3074470
W_12101_1269 120.371691 30.3048049 rows selected
这次我们查到了数据,得到的是对象的点坐标,同一个ID存在多个经纬度点,我们的数据是分开的,这种情况我们可以在代码里处理一下进行合并。但其实是可以直接得到我们想要的数据的,最终方法
SQL> select ID,to_char(sdo_util.to_wktgeometry(loca_tion)) as LOACTION from i2_grid_info_cur where rownum < ; ID LOACTION
-------------------------------- --------------------------------------------------------------------------------
W_12101_1267 POLYGON ((120.02004612 30.0552959680001, 120.02547204 30.054678073, 120.03750792
W_12101_1269 POLYGON ((120.37166604 30.307447059, 120.37169196 30.3048049230001, 120.36850092
W_12101_1270 POLYGON ((120.17660796 30.3214770650001, 120.178233 30.3194360100001, 120.178289
W_12101_1272 POLYGON ((120.19454784 30.1169789890001, 120.19940208 30.117213007, 120.19855212
W_12101_1273 POLYGON ((119.93450904 30.273637046, 119.93518188 30.2715850450001, 119.93440284
W_12101_1792 POLYGON ((120.29597712 30.4123550300001, 120.29666004 30.411310928, 120.29740704
W_12101_1797 POLYGON ((120.38929884 30.3079359440001, 120.38813208 30.3047020450001, 120.3824
W_12101_1801 POLYGON ((120.174912 30.1599599400001, 120.17404008 30.158240961, 120.17396988
W_12101_1804 POLYGON ((120.29777388 30.43979804, 120.29884488 30.4400100280001, 120.29911308 rows selected
它已经帮我们格式化成wkt文本了,可以直接拿去转换成java的Geometry对象
GeometryFactory geometryFactory = new GeometryFactory();
WKTReader wktReader = new WKTReader(geometryFactory);
Geometry circleG = wktReader.read(circleRule);
这里需要注意下,如果POLYGON里第一个点和最后一个点不相等,那么说明这个多边形不是闭环,数据是有问题的,上面的read方法将抛出IllegalArgumentException异常。
Oracle查询多边形对象SDO_GEOMETRY并转换为java对象举例的更多相关文章
- JSon_零基础_007_将JSon格式的"数组"字符串转换为Java对象"数组"
将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“n ...
- JSon_零基础_006_将JSon格式的字符串转换为Java对象
需求: 将JSon格式的字符串转换为Java对象. 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, 通过get(key ...
- Json字符串转换为java对象的各种实现方法【json_lib框架、Gson、org.json】
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mengzhengbin520.blog.51cto.com/7590564/12 ...
- 如何让Spring MVC接收的参数可以转换为java对象
场景: web.xml中增加了一个DispatcherServlet配置,并在同级目录下添加了**-servlert.xml文件,搭建起了一个spring mvc的restful访问接口. 问题描述: ...
- 记一次 Json 对象转换为 Java 对象的问题
1.描述 最近在使用 Jackson 将 Json 串转换回 Java 对象的时候遇到了 ClassCastException 错误,特此记述. 2.问题复现 问题出现的节点在于属性节点的 JavaT ...
- jsp九大内置对象与servlet中java对象
jsp九大内置对象 request对象 : getParameter(String name)获取表单提交的数据 getParamegerNames() 获取客户端提交的所有参数名 getAttri ...
- 将Map转换为Java 对象
public class MapUtil { public static Object convert2Object(Class clazz,Map<String,Object[]> ma ...
- Json:Java对象和Json文本转换工具类
Json 是一个用于 Java 对象 和 Json 文本 相互转换的工具类. 安装 下载源码 git clone https://github.com/njdi/durian.git 编译源码 cd ...
- cassandra 数据到Java对象的映射绑定
类似Hibernate和MyBatis的关系映射,自动帮你将查询数据或是修改的参数进行数据映射和绑定. 支持查询后返回数据ResultSet到Java对象的映射,支持修改.删除.查询之前参数的绑定. ...
随机推荐
- 为JAXB和response设置编码,解决wechat4j中文乱码
如果有哪一个做程序员的小伙伴说自己没有遇到中文乱码问题,我是不愿意相信的.今天在做微信订阅号的智能回复时,又一时迷乱的跳进了中文乱码这个火坑.刚解决问题时,都欢呼雀跃了,完全忘记了她曾经带给我的痛苦. ...
- data augmentation 总结
data augmentation 几种方法总结 在深度学习中,有的时候训练集不够多,或者某一类数据较少,或者为了防止过拟合,让模型更加鲁棒性,data augmentation是一个不错的选择. 常 ...
- 自然语言处理中的语言模型预训练方法(ELMo、GPT和BERT)
自然语言处理中的语言模型预训练方法(ELMo.GPT和BERT) 最近,在自然语言处理(NLP)领域中,使用语言模型预训练方法在多项NLP任务上都获得了不错的提升,广泛受到了各界的关注.就此,我将最近 ...
- java.lang.IllegalArgumentException异常处理的一种方法
我遇到的问题 用spring注解来加载bean,都是一个简单的了,但是还是报了这样一个错java.lang.IllegalArgumentException 网上查了一下,说是jdk版本要1.7的,然 ...
- Oracle闪回机制
最近学习oracle的时候,无意中看到oracle的闪回技术flashback,原来oracle在delete数据或者drop的时候,不是直接删除,而是跟windows一样,先把数据放入到回收站中. ...
- LeetCode第[22]题(Java):Generate Parentheses
题目:制造括号序列 难度:Medium 题目内容: Given n pairs of parentheses, write a function to generate all combination ...
- 关于绑定的C#代码+转换器
BindingOperations.SetBinding( exp, Expander.IsExpandedProperty, new Bi ...
- angular之 $watch 和$digest 和$apply和$observe的区别
$watch 代表的就是对数据源的监听,当数据源发生变化,就会触发第二个参数的回调函数 $digest 代表触发一个数据源变化的事件 $apply 代表对于$digest的一个封装,他多了一个参数 . ...
- Java8_00_资源帖
一.官方资料 Java Platform Standard Edition 8 Documentation The Java™ Tutorials Java 8 API 二.精选资料 三.参考资料
- 【git】新建一个git仓库的方法
1.在github上登陆,新建一个远程仓库 2.在本地创建仓库 3.本地仓库关联到远程仓库 git remote add origin(仓库名) git@github.com:yesuuu/test. ...