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