diff --git a/src/main/java/com/yj/earth/business/controller/GdalController.java b/src/main/java/com/yj/earth/business/controller/GdalController.java index ac41022..c3143eb 100644 --- a/src/main/java/com/yj/earth/business/controller/GdalController.java +++ b/src/main/java/com/yj/earth/business/controller/GdalController.java @@ -29,7 +29,7 @@ public class GdalController { public void importDataStreamGzip(@Parameter(description = "矢量文件路径", required = true) @RequestParam("path") String path, HttpServletResponse response) throws IOException { // 解析矢量文件、得到JSON数据 - String jsonData = GdalUtil.readVectorToJson(path); + String jsonData = GdalUtil.readVectorToGeoJson(path); // 设置响应头 String filename = URLEncoder.encode("data.gz", StandardCharsets.UTF_8); diff --git a/src/main/java/com/yj/earth/business/controller/IconLibraryController.java b/src/main/java/com/yj/earth/business/controller/IconLibraryController.java index 9b751be..320be14 100644 --- a/src/main/java/com/yj/earth/business/controller/IconLibraryController.java +++ b/src/main/java/com/yj/earth/business/controller/IconLibraryController.java @@ -237,6 +237,7 @@ public class IconLibraryController { params.add(fileSuffix); params.add(file.getBytes()); params.add(LocalDateTime.now().toString()); + System.out.println(insertSql); SQLiteUtil.executeUpdate(iconPath, insertSql, params); } diff --git a/src/main/java/com/yj/earth/common/config/SaTokenConfig.java b/src/main/java/com/yj/earth/common/config/SaTokenConfig.java index 7864f53..98d0ec4 100644 --- a/src/main/java/com/yj/earth/common/config/SaTokenConfig.java +++ b/src/main/java/com/yj/earth/common/config/SaTokenConfig.java @@ -28,6 +28,9 @@ public class SaTokenConfig implements WebMvcConfigurer { excludePathPatterns.add("/data/mbtiles/**"); excludePathPatterns.add("/data/pak/**"); excludePathPatterns.add("/systemService/**"); + excludePathPatterns.add("/iconLibrary/data/icon/**"); + excludePathPatterns.add("/militaryLibrary/data/military/**"); + excludePathPatterns.add("/modelLibrary/data/**"); // 注册 Sa-Token 拦截器 registry.addInterceptor(new SaInterceptor(handle -> { diff --git a/src/main/java/com/yj/earth/common/util/GdalUtil.java b/src/main/java/com/yj/earth/common/util/GdalUtil.java index 31c84b0..0655640 100644 --- a/src/main/java/com/yj/earth/common/util/GdalUtil.java +++ b/src/main/java/com/yj/earth/common/util/GdalUtil.java @@ -2,6 +2,7 @@ package com.yj.earth.common.util; import org.gdal.gdal.gdal; import org.gdal.ogr.*; +import org.gdal.osr.SpatialReference; import java.util.ArrayList; import java.util.HashMap; @@ -16,67 +17,82 @@ public class GdalUtil { gdal.AllRegister(); } - public static String readVectorToJson(String filePath) { + /** + * 读取矢量文件并转换为标准GeoJSON格式 + */ + public static String readVectorToGeoJson(String filePath) { // 打开矢量文件 DataSource dataSource = ogr.Open(filePath); if (dataSource == null) { throw new RuntimeException("无法打开矢量文件: " + filePath); } - // 存储所有数据的Map - Map result = new HashMap<>(); - // 获取图层数量 + + // 创建GeoJSON根对象 - FeatureCollection + Map geoJson = new HashMap<>(); + geoJson.put("type", "FeatureCollection"); + + // 存储所有要素 + List> features = new ArrayList<>(); + geoJson.put("features", features); + + // 获取所有图层 int layerCount = dataSource.GetLayerCount(); - result.put("layerCount", layerCount); - // 存储所有图层数据 - List> layers = new ArrayList<>(); for (int i = 0; i < layerCount; i++) { Layer layer = dataSource.GetLayer(i); if (layer == null) continue; - // 图层信息 - Map layerData = new HashMap<>(); - layerData.put("layerName", layer.GetName()); - layerData.put("featureCount", layer.GetFeatureCount()); + + // 获取空间参考信息 + SpatialReference srs = layer.GetSpatialRef(); + if (srs != null && features.isEmpty()) { // 只添加一次CRS信息 + Map crs = new HashMap<>(); + Map crsProps = new HashMap<>(); + crsProps.put("name", srs.GetAttrValue("AUTHORITY", 0) + ":" + srs.GetAttrValue("AUTHORITY", 1)); + crs.put("type", "name"); + crs.put("properties", crsProps); + geoJson.put("crs", crs); + } + // 获取字段定义 FeatureDefn featureDefn = layer.GetLayerDefn(); int fieldCount = featureDefn.GetFieldCount(); - List> fields = new ArrayList<>(); - for (int j = 0; j < fieldCount; j++) { - FieldDefn fieldDefn = featureDefn.GetFieldDefn(j); - Map fieldInfo = new HashMap<>(); - fieldInfo.put("name", fieldDefn.GetName()); - fieldInfo.put("type", fieldDefn.GetFieldTypeName(fieldDefn.GetFieldType())); - fields.add(fieldInfo); - } - layerData.put("fields", fields); + // 读取所有要素 - List> features = new ArrayList<>(); layer.ResetReading(); Feature feature; - while ((feature = layer.GetNextFeature()) != null) { - Map featureData = new HashMap<>(); + // 创建Feature对象 + Map featureObj = new HashMap<>(); + featureObj.put("type", "Feature"); + // 存储属性信息 - Map attributes = new HashMap<>(); + Map properties = new HashMap<>(); + // 可以添加图层名称作为属性 + properties.put("layerName", layer.GetName()); + for (int j = 0; j < fieldCount; j++) { - attributes.put(featureDefn.GetFieldDefn(j).GetName(), feature.GetFieldAsString(j)); + String fieldName = featureDefn.GetFieldDefn(j).GetName(); + properties.put(fieldName, feature.GetFieldAsString(j)); } - featureData.put("attributes", attributes); - // 存储几何信息 + featureObj.put("properties", properties); + + // 存储几何信息,转换为GeoJSON格式 Geometry geometry = feature.GetGeometryRef(); if (geometry != null) { - featureData.put("geometryType", geometry.GetGeometryName()); - featureData.put("wkt", geometry.ExportToWkt()); + + String geometryJson = geometry.ExportToJson(); + Map geometryObj = JsonUtil.jsonToMap(geometryJson); + featureObj.put("geometry", geometryObj); } - features.add(featureData); - feature.delete(); // 释放资源 + + features.add(featureObj); + feature.delete(); } - layerData.put("features", features); - layers.add(layerData); } - result.put("layers", layers); + // 关闭数据源 dataSource.delete(); + // 转换为JSON并返回 - return JsonUtil.toJson(result); + return JsonUtil.toJson(geoJson); } } diff --git a/src/main/java/com/yj/earth/common/util/SQLiteConverter.java b/src/main/java/com/yj/earth/common/util/SQLiteConverter.java index 0bb6a35..6dcd914 100644 --- a/src/main/java/com/yj/earth/common/util/SQLiteConverter.java +++ b/src/main/java/com/yj/earth/common/util/SQLiteConverter.java @@ -231,17 +231,13 @@ public class SQLiteConverter { String sourcePath = "F:\\公司通用模型库.model"; // 目标数据库路径 String targetPath = "F:\\通用模型库.model"; - System.out.println("开始数据库转换..."); System.out.println("源数据库: " + sourcePath); System.out.println("目标数据库: " + targetPath); - long startTime = System.currentTimeMillis(); - // 创建转换器并执行转换 SQLiteConverter converter = new SQLiteConverter(sourcePath, targetPath); converter.convert(); - long endTime = System.currentTimeMillis(); double elapsedTime = (endTime - startTime) / 1000.0; System.out.printf("转换完成、耗时: %.2f秒%n", elapsedTime); diff --git a/src/main/java/com/yj/earth/vo/IconVo.java b/src/main/java/com/yj/earth/vo/IconVo.java index 2e75ad2..edb7f1c 100644 --- a/src/main/java/com/yj/earth/vo/IconVo.java +++ b/src/main/java/com/yj/earth/vo/IconVo.java @@ -8,7 +8,7 @@ import lombok.Data; import java.time.LocalDateTime; @Data -public class IconVo extends Icon { +public class IconVo{ @Schema(description = "图标类型名称") private String iconTypeName; @Schema(description = "图标数据URL")