소스 검색

Merge branch 'dev' into f-xiaogu

gushoubang 11 달 전
부모
커밋
80a0c6fe26

+ 0 - 3
onemap-modules/onemap-spatial/src/main/java/com/onemap/spatial/controller/ImageController.java

@@ -2,15 +2,12 @@ package com.onemap.spatial.controller;
 
 import com.onemap.common.core.web.domain.RequestResult;
 import com.onemap.spatial.service.IImageService;
-import org.geotools.filter.text.cql2.CQLException;
-import org.locationtech.jts.io.ParseException;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import java.io.IOException;
 
 @RestController
 @RequestMapping("/image")

+ 2 - 2
onemap-modules/onemap-spatial/src/main/java/com/onemap/spatial/mapper/ImageMapper.java

@@ -9,7 +9,7 @@ import java.util.List;
 public interface ImageMapper extends BaseMapper<ImageRaster> {
     List<ImageRaster> getRasterDataByWKT(@Param("wkt") String wkt);
 
-
-
     String getRasterImage(@Param("wkt") String wkt);
+
+    String getWktImage(@Param("wkt") String wkt);
 }

+ 111 - 148
onemap-modules/onemap-spatial/src/main/java/com/onemap/spatial/service/impl/ImageServiceImpl.java

@@ -1,32 +1,9 @@
 package com.onemap.spatial.service.impl;
 
+import com.onemap.common.core.utils.uuid.UUID;
 import com.onemap.spatial.mapper.ImageMapper;
 import com.onemap.spatial.service.IImageService;
-import org.geotools.coverage.grid.GridCoverage2D;
-import org.geotools.coverage.grid.io.GridCoverage2DReader;
-import org.geotools.factory.CommonFactoryFinder;
-import org.geotools.feature.DefaultFeatureCollection;
-import org.geotools.feature.simple.SimpleFeatureBuilder;
-import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
-import org.geotools.gce.geotiff.GeoTiffFormat;
-import org.geotools.geometry.jts.JTSFactoryFinder;
-import org.geotools.map.GridCoverageLayer;
-import org.geotools.map.MapContent;
-import org.geotools.map.MapViewport;
-import org.geotools.referencing.crs.DefaultGeographicCRS;
-import org.geotools.renderer.lite.StreamingRenderer;
-import org.geotools.styling.*;
-import org.locationtech.jts.geom.Envelope;
-import org.locationtech.jts.geom.Geometry;
-import org.locationtech.jts.io.WKTReader;
-import org.opengis.feature.simple.SimpleFeature;
-import org.opengis.feature.simple.SimpleFeatureType;
-import org.opengis.filter.FilterFactory2;
-import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.opengis.style.ContrastMethod;
-import org.postgresql.util.PGobject;
 import org.springframework.stereotype.Service;
-import org.springframework.util.Base64Utils;
 
 import javax.annotation.Resource;
 import javax.imageio.ImageIO;
@@ -34,7 +11,6 @@ import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.util.Base64;
-import java.util.List;
 
 /**
  * 生成图片服务
@@ -47,15 +23,29 @@ public class ImageServiceImpl implements IImageService {
 
     @Override
     public String getSensingImage(String wkt) throws Exception {
-        String outputFilePath = "output.png";
-        String base64Image = imageMapper.getRasterImage(wkt);
-        if (base64Image != null) {
-
-            base64Image = base64Image.replaceAll("\n", "");
-            byte[] imageBytes = Base64.getDecoder().decode(base64Image);
-            OutputStream os = new FileOutputStream(outputFilePath);
-            os.write(imageBytes);
-            System.out.println("Image saved as " + outputFilePath);
+        String uuid = UUID.randomUUID().toString();
+        String rasterFilePath = uuid + "raster.png";
+        String wktFilePath = uuid + "wkt.png";
+        String base64RasterImage = imageMapper.getRasterImage(wkt);
+        String base64WktImage = imageMapper.getWktImage(wkt);
+        if (base64RasterImage != null && base64WktImage != null) {
+
+            base64RasterImage = base64RasterImage.replaceAll("\n", "");
+            base64WktImage = base64WktImage.replaceAll("\n", "");
+
+
+            byte[] imageRasterBytes = Base64.getDecoder().decode(base64RasterImage);
+            OutputStream osRater = new FileOutputStream(rasterFilePath);
+            osRater.write(imageRasterBytes);
+
+            byte[] imageWktBytes = Base64.getDecoder().decode(base64WktImage);
+            OutputStream osWkt = new FileOutputStream(wktFilePath);
+            osWkt.write(imageWktBytes);
+
+            // 将两个图片合并
+            mergeImage(wktFilePath, rasterFilePath);
+
+            System.out.println("Image saved as " + rasterFilePath + " " + wktFilePath);
         } else {
             System.out.println("No raster data found for the given polygon.");
         }
@@ -64,132 +54,105 @@ public class ImageServiceImpl implements IImageService {
 
 
     /**
-     * 获取遥感图像
+     * 合并两个图片
      *
-     * @param wkt
-     * @return
+     * @param rasterFilePath 在下面
+     * @param wktFilePath    在上面
+     * @throws Exception
      */
-    // @Override
-    // public String getSensingImage(String wkt) throws Exception {
-    //     List<ImageRaster> rasterDataList = imageMapper.getRasterDataByWKT(wkt);
-    //     List<GridCoverageLayer> layers = new ArrayList<>();
-    //     for (ImageRaster imageRaster : rasterDataList) {
-    //         GridCoverage2D coverage = convertToGridCoverage2D(imageRaster.getRast());
-    //         GridCoverageLayer layer = new GridCoverageLayer(coverage, createDefaultStyle());
-    //         layers.add(layer);
-    //     }
-    //     wktToImage(wkt, layers);
-    //     return "";
-    // }
-
+    private void mergeImage(String wktFilePath, String rasterFilePath) throws Exception {
+        // 读取两个PNG图片
+        BufferedImage image1 = ImageIO.read(new File(wktFilePath));
+        BufferedImage image2 = ImageIO.read(new File(rasterFilePath));
 
-    // 读取栅格数据
-    private GridCoverage2D convertToGridCoverage2D(PGobject rast) throws IOException {
-        // 将PGobject的内容转换为byte[]
-        byte[] bytes = rast.getValue().getBytes();
+        // 确定新图片的宽度和高度
+        int width = Math.max(image1.getWidth(), image2.getWidth());
+        int height = image1.getHeight() + image2.getHeight();
 
-        // 创建输入流
-        ByteArrayInputStream dataInputStream = new ByteArrayInputStream(bytes);
+        // 创建一个新的BufferedImage
+        BufferedImage mergedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
 
-        // 使用GeoTiffFormat读取栅格数据
-        GeoTiffFormat format = new GeoTiffFormat();
-        GridCoverage2DReader reader = format.getReader(dataInputStream);
-        return reader.read(null);
-    }
-
-    // 创建栅格数据样式
-    private static Style createDefaultStyle() {
-        StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(null);
-        FilterFactory2 filterFactory = CommonFactoryFinder.getFilterFactory2(null);
-
-        // 创建RGB样式
-        ContrastEnhancement ce = styleFactory.contrastEnhancement(filterFactory.literal(1.0), ContrastMethod.NORMALIZE);
-        SelectedChannelType red = styleFactory.createSelectedChannelType("1", ce);
-        SelectedChannelType green = styleFactory.createSelectedChannelType("2", ce);
-        SelectedChannelType blue = styleFactory.createSelectedChannelType("3", ce);
-        ChannelSelection channelSelection = styleFactory.channelSelection(red, green, blue);
-        RasterSymbolizer symbolizer = styleFactory.createRasterSymbolizer();
-        symbolizer.setChannelSelection(channelSelection);
-
-        // 创建样式规则
-        Rule rule = styleFactory.createRule();
-        rule.symbolizers().add(symbolizer);
-
-        // 创建样式
-        FeatureTypeStyle featureTypeStyle = styleFactory.createFeatureTypeStyle(new Rule[]{rule});
-        Style style = styleFactory.createStyle();
-        style.featureTypeStyles().add(featureTypeStyle);
-
-        return style;
-    }
-
-    // 矢量数据创建图片
-    private void wktToImage(String wkt, List<GridCoverageLayer> layers) throws Exception {
-        // 创建一个 WKTReader 对象
-        WKTReader reader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
-        Geometry geometry = reader.read(wkt);
-
-        // 定义SimpleFeatureType
-        SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
-        builder.setName("Location");
-        builder.add("the_geom", Geometry.class);// 添加空间信息
-        builder.add("name", String.class);// 添加到属性字段里
-        final SimpleFeatureType TYPE = builder.buildFeatureType();
-
-        // 创建SimpleFeature
-        SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
-        featureBuilder.add(geometry);
-        featureBuilder.add("Polygon1");
-        SimpleFeature feature = featureBuilder.buildFeature(null);
-
-        // 创建 FeatureCollection 并添加 Feature
-        DefaultFeatureCollection featureCollection = new DefaultFeatureCollection("internal", TYPE);
-        featureCollection.add(feature);
-
-        // 创建 MapContent
-        MapContent map = new MapContent();
-        map.setTitle("WKT to Image");
-
-        // 创建一个样式
-        Color outlineColor = Color.BLUE;
-        Color fillColor = Color.RED;
-        Style style = SLD.createPolygonStyle(outlineColor, fillColor, 0.5F);
-
-        // 创建一个图层并添加到 MapContent
-        org.geotools.map.FeatureLayer layer = new org.geotools.map.FeatureLayer(featureCollection, style);
-
-        for (GridCoverageLayer gridCoverageLayer : layers) {
-            map.addLayer(gridCoverageLayer);
-        }
+        // 创建Graphics2D对象
+        Graphics2D g2d = mergedImage.createGraphics();
 
-        map.addLayer(layer);
+        // 在新图片上绘制第一个图片
+        g2d.drawImage(image1, 0, 0, null);
 
-        // 计算几何图形的包络并添加填充
-        Envelope envelope = geometry.getEnvelopeInternal();
-        double padding = envelope.getWidth() * 0.1; // 添加10%的填充
-        envelope.expandBy(padding);
+        // 在新图片上绘制第二个图片,位置在第一个图片的下面
+        g2d.drawImage(image2, 0, image1.getHeight(), null);
 
-        // 设置 MapViewport
-        MapViewport viewport = new MapViewport();
-        CoordinateReferenceSystem crs = DefaultGeographicCRS.WGS84;
-        viewport.setBounds(new org.geotools.geometry.jts.ReferencedEnvelope(envelope, crs));
-        map.setViewport(viewport);
+        // 释放Graphics2D对象
+        g2d.dispose();
 
-        // 创建一个 StreamingRenderer
-        StreamingRenderer renderer = new StreamingRenderer();
-        renderer.setMapContent(map);
+        // 将合并后的图片写入文件
+        ImageIO.write(mergedImage, "png", new File("image.png"));
 
-        // 创建 BufferedImage
-        BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB);
-        Graphics2D graphics = image.createGraphics();
-        renderer.paint(graphics, new Rectangle(800, 600), viewport.getBounds());
+        System.out.println("图片合并成功!");
+    }
 
-        // 保存图像
-        File file = new File("output.png");
-        ImageIO.write(image, "png", file);
 
-        System.out.println("Image saved to " + file.getAbsolutePath());
-    }
+    // // 矢量数据创建图片
+    // private void wktToImage(String wkt) throws Exception {
+    //     // 创建一个 WKTReader 对象
+    //     WKTReader reader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
+    //     Geometry geometry = reader.read(wkt);
+    //
+    //     // 定义SimpleFeatureType
+    //     SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
+    //     builder.setName("Location");
+    //     builder.add("the_geom", Geometry.class);// 添加空间信息
+    //     builder.add("name", String.class);// 添加到属性字段里
+    //     final SimpleFeatureType TYPE = builder.buildFeatureType();
+    //
+    //     // 创建SimpleFeature
+    //     SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
+    //     featureBuilder.add(geometry);
+    //     featureBuilder.add("Polygon1");
+    //     SimpleFeature feature = featureBuilder.buildFeature(null);
+    //
+    //     // 创建 FeatureCollection 并添加 Feature
+    //     DefaultFeatureCollection featureCollection = new DefaultFeatureCollection("internal", TYPE);
+    //     featureCollection.add(feature);
+    //
+    //     // 创建 MapContent
+    //     MapContent map = new MapContent();
+    //     map.setTitle("WKT to Image");
+    //
+    //     // 创建一个样式
+    //     Color outlineColor = Color.BLUE;
+    //     Color fillColor = Color.RED;
+    //     Style style = SLD.createPolygonStyle(outlineColor, fillColor, 0.5F);
+    //
+    //     // 创建一个图层并添加到 MapContent
+    //     org.geotools.map.FeatureLayer layer = new org.geotools.map.FeatureLayer(featureCollection, style);
+    //     map.addLayer(layer);
+    //
+    //     // 计算几何图形的包络并添加填充
+    //     Envelope envelope = geometry.getEnvelopeInternal();
+    //     double padding = envelope.getWidth() * 0.1; // 添加10%的填充
+    //     envelope.expandBy(padding);
+    //
+    //     // 设置 MapViewport
+    //     MapViewport viewport = new MapViewport();
+    //     CoordinateReferenceSystem crs = DefaultGeographicCRS.WGS84;
+    //     viewport.setBounds(new org.geotools.geometry.jts.ReferencedEnvelope(envelope, crs));
+    //     map.setViewport(viewport);
+    //
+    //     // 创建一个 StreamingRenderer
+    //     StreamingRenderer renderer = new StreamingRenderer();
+    //     renderer.setMapContent(map);
+    //
+    //     // 创建 BufferedImage
+    //     BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB);
+    //     Graphics2D graphics = image.createGraphics();
+    //     renderer.paint(graphics, new Rectangle(800, 600), viewport.getBounds());
+    //
+    //     // 保存图像
+    //     File file = new File("output.png");
+    //     ImageIO.write(image, "png", file);
+    //
+    //     System.out.println("Image saved to " + file.getAbsolutePath());
+    // }
 }
 
 

+ 56 - 10
onemap-modules/onemap-spatial/src/main/resources/mapper/postgresql/ImageMapper.xml

@@ -13,18 +13,64 @@
         FROM image_16
         WHERE public.ST_Intersects(rast, public.ST_GeomFromText(#{wkt}, 4326))
     </select>
+
+    <!--    <select id="getRasterImage" resultType="String">-->
+    <!--        SET-->
+    <!--        postgis.gdal_enabled_drivers = 'ENABLE_ALL';-->
+    <!--        WITH geom AS (SELECT PUBLIC.ST_GeomFromText(#{wkt}, 4326) AS POLYGON),-->
+    <!--             merged_raster AS (SELECT PUBLIC.ST_Union(rast) AS rast-->
+    <!--                               FROM image15,-->
+    <!--                                    geom-->
+    <!--                               WHERE PUBLIC.ST_Intersects(rast, geom.POLYGON))-->
+    <!--        SELECT encode(PUBLIC.ST_AsPNG(PUBLIC.ST_Clip(rast, 1, ST_Envelope(geom.POLYGON), TRUE)), 'base64') AS png-->
+    <!--        FROM merged_raster,-->
+    <!--             geom;-->
+    <!--    </select>-->
+
+    <!--彩色原始范围-->
+    <!--    <select id="getRasterImage" resultType="String">-->
+    <!--        SET-->
+    <!--        postgis.gdal_enabled_drivers = 'ENABLE_ALL';-->
+    <!--        WITH geom AS (SELECT ST_GeomFromText(#{wkt}, 4326) AS POLYGON),-->
+    <!--             clipped_rasters AS (SELECT ST_Clip(rast, geom.POLYGON) AS rast_clip-->
+    <!--                                 FROM image15,-->
+    <!--                                      geom-->
+    <!--                                 WHERE ST_Intersects(rast, geom.POLYGON)),-->
+    <!--             merged_raster AS (SELECT ST_Union(rast_clip) AS rast_union-->
+    <!--                               FROM clipped_rasters)-->
+    <!--        SELECT encode(ST_AsPNG(rast_union), 'base64') AS png-->
+    <!--        FROM merged_raster;-->
+    <!--    </select>-->
+
+
+    <!--外接矩形-->
     <select id="getRasterImage" resultType="String">
         SET
         postgis.gdal_enabled_drivers = 'ENABLE_ALL';
-        WITH geom AS (SELECT PUBLIC.ST_GeomFromText(
-                                     #{wkt}, 4326
-                             ) AS POLYGON),
-             merged_raster AS (SELECT PUBLIC.ST_Union(rast) AS rast
-                               FROM image15,
-                                    geom
-                               WHERE PUBLIC.ST_Intersects(rast, geom.POLYGON))
-        SELECT encode(PUBLIC.ST_AsPNG(PUBLIC.ST_Clip(rast, 1, geom.POLYGON, TRUE)), 'base64') AS png
-        FROM merged_raster,
-             geom;
+        WITH geom AS (SELECT ST_GeomFromText(#{wkt}, 4326) AS POLYGON),
+             clipped_rasters AS (SELECT ST_Clip(rast, ST_Envelope(geom.POLYGON)) AS rast_clip
+                                 FROM image15,
+                                      geom
+                                 WHERE ST_Intersects(rast, ST_Envelope(geom.POLYGON))),
+             merged_raster AS (SELECT ST_Union(rast_clip) AS rast_union
+                               FROM clipped_rasters)
+        SELECT encode(ST_AsPNG(rast_union), 'base64') AS png
+        FROM merged_raster;
     </select>
+
+    <select id="getWktImage" resultType="String">
+        SET
+        postgis.gdal_enabled_drivers = 'ENABLE_ALL';
+        WITH geom AS (
+            SELECT ST_GeomFromText(#{wkt}, 4326) AS polygon
+        ),
+             geom_extent AS (
+                 SELECT ST_AsRaster(geom.polygon, 400, 400, ARRAY['8BUI'], ARRAY[1], ARRAY[0]) AS raster_data
+                 FROM geom
+             )
+        SELECT encode(ST_AsPNG(geom_extent.raster_data), 'base64') AS png
+        FROM geom_extent;
+</select>
+
+
 </mapper>

BIN
output.png