package com.ard.tianyu.controller.wayline.terrain; import com.ard.tianyu.config.GeoserverConfig; import lombok.extern.slf4j.Slf4j; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.processing.Operations; import org.geotools.gce.geotiff.GeoTiffReader; import org.geotools.geometry.DirectPosition2D; import org.geotools.referencing.CRS; import org.opengis.geometry.DirectPosition; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.File; import java.io.IOException; @Slf4j @Component public class GeoUtils { @Resource private GeoserverConfig geoserverConfig; private GridCoverage2D coverage; /** * 加载地形文件 * * @author lsy * @date 2025/6/18 */ @PostConstruct public void initTif() { try { File file = new File(geoserverConfig.getTifPath()); GeoTiffReader reader = new GeoTiffReader(file); GridCoverage2D rawCoverage = reader.read(null); CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326"); coverage = (GridCoverage2D) Operations.DEFAULT.resample(rawCoverage, targetCRS); } catch (Exception e) { log.error("加载tif地形文件异常:{}", e.getMessage()); } } /** * 获取地形高度 * * @param lon 经度 * @param lat 纬度 * @return 海拔高度 * @author lsy * @date 2025/6/18 */ public double getHeight(double lon, double lat) throws IOException { DirectPosition pos = new DirectPosition2D(null, lat, lon); double[] result = coverage.evaluate(pos, new double[1]); System.out.println("Elevation at (" + lon + ", " + lat + "): " + result[0]); return result[0]; } }