diff --git a/data/aspect3857.tif b/data/aspect3857.tif new file mode 100644 index 0000000..b4ebb69 Binary files /dev/null and b/data/aspect3857.tif differ diff --git a/data/slope3857.tif b/data/slope3857.tif new file mode 100644 index 0000000..0ffe167 Binary files /dev/null and b/data/slope3857.tif differ diff --git a/pom.xml b/pom.xml index c5591cf..fbbdfee 100644 --- a/pom.xml +++ b/pom.xml @@ -185,17 +185,6 @@ 1.5.6 - - com.cuit.mete - geoserver - 3.0-SNAPSHOT - - - - com.cuit.gis - metegis - 2.0-SNAPSHOT - @@ -240,6 +229,23 @@ commons-compress 1.27.1 + + com.cuit.gis + metegis + 3.0-SNAPSHOT + + + com.cuit.mete + musicutil + 2.0-SNAPSHOT + + + + com.cuit.mete + geoserver + 3.0-SNAPSHOT + + diff --git a/src/main/java/com/cuit/solarenergy/service/SolarenergyService.java b/src/main/java/com/cuit/solarenergy/service/SolarenergyService.java new file mode 100644 index 0000000..0a8e9b9 --- /dev/null +++ b/src/main/java/com/cuit/solarenergy/service/SolarenergyService.java @@ -0,0 +1,174 @@ +package com.cuit.solarenergy.service; + +import com.cuit.gis.analysis.SAEnvironment; +import com.cuit.gis.analysis.solarradiation.RasterSolarRadiationOperation; +import com.cuit.gis.analysis.solarradiation.SolarRadiationSpatialAnalysis; +import com.cuit.gis.exception.GeoTiffException; +import com.cuit.gis.exception.SAException; +import com.cuit.gis.projections.CoordinateUtil; +import com.cuit.gis.raster.GeoTiff; +import com.cuit.gis.raster.GridCoverageUtil; +import lombok.extern.slf4j.Slf4j; +import org.geotools.coverage.grid.GridCoverage2D; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.util.Calendar; +import java.util.UUID; + +/** + * @author cuitg -- ZengwuWang + * @date 2024年11月26日 20:14 + */ +@Slf4j +@Service +public class SolarenergyService { + /** + * 太阳辐射计算空间计算,包括: + * 指定本地时间的直接辐射 w / m-2 + * LOCALTIME_DIRECT_SOLARRADIATION + * 指定本地时间的散射辐射 w / m-2 + * LOCALTIME_DIFFUSE_SOLARRADIATION + * 指定本地时间的反射辐射 w / m-2 + * LOCALTIME_REFLECTED_SOLARRADIATION + * 指定本地时间的总辐射 w / m-2 + * LOCALTIME_TOTAL_SOLARRADIATION + * 指定日期的直接辐射量 MJ / m-2 + * DAY_DIRECT_SOLARRADIATION_AMOUNT + * 指定日期的散射辐射量 MJ / m-2 + * DAY_DIFFUSE_SOLARRADIATION_AMOUNT + * 指定日期的反射辐射量 MJ / m-2 + * DAY_REFLECTED_SOLARRADIATION_AMOUNT + * 指定日期的总辐射量 MJ / m-2 + * DAY_TOTAL_SOLARRADIATION_AMOUNT + * 指定月份的直接辐射量 MJ / m-2 + * MONTH_DIRECT_SOLARRADIATION_AMOUNT + * 指定月份的散射辐射量 MJ / m-2 + * MONTH_DIFFUSE_SOLARRADIATION_AMOUNT + * 指定月份的反射辐射量 MJ / m-2 + * MONTH_REFLECTED_SOLARRADIATION_AMOUNT + * 指定月份的总辐射量 MJ / m-2 + * MONTH_TOTAL_SOLARRADIATION_AMOUNT + * 指定年的直接辐射量 MJ / m-2 + * YEAR_DIRECT_SOLARRADIATION_AMOUNT + * 指定年的散射辐射量 MJ / m-2 + * YEAR_DIFFUSE_SOLARRADIATION_AMOUNT + * 指定年的反射辐射量 MJ / m-2 + * YEAR_REFLECTED_SOLARRADIATION_AMOUNT + * 指定年的总辐射量 MJ / m-2 + * YEAR_TOTAL_SOLARRADIATION_AMOUNT + * 日出时间 小时 + * SUNRISETIME + * 日落时间 小时 + * SUNSETTIME + * 指定日期的日照时数 小时 + * DAY_SUNSHINE_DURATION + * 指定月的日照时数 小时 + * MONTH_SUNSHINE_DURATION + * 指定年的日照时数 小时 + * YEAR_SUNSHINE_DURATION + * 指定日期的可照时数 小时 + * DAY_POSSIBLE_SUNSHINE_DURATION + * 指定月的可照时数 小时 + * MONTH_POSSIBLE_SUNSHINE_DURATION + * 指定年的可照时数 小时 + * YEAR_POSSIBLE_SUNSHINE_DURATION + * @param calendar + * @param cloudcoverof10parts + */ + public String calSolarRadiation(RasterSolarRadiationOperation.SolarEadiationAnalysisType type, Calendar calendar, double cloudcoverof10parts, int cellSize) { + String workSpacePath = System.getProperty("user.dir"); + String path = workSpacePath + File.separator + "data" + File.separator; + CoordinateReferenceSystem crs = null; + try { + crs = CoordinateUtil.getCoordinateReferenceSystem("EPSG:3857"); + } catch (FactoryException e) { + log.error("坐标系处理时出错!" + e.getMessage()); + throw new RuntimeException(e); + } + SAEnvironment envi = new SAEnvironment(cellSize, crs); // DefaultGeographicCRS.WGS84 + SolarRadiationSpatialAnalysis solarRadiationSpatialAnalysis = new SolarRadiationSpatialAnalysis(envi); + + String name = type.name(); + String outFileName = path + "out" + File.separator + name + "_" + UUID.randomUUID().toString().replace("-", "") + ".tif"; + + String slopfile = path + "slope3857.tif"; + String aspectfile = path + "aspect3857.tif"; + try { + GeoTiff slopTiff = new GeoTiff(slopfile); + GridCoverage2D slopCoverage = slopTiff.getCoverage(); + GeoTiff aspectTiff = new GeoTiff(aspectfile); + GridCoverage2D aspectCoverage = aspectTiff.getCoverage(); + /* + 指定本地时间的直接辐射 w / m-2 + LOCALTIME_DIRECT_SOLARRADIATION + 指定本地时间的散射辐射 w / m-2 + LOCALTIME_DIFFUSE_SOLARRADIATION + 指定本地时间的反射辐射 w / m-2 + LOCALTIME_REFLECTED_SOLARRADIATION + 指定本地时间的总辐射 w / m-2 + LOCALTIME_TOTAL_SOLARRADIATION + 指定日期的直接辐射量 MJ / m-2 + DAY_DIRECT_SOLARRADIATION_AMOUNT + 指定日期的散射辐射量 MJ / m-2 + DAY_DIFFUSE_SOLARRADIATION_AMOUNT + 指定日期的反射辐射量 MJ / m-2 + DAY_REFLECTED_SOLARRADIATION_AMOUNT + 指定日期的总辐射量 MJ / m-2 + DAY_TOTAL_SOLARRADIATION_AMOUNT + 指定月份的直接辐射量 MJ / m-2 + MONTH_DIRECT_SOLARRADIATION_AMOUNT + 指定月份的散射辐射量 MJ / m-2 + MONTH_DIFFUSE_SOLARRADIATION_AMOUNT + 指定月份的反射辐射量 MJ / m-2 + MONTH_REFLECTED_SOLARRADIATION_AMOUNT + 指定月份的总辐射量 MJ / m-2 + MONTH_TOTAL_SOLARRADIATION_AMOUNT + 指定年的直接辐射量 MJ / m-2 + YEAR_DIRECT_SOLARRADIATION_AMOUNT + 指定年的散射辐射量 MJ / m-2 + YEAR_DIFFUSE_SOLARRADIATION_AMOUNT + 指定年的反射辐射量 MJ / m-2 + YEAR_REFLECTED_SOLARRADIATION_AMOUNT + 指定年的总辐射量 MJ / m-2 + YEAR_TOTAL_SOLARRADIATION_AMOUNT + 日出时间 小时 + SUNRISETIME + 日落时间 小时 + SUNSETTIME + 指定日期的日照时数 小时 + DAY_SUNSHINE_DURATION + 指定月的日照时数 小时 + MONTH_SUNSHINE_DURATION + 指定年的日照时数 小时 + YEAR_SUNSHINE_DURATION + 指定日期的可照时数 小时 + DAY_POSSIBLE_SUNSHINE_DURATION + 指定月的可照时数 小时 + MONTH_POSSIBLE_SUNSHINE_DURATION + 指定年的可照时数 小时 + YEAR_POSSIBLE_SUNSHINE_DURATION + */ + //RasterSolarRadiationOperation.SolarEadiationAnalysisType type = RasterSolarRadiationOperation.SolarEadiationAnalysisType.MONTH_TOTAL_SOLARRADIATION_AMOUNT; +// RasterSolarRadiationOperation.SolarEadiationAnalysisType type = RasterSolarRadiationOperation.SolarEadiationAnalysisType.SUNRISETIME; + + GridCoverage2D solarRadiationCoverage2D = solarRadiationSpatialAnalysis.calculateSolarRadiation(slopCoverage, aspectCoverage, type, calendar, cloudcoverof10parts); + + GridCoverageUtil.writeGeoTiff(solarRadiationCoverage2D, outFileName); + return outFileName; +// } catch (FactoryException e) { +// throw new RuntimeException(e); + } catch (GeoTiffException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (SAException e) { + throw new RuntimeException(e); + } catch (FactoryException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 8b1247c..926529a 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -52,7 +52,7 @@ mygeoserverconfig: geoserverapiurl: http://1.92.75.33:8082/geoserver/ username: admin #adminuser password: geoserver #Wzw@Geoserver - workspaces: cztl + workspaces: nctyn geoserverpath: /opt/geoserver/data_dir/data ## 删除GeoServer配置 diff --git a/src/test/java/com/cuit/solarenergy/SolarenergyApplicationTests.java b/src/test/java/com/cuit/solarenergy/SolarenergyApplicationTests.java index 8095fbd..695fd81 100644 --- a/src/test/java/com/cuit/solarenergy/SolarenergyApplicationTests.java +++ b/src/test/java/com/cuit/solarenergy/SolarenergyApplicationTests.java @@ -1,13 +1,83 @@ package com.cuit.solarenergy; +import com.cuit.gis.analysis.solarradiation.RasterSolarRadiationOperation; +import com.cuit.mete.musicutil.MusicQueryParameters; +import com.cuit.mete.musicutil.SurfEleInterface; +import com.cuit.mete.musicutil.exception.*; +import com.cuit.solarenergy.service.SolarenergyService; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.io.FileNotFoundException; +import java.util.Calendar; + @SpringBootTest +@Slf4j class SolarenergyApplicationTests { + @Autowired + SolarenergyService solarenergyService; @Test void contextLoads() { } + + @Test + public void cal(){ + String s = solarenergyService.calSolarRadiation(RasterSolarRadiationOperation.SolarEadiationAnalysisType.DAY_TOTAL_SOLARRADIATION_AMOUNT, Calendar.getInstance(), 0, 2000); + System.out.println(s); + } + + @Test + public void testMusic() throws FileNotFoundException, MusicConfigException { + try { + //1、接口实例化 + SurfEleInterface surfEleInterface = new SurfEleInterface(); + surfEleInterface.setUserConfig("10.96.90.120","80","BCCD_BFNA_NCGFZX", "NCgongfu123!"); + log.debug("1---接口初始化成功"); + //2、接口参数实例化 + //需要传数据数据代码 + MusicQueryParameters musicQueryParameters = new MusicQueryParameters("SURF","RADI_CHN_MUL_HOR"); + log.debug("2---接口查询参数"); + //3、设置查询时间,可设置时间段 + musicQueryParameters.setTimes("20241126080000"); + + //可设置站号 + //设置经纬度范围 + //可设置站事情 + musicQueryParameters.setAdminCodes("510000"); + log.debug("3---设置时间及区号"); + //开始查询 + String dataByMusic = surfEleInterface.queryDataByMusic(musicQueryParameters); + log.debug("4---查询结束"); + log.debug("查询结果长度:" + dataByMusic.length()); + } catch (FileNotFoundException e) { + //配置文件没有找到 + log.error("Error1:" + e.getMessage()); + } catch (MusicConfigException e) { + //无效的配置文件 + log.error("Error2:" + e.getMessage()); + } catch (InvalidInterfaceParametersException e) { + //无效的接口参数据错误 + log.error("Error3:" + e.getMessage()); + } catch (InterfaceParameterMismatchException e) { + //查询接口参数据错误 + log.error("Error4:" + e.getMessage()); + } catch (MusicInterfaceException e) { + //接口调用异常; + log.error("Error7:" + e.getMessage()); + } catch (MusicInterfaceReturnException e) { + //接口调用返异常; + log.error("Error5:接口ID为" + e.getInterfaceID()); + log.error("Error5:接口参数为" + e.getParaMap()); + log.error("Error5:MUSIC返回错误" + e.getErrMsg()); + log.error("Error5:错误代码" + e.getErrcode()); + log.error("Error5:错误信息" + e.getMessage()); + log.error("Error5:错误处理建议" + e.getErrTips()); + } catch (DataSetElementsInvalidExecption e) { + log.error("Error6:要素代码不正确" + e.getMessage()); + } + } }