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