Explorar el Código

Merge branch 'f-xiaogu' into dev

gushoubang hace 9 meses
padre
commit
a801344eb8

+ 0 - 1
D/bei.cpg

@@ -1 +0,0 @@
-UTF-8

BIN
D/bei.dbf


+ 0 - 40
D/bei.geojson

@@ -1,40 +0,0 @@
-{
-  "type": "FeatureCollection",
-  "features": [
-    {
-      "type": "Feature",
-      "properties": {},
-      "geometry": {
-        "coordinates": [
-          [
-            [
-              116.3043617698678,
-              39.9950860331447
-            ],
-            [
-              116.2507003294885,
-              39.87785868533936
-            ],
-            [
-              116.44829350496468,
-              39.78417129374486
-            ],
-            [
-              116.44504496065588,
-              39.94835379839009
-            ],
-            [
-              116.34827773886082,
-              39.91217475088072
-            ],
-            [
-              116.3043617698678,
-              39.9950860331447
-            ]
-          ]
-        ],
-        "type": "Polygon"
-      }
-    }
-  ]
-}

+ 0 - 1
D/bei.prj

@@ -1 +0,0 @@
-GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

+ 0 - 26
D/bei.qmd

@@ -1,26 +0,0 @@
-<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
-<qgis version="3.22.5-Bia?owie?a">
-  <identifier></identifier>
-  <parentidentifier></parentidentifier>
-  <language></language>
-  <type>dataset</type>
-  <title></title>
-  <abstract></abstract>
-  <links/>
-  <fees></fees>
-  <encoding></encoding>
-  <crs>
-    <spatialrefsys>
-      <wkt></wkt>
-      <proj4></proj4>
-      <srsid>0</srsid>
-      <srid>0</srid>
-      <authid></authid>
-      <description></description>
-      <projectionacronym></projectionacronym>
-      <ellipsoidacronym></ellipsoidacronym>
-      <geographicflag>false</geographicflag>
-    </spatialrefsys>
-  </crs>
-  <extent/>
-</qgis>

BIN
D/bei.shp


BIN
D/bei.shx


+ 6 - 5
onemap-modules/onemap-spatial/src/main/java/com/onemap/spatial/controller/ImageController.java

@@ -1,10 +1,11 @@
 package com.onemap.spatial.controller;
 
 import com.onemap.common.core.web.domain.RequestResult;
+import com.onemap.spatial.domain.WktsVo;
 import com.onemap.spatial.service.IImageService;
-import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 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;
@@ -15,8 +16,8 @@ public class ImageController {
     @Resource
     private IImageService imageService;
 
-    @GetMapping("/sensing")
-    public RequestResult getImage(@RequestParam(value = "geom") String geom) throws Exception {
-        return RequestResult.success(imageService.getSensingImage(geom));
+    @PostMapping("/sensing")
+    public RequestResult getImage(@RequestBody WktsVo wktsVo) throws Exception {
+        return RequestResult.success(imageService.getSensingImage(wktsVo));
     }
 }

+ 6 - 1
onemap-modules/onemap-spatial/src/main/java/com/onemap/spatial/service/IImageService.java

@@ -1,5 +1,10 @@
 package com.onemap.spatial.service;
 
+
+import com.onemap.spatial.domain.WktsVo;
+
+import java.util.List;
+
 public interface IImageService {
-    String getSensingImage(String geomWkt) throws Exception;
+    String getSensingImage(WktsVo wktsVo) throws Exception;
 }

+ 66 - 39
onemap-modules/onemap-spatial/src/main/java/com/onemap/spatial/service/impl/ImageServiceImpl.java

@@ -1,29 +1,33 @@
 package com.onemap.spatial.service.impl;
 
-import com.onemap.spatial.mapper.ImageMapper;
+import com.onemap.spatial.domain.WktsVo;
 import com.onemap.spatial.service.IImageService;
+import org.geotools.coverage.grid.GridCoverage2D;
 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.GeoTiffReader;
 import org.geotools.geometry.jts.JTSFactoryFinder;
 import org.geotools.geometry.jts.ReferencedEnvelope;
 import org.geotools.map.FeatureLayer;
+import org.geotools.map.GridReaderLayer;
 import org.geotools.map.Layer;
 import org.geotools.map.MapContent;
 import org.geotools.referencing.crs.DefaultGeographicCRS;
 import org.geotools.renderer.GTRenderer;
 import org.geotools.renderer.label.LabelCacheImpl;
 import org.geotools.renderer.lite.StreamingRenderer;
-import org.geotools.styling.*;
 import org.geotools.styling.Stroke;
+import org.geotools.styling.*;
+import org.geotools.util.factory.Hints;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.io.WKTReader;
 import org.opengis.feature.simple.SimpleFeature;
 import org.opengis.filter.FilterFactory2;
+import org.opengis.style.ContrastMethod;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.Resource;
 import javax.imageio.ImageIO;
 import javax.imageio.stream.ImageOutputStream;
 import java.awt.*;
@@ -33,54 +37,67 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
+
 /**
  * 生成图片服务
  */
 @Service
 public class ImageServiceImpl implements IImageService {
-    @Resource
-    private ImageMapper imageMapper;
-
 
     @Override
-    public String getSensingImage(String wkt) throws Exception {
+    public String getSensingImage(WktsVo wktsVo) throws Exception {
         // 创建一个 MapContent 对象
         MapContent mapContent = new MapContent();
         mapContent.setTitle("Quickstart");
 
-        // 将 WKT 转换为几何对象并添加到图层
-        WKTReader wktReader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
-        Geometry geometry = wktReader.read(wkt);
+        // 加载并添加 TIFF 栅格图层
+        File file = new File("D/15影像.tif");
+        Hints tiffHints = new Hints();
+        tiffHints.add(new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.TRUE));
+        // 默认坐标系EPSG:3857
+        tiffHints.add(new Hints(Hints.DEFAULT_COORDINATE_REFERENCE_SYSTEM, DefaultGeographicCRS.WGS84));
+        GeoTiffReader tifReader = new GeoTiffReader(file, tiffHints);
+        GridCoverage2D coverage = tifReader.read(null);
+        Layer rasterLayer = new GridReaderLayer(tifReader, createRasterStyle());
+        mapContent.addLayer(rasterLayer);
 
-        SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
-        typeBuilder.setName("geometry");
-        typeBuilder.setCRS(DefaultGeographicCRS.WGS84);
-        typeBuilder.add("the_geom", Geometry.class);
-        SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(typeBuilder.buildFeatureType());
 
-        featureBuilder.add(geometry);
-        SimpleFeature feature = featureBuilder.buildFeature(null);
+        // 获取几何对象的外接矩形
+        ReferencedEnvelope combinedBounds = new ReferencedEnvelope(DefaultGeographicCRS.WGS84);
 
-        DefaultFeatureCollection featureCollection = new DefaultFeatureCollection();
-        featureCollection.add(feature);
+        for (WktsVo.WktInfo wktInfo : wktsVo.getWktInfos()) {
+            // 将 WKT 转换为几何对象并添加到图层
+            WKTReader wktReader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
+            Geometry geometry = wktReader.read(wktInfo.getWkt());
 
-        Style wktStyle = createStyle();
-        Layer wktLayer = new FeatureLayer(featureCollection, wktStyle);
-        mapContent.addLayer(wktLayer);
+            SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
+            typeBuilder.setName("geometry");
+            typeBuilder.setCRS(DefaultGeographicCRS.WGS84);
+            typeBuilder.add("the_geom", Geometry.class);
+            SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(typeBuilder.buildFeatureType());
 
-        // 获取几何对象的外接矩形
-        ReferencedEnvelope combinedBounds = new ReferencedEnvelope(DefaultGeographicCRS.WGS84);
-        combinedBounds.expandToInclude(featureCollection.getBounds());
+            featureBuilder.add(geometry);
+            SimpleFeature feature = featureBuilder.buildFeature(null);
+
+            DefaultFeatureCollection featureCollection = new DefaultFeatureCollection();
+            featureCollection.add(feature);
+
+            Style wktStyle = createStyle(wktInfo.getBorderColor(), wktInfo.getBorderOpacity(), wktInfo.getFillColor(), wktInfo.getFillOpacity());
+            Layer wktLayer = new FeatureLayer(featureCollection, wktStyle);
+            // 添加图层
+            mapContent.addLayer(wktLayer);
+
+            combinedBounds.expandToInclude(featureCollection.getBounds());
+        }
 
         // 增加长和宽的10%
-        double expandWidth = combinedBounds.getWidth() * (1+0.10);
-        double expandHeight = combinedBounds.getHeight() * (1+0.10);
+        double expandWidth = combinedBounds.getWidth() * (1 + 0.01);
+        double expandHeight = combinedBounds.getHeight() * (1 + 0.01);
         combinedBounds.expandBy(expandWidth, expandHeight);
 
         // 将地图绘制到图片
         File outputFile = new File("states.png");
-        try (FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
-             ImageOutputStream outputImageFile = ImageIO.createImageOutputStream(fileOutputStream);) {
+        try (FileOutputStream fileOutputStream = new FileOutputStream(outputFile); ImageOutputStream outputImageFile = ImageIO.createImageOutputStream(fileOutputStream);) {
 
             int w = 1000;
             int h = (int) (w * (combinedBounds.getHeight() / combinedBounds.getWidth()));
@@ -112,21 +129,17 @@ public class ImageServiceImpl implements IImageService {
         return "";
     }
 
-    private Style createStyle() {
+    private Style createStyle(String borderColor, float borderOpacity, String fillColor, float fillOpacity) {
         // 创建样式工厂和过滤工厂
         StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory();
         FilterFactory2 filterFactory = CommonFactoryFinder.getFilterFactory2();
 
         // 创建笔刷和填充样式
-        Stroke stroke = styleFactory.createStroke(
-                filterFactory.literal(Color.BLUE),
-                filterFactory.literal(1)
-        );
+        Color colorBorder = Color.decode(borderColor);
+        Color colorFill = Color.decode(fillColor);
 
-        Fill fill = styleFactory.createFill(
-                filterFactory.literal(Color.CYAN),
-                filterFactory.literal(0.5)
-        );
+        Stroke stroke = styleFactory.createStroke(filterFactory.literal(colorBorder), filterFactory.literal(borderOpacity));
+        Fill fill = styleFactory.createFill(filterFactory.literal(colorFill), filterFactory.literal(fillOpacity));
 
         // 创建符号样式
         PolygonSymbolizer polygonSymbolizer = styleFactory.createPolygonSymbolizer(stroke, fill, null);
@@ -139,6 +152,20 @@ public class ImageServiceImpl implements IImageService {
 
         return style;
     }
-}
 
+    private Style createRasterStyle() {
+        StyleFactory sf = CommonFactoryFinder.getStyleFactory();
+        FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
 
+        ContrastEnhancement ce = sf.contrastEnhancement(ff.literal(1.0), ContrastMethod.NORMALIZE);
+        SelectedChannelType sctRed = sf.createSelectedChannelType(String.valueOf(1), ce);
+        SelectedChannelType sctGreen = sf.createSelectedChannelType(String.valueOf(2), ce);
+        SelectedChannelType sctBlue = sf.createSelectedChannelType(String.valueOf(3), ce);
+
+        RasterSymbolizer sym = sf.getDefaultRasterSymbolizer();
+        ChannelSelection sel = sf.channelSelection(sctRed, sctGreen, sctBlue);
+        sym.setChannelSelection(sel);
+
+        return SLD.wrapSymbolizers(sym);
+    }
+}

BIN
raster.png


BIN
states.png


BIN
wkt.png