package com.lf.server.service.data;
|
|
import com.lf.server.entity.all.StaticData;
|
import com.lf.server.helper.StringHelper;
|
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.stereotype.Service;
|
|
import java.io.File;
|
|
/**
|
* 栅格服务
|
* @author WWW
|
* @date 2023-08-27
|
*/
|
@Service
|
public class RasterService {
|
private SpatialReference sr4326;
|
|
private SpatialReference sr4490;
|
|
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();
|
}
|
}
|
}
|
|
/**
|
* 坐标转换
|
*/
|
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);
|
}
|
}
|