如何通过SpringBoot及Maven来集成SuperMap iObjects Java进行开发

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

前些年的文章中介绍过如何在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一样直接拷贝项目的文件夹后就可以直接启动了。

源码请单击下载

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值