From aa23fdacb23b6e7e194d3e02760ab47590345205 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 04 十二月 2023 14:10:24 +0800 Subject: [PATCH] 修订分析的有效值 --- src/main/java/com/moon/server/service/data/RasterAnalysisService.java | 120 +++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 91 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java index 1f4658a..631eac8 100644 --- a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java +++ b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java @@ -7,6 +7,8 @@ import com.moon.server.entity.data.PublishEntity; import com.moon.server.helper.GeoHelper; import com.moon.server.helper.PathHelper; +import com.moon.server.helper.StringHelper; +import com.moon.server.helper.WebHelper; import com.moon.server.service.all.WebSocketService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -16,11 +18,13 @@ import org.gdal.gdal.gdal; import org.gdal.ogr.Geometry; import org.gdal.ogr.ogr; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.awt.geom.Point2D; import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.util.*; @@ -31,6 +35,9 @@ */ @Service public class RasterAnalysisService { + @Value("${sys.gdal_path}") + String gdalPath; + @Resource PathHelper pathHelper; @@ -41,6 +48,11 @@ /** * 娴嬭瘯 + * <p> + * POINT (26.72 -48.58) + * LINESTRING(18.44 -46.69,20.14 -45.93) + * POLYGON ((5.11 -41.64,7.68 -43.59,4.73 -43.3,5.11 -41.64)) + * POLYGON ((42.6 -40.3,49.1 -40.4,49.1 -65.7,46.3 -65.6,42.6 -40.3)) */ public List<AnalysisResultEntity> test(Geometry geo, Integer size) { List<AnalysisResultEntity> rs = new ArrayList<>(); @@ -62,11 +74,12 @@ return; } - // for (PublishEntity pub : pubs) { + //for (PublishEntity pub : pubs) { pubs.parallelStream().forEach(pub -> { try { AnalysisResultEntity entity = new AnalysisResultEntity(token); entity.setLayerName(pub.getName()); + entity.setUnit(pub.getUnit()); List<MetaEntity> metas = publishService.selectMetasByPubid(pub.getId()); if (null == metas || metas.isEmpty()) { @@ -75,7 +88,7 @@ return; } - String filePath = pathHelper.getConfig().getUploadPath() + File.separator + metas.get(0).getPath(); + String filePath = getFilePath(metas); File file = new File(filePath); if (!file.exists() || file.isDirectory()) { setError(entity, "婧愭暟鎹笉瀛樺湪"); @@ -92,6 +105,31 @@ } /** + * 鑾峰彇鏂囦欢璺緞 + */ + private String getFilePath(List<MetaEntity> metas) throws IOException { + String basePath = pathHelper.getConfig().getUploadPath() + File.separator; + if (metas.size() == 1) { + return basePath + metas.get(0).getPath(); + } + + String tempPath = pathHelper.getTempPath() + File.separator, guid = StringHelper.getGuid(); + String fileList = tempPath + guid + ".txt"; + FileWriter fw = new FileWriter(fileList); + for (int i = 0, c = metas.size(); i < c; i++) { + String str = (i > 0 ? "\r\n" : "") + basePath + metas.get(i).getPath(); + fw.write(str.toCharArray()); + } + fw.close(); + + String vrt = tempPath + guid + ".vrt"; + String cmd = String.format("\"%s\\gdalbuildvrt.exe\" -input_file_list \"%s\" \"%s\"", gdalPath, fileList, vrt); + WebHelper.exec(cmd); + + return vrt; + } + + /** * 鎺ㄩ�佹秷鎭� */ private void postInfo(AnalysisResultEntity entity) throws IOException { @@ -99,7 +137,8 @@ map.put("analysisForPost", entity); String json = JSONObject.toJSONString(map); - // System.out.println(json) + //System.out.println(json) + WebSocketService.broadCastInfo(json); } @@ -115,26 +154,30 @@ } for (PublishEntity pub : pubs) { - AnalysisResultEntity entity = new AnalysisResultEntity(); - entity.setLayerName(pub.getName()); + try { + AnalysisResultEntity entity = new AnalysisResultEntity(); + entity.setLayerName(pub.getName()); + entity.setUnit(pub.getUnit()); - List<MetaEntity> metas = publishService.selectMetasByPubid(pub.getId()); - if (null == metas || metas.isEmpty()) { - setError(entity, "鎵句笉鍒板彂甯冩暟鎹�"); - continue; + List<MetaEntity> metas = publishService.selectMetasByPubid(pub.getId()); + if (null == metas || metas.isEmpty()) { + setError(entity, "鎵句笉鍒板彂甯冩暟鎹�"); + continue; + } + + String filePath = getFilePath(metas); + File file = new File(filePath); + if (!file.exists() || file.isDirectory()) { + setError(entity, "婧愭暟鎹笉瀛樺湪"); + continue; + } + + openRaster(entity, filePath, geo, size); + rs.add(entity); + } catch (Exception ex) { + log.error(ex.getMessage(), ex); } - - String filePath = pathHelper.getConfig().getUploadPath() + File.separator + metas.get(0).getPath(); - File file = new File(filePath); - if (!file.exists() || file.isDirectory()) { - setError(entity, "婧愭暟鎹笉瀛樺湪"); - continue; - } - - openRaster(entity, filePath, geo, size); - rs.add(entity); } - return rs; } @@ -143,8 +186,8 @@ */ private void openRaster(AnalysisResultEntity entity, String filePath, Geometry geo, int size) { Dataset ds = null; - filePath = "D:\\Moon\\data\\DOM\\test.tif"; try { + // filePath = "D:\\Moon\\data\\DOM\\test.tif" ds = gdal.Open(filePath); if (null == ds) { throw new Exception("鎵撳紑鏍呮牸鏁版嵁澶辫触"); @@ -215,9 +258,13 @@ for (int j = 1; j <= bandCount; j++) { double[] pixelValues = new double[1]; ds.GetRasterBand(j).ReadRaster(xPixel, yPixel, 1, 1, pixelValues); - vals.add(pixelValues[0]); + if (isValid(pixelValues[0])) { + vals.add(WebHelper.round(pixelValues[0], 3)); + } } - entity.addPoint(xy[0], xy[1], len, vals); + if (vals.size() > 0) { + entity.addPoint(xy[0], xy[1], len, vals); + } } } @@ -230,12 +277,13 @@ double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = Math.abs(transform[5]), rotationX = transform[2], rotationY = transform[4]; double[] env = new double[4]; geo.GetEnvelope(env); + entity.addPoint(geo.Centroid().GetX(), geo.Centroid().GetY(), 0, null); int xMinPixel = Math.max((int) Math.floor((env[0] - minX) / pixelWidth), 1); int yMinPixel = Math.max((int) Math.floor((maxY - env[3]) / pixelHeight), 1); int xMaxPixel = Math.min((int) Math.floor((env[1] - minX) / pixelWidth), xSize); int yMaxPixel = Math.min((int) Math.floor((maxY - env[2]) / pixelHeight), ySize); - if (xMaxPixel < 1 || yMaxPixel < 1 || xMaxPixel - xMinPixel < 1 || yMaxPixel - yMinPixel < 1) { + if (xMaxPixel < 1 || yMaxPixel < 1 || xMaxPixel - xMinPixel < 0 || yMaxPixel - yMinPixel < 0) { setError(entity, "鏌ヨ鑼冨洿鏃犳晥"); return; } @@ -243,7 +291,6 @@ int bandCount = ds.getRasterCount(); int width = xMaxPixel - xMinPixel; int height = yMaxPixel - yMinPixel; - if (width * height > StaticData.I64 * StaticData.I64) { readRasterForBlocks(entity, ds, bandCount, xMinPixel, yMinPixel, width, height); return; @@ -260,8 +307,8 @@ * 鎸夌収鍧楄鍙栨爡鏍兼暟鎹� */ private void readRasterForBlocks(AnalysisResultEntity entity, Dataset ds, int bandCount, int xMinPixel, int yMinPixel, int width, int height) { - List<Integer> xList = getSamples(xMinPixel, width); - List<Integer> yList = getSamples(yMinPixel, height); + List<Integer> xList = getSamples(xMinPixel, width - 1); + List<Integer> yList = getSamples(yMinPixel, height - 1); double[] pixelValues = new double[1]; for (int i = 1; i <= bandCount; i++) { @@ -269,7 +316,9 @@ for (Integer x : xList) { for (Integer y : yList) { ds.GetRasterBand(i).ReadRaster(x, y, 1, 1, pixelValues); - list.add(pixelValues[0]); + if (isValid(pixelValues[0])) { + list.add(pixelValues[0]); + } } } setBandVals(entity, list); @@ -308,15 +357,28 @@ List<Double> list = new ArrayList<>(); for (double val : pixelValues) { - list.add(val); + if (isValid(val)) { + list.add(val); + } } setBandVals(entity, list); + } + + /** + * 鍊兼槸鍚︽湁鏁� + */ + public static boolean isValid(Double val) { + return !Double.isNaN(val) && val > Integer.MIN_VALUE; } /** * 璁剧疆Band鍊� */ private void setBandVals(AnalysisResultEntity entity, List<Double> list) { + if (null == list || list.isEmpty()) { + return; + } + double min = Collections.min(list); double max = Collections.max(list); double avg = list.stream().mapToDouble(Double::valueOf).average().getAsDouble(); -- Gitblit v1.9.3