|
@@ -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());
|
|
|
+ // }
|
|
|
}
|
|
|
|
|
|
|