最近实现了一个判断点是否与多边形交互的功能,这里的点是一个经纬度,多边形是一个区域,包含多个经纬度,最后看下这个点是否在这个区域内。就好比你打开百度地图,然后看你自己的位置(点)是不是在某个小区(多边形)里。在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对象举例的更多相关文章

  1. JSon_零基础_007_将JSon格式的"数组"字符串转换为Java对象"数组"

    将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“n ...

  2. JSon_零基础_006_将JSon格式的字符串转换为Java对象

    需求: 将JSon格式的字符串转换为Java对象. 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, 通过get(key ...

  3. Json字符串转换为java对象的各种实现方法【json_lib框架、Gson、org.json】

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mengzhengbin520.blog.51cto.com/7590564/12 ...

  4. 如何让Spring MVC接收的参数可以转换为java对象

    场景: web.xml中增加了一个DispatcherServlet配置,并在同级目录下添加了**-servlert.xml文件,搭建起了一个spring mvc的restful访问接口. 问题描述: ...

  5. 记一次 Json 对象转换为 Java 对象的问题

    1.描述 最近在使用 Jackson 将 Json 串转换回 Java 对象的时候遇到了 ClassCastException 错误,特此记述. 2.问题复现 问题出现的节点在于属性节点的 JavaT ...

  6. jsp九大内置对象与servlet中java对象

    jsp九大内置对象 request对象 :  getParameter(String name)获取表单提交的数据 getParamegerNames() 获取客户端提交的所有参数名 getAttri ...

  7. 将Map转换为Java 对象

    public class MapUtil { public static Object convert2Object(Class clazz,Map<String,Object[]> ma ...

  8. Json:Java对象和Json文本转换工具类

    Json 是一个用于 Java 对象 和 Json 文本 相互转换的工具类. 安装 下载源码 git clone https://github.com/njdi/durian.git 编译源码 cd ...

  9. cassandra 数据到Java对象的映射绑定

    类似Hibernate和MyBatis的关系映射,自动帮你将查询数据或是修改的参数进行数据映射和绑定. 支持查询后返回数据ResultSet到Java对象的映射,支持修改.删除.查询之前参数的绑定. ...

随机推荐

  1. pexpect的pxssh类实现远程操作

    #!/usr/bin/pythonimport pexpectfrom pexpect import pxssh import getpasstry: s=pxssh.pxssh() hostname ...

  2. Python学习(二)——深度学习入门介绍

    课程二:深度学习入门 讲师:David (数据分析工程师) 这门课主要介绍了很多神经网络的基本原理,非常非常基础的了解. 零.思维导图预览:                一.深度神经网络 1.神经元 ...

  3. Hystrix工作流程图

  4. Java 正则表达式 Pattern & Matcher

    通常会有这种需求: 在文档中搜索有规律的字符串,然后进行统计或者替换.Java.util.regex包下的Pattern和Matcher这两个类提供了通过正则表达式来匹配查询,甚至替换的功能.那么我们 ...

  5. FckEditor 配置手册中文教程详细说明

    http://www.jb51.net/article/17965.htm 首先,FCKEDITOR的性能是非常好的,用户只需很少的时间就可以载入 FCKEDITOR所需文件.对于其他在线编辑器来说, ...

  6. Pow,求x的y次幂

    算法分析:很显然用递归.但是直接用递归会造成栈溢出,时间复杂度是o(n).所以要用分治思想,时间复杂度是o(logN). public class Power { //栈溢出,时间复杂度是o(n) p ...

  7. 51nod 1119 组合数,逆元

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119 1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:13 ...

  8. serialVersionUID 作用

    一个类在序列化时,用来记录当前类的版本号.在反序列化时,首先获取当前类的版本号,不一致则报异常. 若版本号一致,但两个类不一致.写肯定全部写进去.但提取时 类若没有这个字段,则不提取.若提取类多个字段 ...

  9. elasticsearch负载均衡节点——客户端节点 node.master: false node.data: false 其他配置和master 数据节点一样

    elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参 数搭配使用时,能够帮助提供服务器性能. 数据节点node.master: false node. ...

  10. Prism开发人员指南5-WPF开发 Developer's Guide to Microsoft Prism Library 5.0 for WPF (英汉对照版)

    April 2014 2014四月   Prism provides guidance in the form of samples and documentation that help you e ...