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