Java读取Oracle数据库空间字段获取经纬度信息实现方式之一

前言

Oracle空间数据类型为 MDSYS.SDO_GEOMETRY 这里就不过多赘述关于此类型的相关信息,想要了解更多关于此类型数据可以点击这 : Oracle Spatial空间类型. 这篇博客的目的查询空间数据,映射到Java实体类,并对空间数据的经纬度进行打印。

问题分析

目前Oracle查询空间数据的方式由很多种

第一种 :Oracle函数:
//此sql 返回wkt数据信息 

SELECT SDO_GEOMETRY.GET_WKT(THE_GEOM) FROM GIST_SHUIWEI;

//此sql 返回wkb二进制信息

SELECT SDO_GEOMETRY.GET_WKB(THE_GEOM) FROM GIST_SHUIWEI;

//此sql 返回gml数据
select  SDO_UTIL.TO_GMLGEOMETRY(THE_GEOM)  from   GIST_SHUIWEI;

虽然以上三种方式都能得到空间数据,但是解析起来难度教高。

第二种 :采用Oracle SAO API 将数据库空间类型转为 JGeometry类型

目前我采用的是这种方式 但是!!!最后我发现有更简单的方式。
这个方式需要使用的Oracle的sao api类库,个人亲测在pom中引入这个jar包的依赖,并不能使用,可能这个类库年代久远吧,需要jar的可以加我v lyf1208087904

代码实现

Demo 采用的是springboot+mybatis+jdbc+Oracle

引入依赖
<!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>



<!--saoapi-->

       	 <dependency>
            <groupId>toosl</groupId>
            <artifactId>test</artifactId>
            <version>1</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/resources/lib/sdoapi-1.0.jar</systemPath>
        </dependency>
<!--springboot-->
    	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--Oracle+mybatis-->

   		<dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.3</version>
        </dependency>
		<dependency>
		    <groupId>org.mybatis.spring.boot</groupId>
		    <artifactId>mybatis-spring-boot-starter</artifactId>
		    <version>1.2.0</version>
		</dependency>
数据源配置
spring:
  datasource:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@192.164.2.51:1521:oracle
    username: 
    password: 
    name: datasource

导入jar包

jar包放在resources目录下,新建lib目录,加进去,然后再pom中添加引入依赖
在这里插入图片描述


	groupId可以瞎写
	artifactId可以瞎写
	version可以瞎写
	其他两个跟我一样就可以
  		<dependency>
            <groupId>toosl</groupId>
            <artifactId>test</artifactId>
            <version>1</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/resources/lib/sdoapi-1.0.jar</systemPath>
        </dependency>
实体类

DemoModo.class



@Data //这个注解是lombok插件,代替set get方法的,如果想使用此插件再pom中引入依赖就可以了
/**
   <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
*/
public class spatialData {
    private JGeometry shape;

}
Dao与数据库连接层

DemoDao.interface


@Repository
public interface DemoDao{


    /**
     * 查询所有点的经纬度
     * @return
     */
    List<spatialData> selectLatAndLon(String tableName);




}
Dao实现类

DemoDaoImpl .class



@Repository
public class DemoDaoImpl implements DemoDao
 @Autowired
    private JdbcTemplate jdbcTemplate;
    
  @Override
    public List<DemoModo> selectLatAndLon(String tableName) {
        StringBuffer s = new StringBuffer("select THE_GEOM  from ");
        StringBuffer sql = s.append(tableName);
		//下边是Java新特性 拉姆达表达式
        return jdbcTemplate.query(sql.toString(), (rs,rowNum) -> {
            spatialData r = new spatialData();
            r.setShape(JGeometry.load((STRUCT)rs.getObject("THE_GEOM")));
            return r;
        });
    }




}
service 接口

DemoService



public interface DemoService {



    /**
    * @param
    * @Author: Unen_
    * @Date: 2020/6/12 15:55
    */
    void  selectSpatialData();

}

service 实现类
@Service
public class OracleServiceImpl implements OracleService  {

    @Autowired
    DemoDao demoDao;


   


    /**
     * 功能描述: 查询空间数据的经纬度
     * @param
     * @return: a
     * @Athor: Unen_
     * @Date: 2020/6/12 15:44
     */
    @Override
    public void selectSpatialData() {
        List<DemoModo> list = oracleMapperImple.selectLatAndLon("GIST_SHUIWEI");
        for (spatialData data : list) {
            JGeometry geometry = data.getShape();
            Point2D point = geometry.getJavaPoint();
            //这里就是经纬度信息
            System.out.println(point.getX()+"--"+point.getY());
        }
    }


}


Controller层

DemoController


@RestController
public class OracleController {


    @Autowired
 	DemoService demoService ;


    @RequestMapping("spatialData")
    public  String SpatialData(){
        demoService.selectSpatialData();
        return  "selectSpatialData!";
    }


查询结果
查询结果

解决方式二

上面有说到还有一种最简单的映射方式,我相信没有人不会的:

select c.THE_GEOM.SDO_POINT.X  AS X, c.THE_GEOM.SDO_POINT.Y AS Y from GIST_SHUIWEI c; 

查询结果

在这里插入图片描述
用mybatis查询定义一个list接收,或者定义一个实体类 有x 和 y字段 接收,都非常简单!!!

总结

解决问题的方式有很多种,选择很重要,写这个博客只为了记录当下解决问题的思路,如果能帮助到你那就更好了,希望不要搬运,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值