package com.se.nsl.helper; import lombok.extern.slf4j.Slf4j; import org.gdal.gdal.Band; import org.gdal.gdal.Dataset; import org.gdal.gdal.gdal; import org.gdal.gdalconst.gdalconst; import org.gdal.ogr.*; import org.gdal.osr.CoordinateTransformation; import org.gdal.osr.SpatialReference; import org.gdal.osr.osr; import java.io.File; @Slf4j @SuppressWarnings("ALL") public class GdalHelper { public final static int I4326 = 4326; public final static int I4490 = 4490; public static SpatialReference SR4326; public static SpatialReference SR4490; public final static String CGCS2000 = "CGCS2000"; /** * 初始化 */ public static void init(String gdalPath) { // 配置环境变量 if (!StringHelper.isEmpty(gdalPath)) { if (WebHelper.isWin()) { gdal.SetConfigOption("GDAL_HOME", gdalPath); gdal.SetConfigOption("GDAL_DATA", gdalPath + File.separator + "gdal-data"); gdal.SetConfigOption("PROJ_LIB", gdalPath + File.separator + "projlib"); // /proj7/share //gdal.SetConfigOption("GDAL_DRIVER_PATH", gdalPath + File.separator + "gdalplugins"); String path = System.getenv("PATH"); if (!path.contains(gdalPath)) { System.setProperty("PATH", path + ";" + gdalPath); } } else { //System.setProperty("java.library.path", gdalPath); } } gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); gdal.SetConfigOption("SHAPE_ENCODING", ""); //gdal.SetConfigOption("PGEO_DRIVER_TEMPLATE", "DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=%s"); //gdal.SetConfigOption("MDB_DRIVER_TEMPLATE", "DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=%s"); gdal.AllRegister(); ogr.RegisterAll(); initSr(); } public static void initSr() { try { SR4326 = new SpatialReference(); SR4326.ImportFromEPSG(I4326); SR4326.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); SR4490 = new SpatialReference(); SR4490.ImportFromEPSG(I4490); SR4490.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); } catch (Exception ex) { log.error(ex.getMessage(), ex); } } public static SpatialReference createSpatialReference(int epsg) { SpatialReference sr = new SpatialReference(); sr.ImportFromEPSG(epsg); sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); return sr; } public static void createPyramid(String file) { Dataset ds = null; try { File f = new File(file); if (!f.exists() || f.isDirectory()) { return; } ds = gdal.Open(file, gdalconst.GA_ReadOnly); if (null == ds || ds.getRasterCount() < 1 || null == ds.GetSpatialRef()) { return; } Band band = ds.GetRasterBand(1); if (0 == band.GetOverviewCount()) { ds.BuildOverviews("nearest", new int[]{2, 4, 6, 8, 16}, null); } } catch (Exception ex) { log.error(ex.getMessage(), ex); } finally { if (null != ds) { ds.delete(); } } } public static void delete(Layer layer, DataSource dataSource, Driver driver) { try { if (null != layer) { layer.delete(); } } catch (Exception ex) { log.error(ex.getMessage(), ex); } try { if (null != dataSource) { dataSource.delete(); } } catch (Exception ex) { log.error(ex.getMessage(), ex); } try { if (null != driver) { driver.delete(); } } catch (Exception ex) { log.error(ex.getMessage(), ex); } } public static Geometry getMinPoint(Dataset ds) { double[] transform = new double[6]; ds.GetGeoTransform(transform); double xMin = transform[0]; double yMin = transform[3] - ds.getRasterYSize() * transform[1]; Geometry point = new Geometry(ogr.wkbPoint); point.AddPoint(xMin, yMin, 0); return Transform(ds, point); } public static Geometry getMaxPoint(Dataset ds) { double[] transform = new double[6]; ds.GetGeoTransform(transform); double xMax = transform[0] + (ds.getRasterYSize() * transform[1]); double yMax = transform[3]; Geometry point = new Geometry(ogr.wkbPoint); point.AddPoint(xMax, yMax, 0); return Transform(ds, point); } public static Geometry Transform(Dataset ds, Geometry point) { point.AssignSpatialReference(ds.GetSpatialRef()); if (ds.GetSpatialRef().IsGeographic() > 0) { return point; } String srsName = ds.GetSpatialRef().GetName(); //if (srsName.Contains(CGCS2000)) //{ // point.TransformTo(sr4490); //} //else //{ point.TransformTo(SR4326); //} //point.SwapXY(); return point; } public static Geometry toWgs84(SpatialReference sr, double x, double y) { Geometry point = new Geometry(ogr.wkbPoint); point.AssignSpatialReference(sr); point.AddPoint(x, y); point.TransformTo(GdalHelper.SR4326); //point.SwapXY(); return point; } public static int toWgs84(SpatialReference sr, Geometry g) { CoordinateTransformation ct = new CoordinateTransformation(sr, GdalHelper.SR4326); if (sr.IsProjected() != 1) { sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); } return g.TransformTo(GdalHelper.SR4326); } public static double[] fromWgs84(SpatialReference sr, double x, double y) { CoordinateTransformation ct = new CoordinateTransformation(GdalHelper.SR4326, sr); if (sr.IsProjected() != 1) { sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); } return ct.TransformPoint(x, y); } public static int fromWgs84(SpatialReference sr, Geometry g) { CoordinateTransformation ct = new CoordinateTransformation(GdalHelper.SR4326, sr); if (sr.IsProjected() != 1) { sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); } return g.TransformTo(sr); } public static Geometry createPolygon(SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) { Geometry ring = new Geometry(ogr.wkbLinearRing); ring.AddPoint_2D(minx, maxy); ring.AddPoint_2D(maxx, maxy); ring.AddPoint_2D(maxx, miny); ring.AddPoint_2D(minx, miny); ring.AddPoint_2D(minx, maxy); Geometry poly = new Geometry(ogr.wkbPolygon); poly.AddGeometry(ring); if (null != sr) { poly.AssignSpatialReference(sr); } return poly; } }