Autor: Ying
Tabla de contenido
1. Antecedentes
SuperMap iObjects Java
Es una plataforma de desarrollo GIS basada en componentes para desarrolladores de sistemas de aplicaciones GIS. Tiene una potente gestión de datos geográficos, edición, visualización, análisis y otras funciones, y tiene una gran facilidad de uso y abundantes recursos de ayuda, adecuados para el desarrollo rápido de sistemas de aplicaciones GIS a gran escala.
Este artículo presenta principalmente cómo usar SuperMap iObjects Java
componentes como base funcional y combinar el marco de trabajo de código abierto SpringBoot para crear rápidamente servicios de fondo GIS.
2. Preparación del entorno
2.1 Entorno del sistema
Sistema operativo | apoyo | ilustrar |
---|---|---|
ventanas | ✔ | Requisitos de configuración de hardware recomendados para la plataforma Windows: Procesador: superior a 2,00 GHz Requisitos de memoria: 2 GB Capacidad del disco duro: 100 GB |
linux | ✔ | Requisitos mínimos de hardware para la plataforma Linux: CPU: 1,00 GHz (arquitectura x86) Memoria: 512 MB Espacio en disco duro: 40 GB |
2.2 Entorno de desarrollo
software | Versión | enlace de descarga | ilustrar |
---|---|---|---|
iObjetos Java | 10i y superior | Dirección de descarga de iObjects Java | SuperMap proporciona oficialmente el almacén Maven del componente Java de iObjects , que se puede utilizar directamente |
IDEA | 2020.3.4 y superior | Dirección de descarga de IDEA | |
SpringBoot | 2.7.x | * | IDEA puede seleccionar directamente la versión requerida al crear un nuevo proyecto SpringBoot |
Pavonearse | 3.0.0 | * | Configurado en el archivo pom.xml del proyecto SpringBoot |
3. Pila de tecnología
3.1. Supermapa iObjects Java
Los componentes Java de SuperMap iObjects proporcionan funciones GIS profesionales para servicios en segundo plano.
3.2. SpringBoot
SpringBoot es un marco para que los desarrolladores desarrollen rápidamente servicios en segundo plano de Java.
3.3. Pavonearse
Swagger es un documento de interfaz RESTFUL en línea de generación automática + software de función de prueba funcional.Después de que SpringBoot integre Swagger, los desarrolladores y usuarios de servicios pueden utilizarlo para aprender y probar las interfaces de servicio.
4. Cree un nuevo proyecto SpringBoot
-
IDEA crea un nuevo proyecto SpringBoot
-
Configurar Maven y proyectar la versión de Java
-
Configurar módulos dependientes de SpringBoot
5. Configurar el módulo Swagger
springfox-boot-starter es una biblioteca SpringBoot que brinda a las aplicaciones Spring la capacidad de crear documentación de Swagger de forma rápida y sencilla. La documentación de Swagger puede ayudar a los desarrolladores a comprender y utilizar mejor las API RESTful.
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
-
Modificar la configuración del archivo application.properties
Dado que la estrategia de coincidencia de ruta predeterminada de la versión SpringBoot 2.7.x es que
path-pattern-matcher
después de que el proyecto SpringBoot actual integre Swagger 3.0.0, si el programa de servicio se ejecuta directamente, se generará la excepción "Failed to start bean 'documentationPluginsBootstrapper'; excepción anidada..." , por lo que se debe agregar la siguiente configuración al archivo application.properties para modificar la estrategia de coincidencia de ruta:spring.mvc.pathmatch.matching-strategy=ant_path_matcher
6. Configure los componentes Java de SuperMap iObjects
SuperMap proporciona oficialmente el almacén supermap-maven (https://maven.supermap.io) , que contiene SuperMap iServer, SuperMap iObjects y otros Jars relacionados y bibliotecas de terceros dependientes. Al agregar la biblioteca oficial de SuperMap en el archivo pom, los usuarios pueden agregar directamente las bibliotecas utilizadas en el desarrollo y sus dependencias al proyecto maven, lo cual es conveniente para que los usuarios resuelvan problemas como la falta de dependencias al usar la biblioteca oficial de SuperMap.
-
Agregue el almacén remoto SuperMap Maven
Agregue el nodo de repositorio SuperMap Maven en el pom.xml del proyecto SpringBoot.
<repositories> <repository> <id>supermap</id> <url>https://maven.supermap.io/</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> </repositories>
-
Agregue la dependencia de SuperMap iObjects Java
Agregue dependencias de componentes en pom.xml del proyecto SpringBoot
SuperMap iObjects Java
y agregue dependencias com.supermap.data de la siguiente manera.<dependency> <groupId>com.supermap</groupId> <artifactId>com.supermap.data</artifactId> <version>11.0.1-21501-98146</version> </dependency>
-
Configurar las variables de entorno del componente Java de iObjects
Dado que
SuperMap iObjects Java
la función GIS central del componente se implementa en base a C++ y luego se invoca a través de JNI, solo agregar el paquete jar del componente iObjects Java dependiente a través de Maven provocará la falta de bibliotecas dependientes de C++ Por lo tanto, es necesario configurar el entorno dependiente del componente iObjects Java en la máquina del entorno de desarrollo.Sistema operativo Configurar variables de entorno ventanas Agregue el directorio de instalación de SuperMap iObjects Java\Bin ruta a la variable de entorno del sistema PATH linux export LD_LIBRARY_PATH=Directorio de instalación de SuperMap iObjects Java\Bin export PATH=$LD_LIBRARY_PATH:$PATH
7. Realización de funciones GIS
En el proyecto SpringBoot donde se agregaron las dependencias del componente Java de iObjects, las funciones comerciales GIS requeridas por el proyecto se pueden implementar directamente en el marco SpringBoot en función de las funciones principales GIS proporcionadas por el componente Java de iObjects. A continuación, se toma como ejemplo un código de implementación de un servicio de datos simple.
-
Crear un nuevo controlador de servicios de datos (DataServiceController)
@Api(tags = "数据服务") @RestController @RequestMapping("/data") public class DataServiceController { }
-
espacio de trabajo abierto
@Operation(summary = "打开工作空间", description = "打开文件型工作空间") @ApiImplicitParams({ @ApiImplicitParam(name = "workspacePath", value = "文件型工作空间路径", dataType = "String", dataTypeClass = String.class) }) @GetMapping("/openWorkspace") public boolean openWorkspace(String workspacePath) { if (workspace != null) { workspace.close(); workspace.dispose(); workspace = null; } File file = new File(workspacePath); String workspaceName = file.getName(); String[] splitted = workspaceName.split("\\."); workspaceName = ""; for (int i = 0; i < splitted.length - 1; i++) { workspaceName = workspaceName.concat(splitted[i]); if (i < splitted.length - 2) { workspaceName = workspaceName.concat("."); } } WorkspaceConnectionInfo workspaceConnectionInfo = new WorkspaceConnectionInfo(workspacePath); workspaceConnectionInfo.setName(workspaceName); workspace = new Workspace(); return workspace.open(workspaceConnectionInfo); }
-
Obtener una lista de nombres de fuentes de datos
@Operation(summary = "获取数据源列表", description = "获取当前工作空间内的数据源列表") @GetMapping("/getDatasourceNames") public ArrayList<String> getDatasourceNames() { ArrayList<String> datasourceNames = new ArrayList<>(); if (workspace != null) { Datasources datasources = workspace.getDatasources(); for (int i = 0; i < datasources.getCount(); i++) { Datasource datasource = datasources.get(i); String datasourceAlias = datasource.getAlias(); datasourceNames.add(datasourceAlias); } } return datasourceNames; }
-
Obtener una lista de nombres de conjuntos de datos
@Operation(summary = "获取数据集名称列表", description = "根据输入的数据源名称获取数据集名称列表") @ApiImplicitParams({ @ApiImplicitParam(name = "datasourceName", value = "数据源名称", dataType = "String", dataTypeClass = String.class) }) @GetMapping("/getDatasetNames") public ArrayList<String> getDatasetNames(String datasourceName) { ArrayList<String> datasetNames = new ArrayList<>(); if (workspace != null) { Datasources datasources = workspace.getDatasources(); if (datasources.contains(datasourceName)) { Datasource datasource = datasources.get(datasourceName); Datasets datasets = datasource.getDatasets(); for (int i = 0; i < datasets.getCount(); i++) { Dataset dataset = datasets.get(i); datasetNames.add(dataset.getName()); } } } return datasetNames; }
-
Obtener los registros del conjunto de datos especificado
@Operation(summary = "获取指定数据集记录", description = "根据输入的数据源名称、数据集名称获取记录") @ApiImplicitParams({ @ApiImplicitParam(name = "datasourceName", value = "数据源名称", dataType = "String", dataTypeClass = String.class), @ApiImplicitParam(name = "datasetName", value = "数据集名称", dataType = "String", dataTypeClass = String.class) }) @GetMapping("/getRecordset") public JSONArray getRecordset(String datasourceName, String datasetName) { JSONArray jsonArray = new JSONArray(); if (workspace != null) { Datasources datasources = workspace.getDatasources(); if (datasources.contains(datasourceName)) { Datasource datasource = datasources.get(datasourceName); Datasets datasets = datasource.getDatasets(); if (datasets.contains(datasetName)) { Dataset dataset = datasets.get(datasetName); if (dataset instanceof DatasetVector) { DatasetVector datasetVector = (DatasetVector) dataset; Recordset recordset = datasetVector.getRecordset(false, CursorType.STATIC); FieldInfos fieldInfos = recordset.getFieldInfos(); for (int i = 0; i < recordset.getRecordCount(); i++) { recordset.moveTo(i); JSONObject subJsonObject = new JSONObject(); for (int j = 0; j < fieldInfos.getCount(); j++) { FieldInfo fieldInfo = fieldInfos.get(j); String fieldName = fieldInfo.getName(); Object fieldValue = recordset.getFieldValue(fieldName); if (fieldInfo.isSystemField() && fieldInfo.getType() == FieldType.LONGBINARY) { fieldValue = Toolkit.GeometryToGeoJson(recordset.getGeometry()); } subJsonObject.put(fieldName, fieldValue); } jsonArray.add(subJsonObject); } recordset.close(); recordset.dispose(); } } } } return jsonArray; }
8. Resumen
Después de desarrollar de acuerdo con el tutorial anterior, se puede realizar el servicio GIS que se muestra en la figura a continuación.
Además, este tutorial también proporciona el código de muestra del servicio en segundo plano GIS desarrollado de acuerdo con el tutorial anterior , o puede descargar directamente el código de muestra y compilarlo a través de Maven para ejecutarlo y depurarlo.