From abb772e08beb75ec1f915921b779168133a5ce54 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 11 九月 2023 21:18:51 +0800 Subject: [PATCH] 解决栅格分析的线查询失败 --- src/main/java/com/moon/server/service/data/RasterAnalysisService.java | 25 ++++++++++++++----------- src/main/java/com/moon/server/controller/data/RasterAnalysisController.java | 14 ++++++++------ 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java b/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java index d1281b0..3da5c79 100644 --- a/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java +++ b/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java @@ -4,7 +4,6 @@ import com.moon.server.controller.all.BaseController; import com.moon.server.entity.all.ResponseMsg; import com.moon.server.helper.StringHelper; -import com.moon.server.helper.WebHelper; import com.moon.server.service.data.RasterAnalysisService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -15,7 +14,6 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; import java.util.*; /** @@ -49,7 +47,7 @@ return fail("WKT瀛楃涓蹭笉姝g‘"); } if (null == pixel || !PIXELS.contains(pixel)) { - return fail("鍍忕偣鍊煎彧鑳戒负锛�" + StringHelper.join(PIXELS, ", ")); + return fail("鍍忕礌鍊煎彧鑳戒负锛�" + StringHelper.join(PIXELS, ", ")); } List<?> rs = rasterService.analysis(geo, pixel); @@ -63,10 +61,11 @@ @SysLog() @ApiOperation(value = "鏌ヨ绾垮垎鏋�") @ApiImplicitParams({ - @ApiImplicitParam(name = "wkt", value = "绾縒KT", dataType = "String", example = "LINESTRING(165.680851 31.333443,166.383982 31.283475,166.016355 30.908709)") + @ApiImplicitParam(name = "wkt", value = "绾縒KT", dataType = "String", example = "LINESTRING(165.680851 31.333443,166.383982 31.283475,166.016355 30.908709)"), + @ApiImplicitParam(name = "pixel", value = "鍍忕礌鍊�", dataType = "Integer", example = "1") }) @GetMapping(value = "/selectByPolyline") - public ResponseMsg<Object> selectByPolyline(String wkt) { + public ResponseMsg<Object> selectByPolyline(String wkt, Integer pixel) { try { if (StringHelper.isEmpty(wkt)) { return fail("WKT瀛楃涓蹭笉鑳戒负绌�"); @@ -75,8 +74,11 @@ if (null == geo || geo.GetGeometryType() != ogr.wkbLineString) { return fail("WKT瀛楃涓蹭笉姝g‘"); } + if (null == pixel || !PIXELS.contains(pixel)) { + return fail("鍍忕礌鍊煎彧鑳戒负锛�" + StringHelper.join(PIXELS, ", ")); + } - List<?> rs = rasterService.analysis(geo, 0); + List<?> rs = rasterService.analysis(geo, pixel); return success(rs.size(), rs); } catch (Exception ex) { 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 d443f94..8c02940 100644 --- a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java +++ b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java @@ -85,7 +85,7 @@ analysisPoint(entity, ds, geo, size); break; case ogr.wkbLineString: - analysisPolyline(entity, ds, geo); + analysisPolyline(entity, ds, geo, size); break; default: analysisPolygon(entity, ds, geo); @@ -104,8 +104,8 @@ /** * 鍒嗘瀽鐐� */ - public void analysisPoint(AnalysisResultEntity entity, Dataset ds, Geometry point, int size) { - double x = point.GetX(), y = point.GetY(); + public void analysisPoint(AnalysisResultEntity entity, Dataset ds, Geometry geo, int size) { + double x = geo.GetX(), y = geo.GetY(); double[] transform = ds.GetGeoTransform(); // double rotationX = transform[2]; double rotationY = transform[4] double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = transform[5]; @@ -129,17 +129,20 @@ /** * 鍒嗘瀽绾� */ - public void analysisPolyline(AnalysisResultEntity entity, Dataset ds, Geometry polyline) { + public void analysisPolyline(AnalysisResultEntity entity, Dataset ds, Geometry geo, int size) { double[] transform = ds.GetGeoTransform(); // double rotationX = transform[2]; double rotationY = transform[4] - double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = transform[5]; + double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = Math.abs(transform[5]); + + double buffer = Math.max(Math.abs(pixelWidth), Math.abs(pixelHeight)) * size; double[] env = new double[4]; - polyline.GetEnvelope(env); + geo = geo.Buffer(buffer); + geo.GetEnvelope(env); int xMinPixel = (int) Math.floor((env[0] - minX) / pixelWidth); - int yMinPixel = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); + int yMinPixel = (int) Math.floor((maxY - env[3]) / pixelHeight); int xMaxPixel = (int) Math.floor((env[1] - minX) / pixelWidth); - int yMaxPixel = (int) Math.floor((maxY - env[2]) / Math.abs(pixelHeight)); + int yMaxPixel = (int) Math.floor((maxY - env[2]) / pixelHeight); int bandCount = ds.getRasterCount(); int xMin = Math.min(xMinPixel, xMaxPixel); @@ -152,7 +155,7 @@ for (int x = xMin; x <= xMax; x++) { Geometry point = new Geometry(ogr.wkbPoint); point.AddPoint(minX + pixelWidth * x, maxY - pixelHeight * y); - if (polyline.Contains(point)) { + if (geo.Intersects(point)) { for (int i = 1; i <= bandCount; i++) { double[] values = new double[1]; ds.GetRasterBand(i).ReadRaster(x, y, 1, 1, values); @@ -168,12 +171,12 @@ /** * 鍒嗘瀽闈� */ - public void analysisPolygon(AnalysisResultEntity entity, Dataset ds, Geometry polygon) { + public void analysisPolygon(AnalysisResultEntity entity, Dataset ds, Geometry geo) { double[] transform = ds.GetGeoTransform(); // double rotationX = transform[2]; double rotationY = transform[4] double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = transform[5]; double[] env = new double[4]; - polygon.GetEnvelope(env); + geo.GetEnvelope(env); int xMinPixel = (int) Math.floor((env[0] - minX) / pixelWidth); int yMinPixel = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); -- Gitblit v1.9.3