package com.terra.system.service.data;
|
|
import com.terra.common.entity.all.StaticData;
|
import com.terra.system.helper.StringHelper;
|
import com.terra.system.helper.WebHelper;
|
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.LogFactory;
|
import org.gdal.gdal.Dataset;
|
import org.gdal.gdal.gdal;
|
import org.gdal.gdalconst.gdalconst;
|
import org.gdal.ogr.Geometry;
|
import org.gdal.ogr.ogr;
|
import org.gdal.osr.SpatialReference;
|
//import org.osgeo.proj4j.*;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
|
import java.io.File;
|
|
/**
|
* 栅格服务
|
* @author WWW
|
* @date 2023-08-27
|
*/
|
@Service
|
public class RasterService {
|
private SpatialReference sr4326;
|
|
private SpatialReference sr4490;
|
|
@Value("${sys.gdal_path}")
|
private String gdalPath;
|
|
private final static Log log = LogFactory.getLog(RasterService.class);
|
|
/**
|
* 初始化空间参考
|
*/
|
public void initSr() {
|
if (null == sr4326) {
|
sr4326 = new SpatialReference();
|
sr4326.ImportFromEPSG(StaticData.I4326);
|
}
|
if (null == sr4490) {
|
sr4490 = new SpatialReference();
|
sr4490.ImportFromEPSG(StaticData.I4490);
|
}
|
}
|
|
/**
|
* 获取栅格数据的EPSG编码
|
*/
|
public Integer getRaterEpsg(String file) {
|
Dataset ds = null;
|
try {
|
File f = new File(file);
|
if (!f.exists() || f.isDirectory()) {
|
return null;
|
}
|
|
ds = gdal.Open(file, gdalconst.GA_ReadOnly);
|
if (null == ds || 0 == ds.getRasterCount()) {
|
return null;
|
}
|
|
if (null == ds.GetSpatialRef()) {
|
return null;
|
}
|
|
// PROJCS、 GEOGCS、GEOGCS 或 NULL
|
String code = ds.GetSpatialRef().GetAuthorityCode(null);
|
if (StringHelper.isEmpty(code)) {
|
return null;
|
}
|
|
return Integer.parseInt(code);
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
return null;
|
} finally {
|
if (null != ds) {
|
ds.delete();
|
}
|
}
|
}
|
|
/**
|
* 使用GDAL获取EPSG编码
|
*/
|
public Integer getEpsgByGdal(String file) {
|
try {
|
File f = new File(file);
|
if (!f.exists() || f.isDirectory()) {
|
return null;
|
}
|
|
String cmd = String.format("%s\\gdalsrsinfo.exe \"%s\" -o epsg", gdalPath, file);
|
String rs = WebHelper.exec2(cmd);
|
if (StringHelper.isEmpty(rs)) {
|
return null;
|
}
|
|
String[] strs = rs.split("\n");
|
for (String str : strs) {
|
if (str.contains("EPSG:")) {
|
String epsg = str.replace("EPSG:", "");
|
|
return Integer.parseInt(epsg);
|
}
|
}
|
|
return 0;
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
return null;
|
}
|
}
|
|
/**
|
* 坐标转换
|
*/
|
public Object csTransform(double x, double y, int epsg) {
|
this.initSr();
|
|
SpatialReference srs = new SpatialReference();
|
srs.ImportFromEPSG(epsg);
|
|
Geometry point = new Geometry(ogr.wkbPoint);
|
point.AddPoint(x, y, 0);
|
point.AssignSpatialReference(srs);
|
|
if (srs.GetName().contains(StaticData.CGCS2000)) {
|
point.TransformTo(sr4490);
|
} else {
|
point.TransformTo(sr4326);
|
}
|
point.SwapXY();
|
|
return new double[]{point.GetX(), point.GetY()};
|
}
|
|
/**
|
* 坐标转换-使用Proj4j库
|
*/
|
public String transformByProj4j(double x, double y, int epsg) {
|
/*CRSFactory crsFactory = new CRSFactory();
|
CoordinateReferenceSystem fromCrs = crsFactory.createFromName("EPSG:" + epsg);
|
CoordinateReferenceSystem toCrs = crsFactory.createFromName("EPSG:4326");
|
|
CoordinateTransformFactory ctf = new CoordinateTransformFactory();
|
CoordinateTransform transform = ctf.createTransform(fromCrs, toCrs);
|
|
ProjCoordinate fromCoord = new ProjCoordinate(x, y);
|
ProjCoordinate toCoord = new ProjCoordinate();
|
transform.transform(fromCoord, toCoord);
|
|
return String.format("%f,%f", toCoord.x, toCoord.y);*/
|
|
return String.format("%f,%f", 0.0, 0.0);
|
}
|
}
|