前些年的文章中介绍过如何在Eclipse里来通过传统的方式引用SuperMap iObjects Java进行开发。这种方式作为对SuperMap iObjects Java的入门级开发或者简单的测试是可以的。一旦放到大规模的开发生产环境下,这种方式就显得笨拙不便了。需要将大量无用的iObjects Java的组件包引入工程里,并且一旦需要对依赖的iObjects Java的版本进行变更,又得重头来一遍。
伴随着SpringBoot框架的兴起,可否通过SpringBoot来快速对iObjects Java进行集成和打包哪?答案是肯定的。
首先创建一个标准的SpringBoot项目,这里以Eclipse为例来进行示范。创建好SpringBoot工程的的pom.xml文件内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.supermap.springboot</groupId>
<artifactId>testiobjectsjava</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
此时是一个标准的SpringBoot工程。
下面就开始加入对iObjectsJava的引用。
在引入之前首先需要做一些准备。因为在公有仓库里还没发现有人上传过iObjects Java相关的组件包,所以就得自己动手制作本地的iObjects Java私有镜像仓库。
私有镜像仓库中的groupId和artifactId的命名方式需按照Maven的规则来命名。比如,对于iObjectsJava包中的组件com.supermap.data.jar,需要首先为其在本地仓库里创建如下目录,再将jar包拷贝到新创建的目录中,并将文件重命名为objects-data-{版本号}.jar:

其他组件包也可以按照上述方式进行生成。需要说明的是:“objects-data-{版本号}.jar”中前半部分的“objects-data”的名称可以自由命名,原则上只要自己能区分即可,但是后面的“{版本号}”部分必须严格按照iObjectsJava的实际版本号来命名,否则有可能会对组件的某些特性进行误判。
下一步就可以在开发环境中引入本地仓库中的iObjectJava组件了,如下图所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.supermap.springboot</groupId>
<artifactId>testiobjectsjava</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<supermap.version>9.1.0.16527</supermap.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 引入SuperMap Objects Java的Data模块 -->
<dependency>
<groupId>com.supermap.objects</groupId>
<artifactId>objects-data</artifactId>
<version>${supermap.version}</version>
</dependency>
</dependencies>
</project>
建议统一在properties节点下定义iObjectsJava的版本号,这样对于后续引入其他组件会带来很大的便利。
下面来创建一个用于进行查询的业务层(business)接口类IDataQueryService:
package com.supermap.springboot.service;
public interface IDataQueryService {
/**
* 对数据进行空间查询
* @param strRegionCoords 空间范围坐标字符串
* @return
*/
String spacialQuery(String strRegionCoords);
}
并编写实现类CDataQueryServiceImpl:
package com.supermap.springboot.service.impl;
import com.supermap.data.DatasetVector;
import com.supermap.data.Datasource;
import com.supermap.data.DatasourceConnectionInfo;
import com.supermap.data.EngineType;
import com.supermap.data.GeoRegion;
import com.supermap.data.Point2D;
import com.supermap.data.Point2Ds;
import com.supermap.data.QueryParameter;
import com.supermap.data.Recordset;
import com.supermap.data.SpatialQueryMode;
import com.supermap.data.Workspace;
import com.supermap.springboot.service.IDataQueryService;
@Service
public class CDataQueryServiceImpl implements IDataQueryService {
@Override
public String spacialQuery(String strRegionCoords) {
GeoRegion geoBounds = null;
if(strRegionCoords!=null&&strRegionCoords.length()>0) {
String[] arrBounds = strRegionCoords.split(";");
try {
geoBounds = new GeoRegion();
Point2Ds points = new Point2Ds();
for (int j = 0; j < arrBounds.length; j++) {
String strPoint = arrBounds[j];
Double SmX = Double.parseDouble(strPoint.split(",")[0]);
Double SmY = Double.parseDouble(strPoint.split(",")[1]);
Point2D point = new Point2D();
point.setX(SmX);
point.setY(SmY);
points.add(point);
}
geoBounds.addPart(points);
} catch (Exception e) {
}
}else
return null;
Workspace ws = new Workspace();
DatasourceConnectionInfo dsInfo = new DatasourceConnectionInfo();
dsInfo.setEngineType(EngineType.UDB);
dsInfo.setServer("E:\\SuperMap\\10i\\supermap-iobjectsjava-10.1.2-19530-86195-win-all\\SampleData\\World\\World.udb");
Datasource dataSource = ws.getDatasources().open(dsInfo);
DatasetVector datasetVector = (DatasetVector) dataSource.getDatasets().get("World");
QueryParameter queryParameter = new QueryParameter(); // 构造查询参数对象
if (geoBounds != null) {
queryParameter.setSpatialQueryMode(SpatialQueryMode.INTERSECT);
queryParameter.setSpatialQueryObject(geoBounds);
}
Recordset recordset = datasetVector.query(queryParameter); // 执行查询
System.out.println("共查到"+recordset.getRecordCount()+"个国家!");
String strResult = "{\"count\":" + recordset.getRecordCount() + "}";
datasetVector.close(); //用完了记着关闭数据集
recordset.close(); //用完了记着关闭查询结果集
dataSource.close(); //用完了记着关闭数据源
ws.close(); //用完了记着关闭工作空间
return strResult;
}
}
可以看到,此时所引用的所有的SuperMap的类全部可以识别了。
现在编写Controller调用该接口:
package com.supermap.springboot.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.supermap.springboot.service.IDataQueryService;
@RestController
public class CQueryController {
@Autowired
IDataQueryService iDataQueryService;
@RequestMapping("/spacialquery")
public String spacialQuery(@RequestParam(name="bounds") String strBounds) {
String strResult = iDataQueryService.spacialQuery(strBounds);
return strResult;
}
}
好了,所有的代码编写完毕,在启动前千万要记住要将iObjectsJava的bin目录添加到环境变量path的最前面。添加完毕后重启eclipse后就可以启动工程了:

启动过程顺利。在浏览器里访问地址进行测试:

OK,搞定!
但是这里又有一个疑问:能否在正式的部署环境下像iServer一样不配置环境变量就可以成功启动项目?在翻阅了iServer的启动脚本后,特定制了如下的方法:
首先将iObjectsJava文件夹和所依赖的JRE像iServer一样放到jar包所在的目录下的support子目录里。并编写项目启动文件:
set APP_ROOT=%cd%
set "UGO_HOME=%APP_ROOT%\support\objectsjava"
set "JAVA_HOME=%APP_ROOT%\support\jre8"
set Path=%UGO_HOME%\bin;%UGO_HOME%\third_lib;%JAVA_HOME%\bin;%Path%
java -jar app-0.0.1-SNAPSHOT.jar
这样就可以像iServer一样直接拷贝项目的文件夹后就可以直接启动了。
源码请单击下载。

本文介绍了如何在SpringBoot项目中高效地集成和管理SuperMap iObjectsJava组件,通过创建本地Maven仓库,避免了传统方式的繁琐步骤。详细展示了从创建SpringBoot工程、引入iObjectsJava依赖,到编写业务代码和测试的全过程,实现了空间数据查询功能。
3710





