博客目录

  • 前言
  • 问题分析
  • 第一种 :Oracle函数:
  • 第二种 :采用Oracle SAO API 将数据库空间类型转为 JGeometry类型
  • 代码实现
  • 引入依赖
  • 数据源配置
  • 导入jar包
  • 实体类
  • Dao与数据库连接层
  • Dao实现类
  • service 接口
  • service 实现类
  • Controller层
  • 解决方式二
  • 总结


前言

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中添加引入依赖

mysql 经纬度 DECIMAL 经纬度字段_bc

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!";
    }

查询结果

mysql 经纬度 DECIMAL 经纬度字段_java_02

解决方式二

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

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

查询结果

mysql 经纬度 DECIMAL 经纬度字段_java_03


用mybatis查询定义一个list接收,或者定义一个实体类 有x 和 y字段 接收,都非常简单!!!

总结

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