76 lines
1.9 KiB
Go
76 lines
1.9 KiB
Go
package producer
|
|
|
|
import (
|
|
"math"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strconv"
|
|
"strings"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
"starwiz.cn/sjy01/image-proc/pkg/dem"
|
|
)
|
|
|
|
// gdalwarp -rpc -to "RPC_HEIGHT=2375" in.tif out.tif
|
|
// gdalwarp -rpc -to "RPC_DEM=/path/to/dem/gdlebm.tif" in.tif out.tif
|
|
|
|
func Warp(in, out, meta, rpb, demtif string) error {
|
|
meta, _ = filepath.Abs(meta)
|
|
m, err := ParseProductMeta(meta)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
in, _ = filepath.Abs(in)
|
|
out, _ = filepath.Abs(out)
|
|
|
|
log.Infof("Warping %s to %s", in, out)
|
|
minEv, maxEv := dem.Dem1KmLT.MinMaxElevationInRect(
|
|
computeExtend(&m.Corners),
|
|
)
|
|
log.Infof("DEM min/max elevation: %f/%f", minEv, maxEv)
|
|
var cmd *exec.Cmd
|
|
if demtif == "" {
|
|
cmd = exec.Command("gdalwarp", "-rpc", "-to", "RPC_HEIGHT="+strconv.Itoa(int(maxEv)), in, out)
|
|
} else {
|
|
cmd = exec.Command("gdalwarp", "-rpc", "-to", "RPC_DEM="+demtif, in, out)
|
|
}
|
|
|
|
dir := filepath.Dir(out)
|
|
os.MkdirAll(dir, 0755)
|
|
|
|
err = cmd.Run()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
sensor := "MSS"
|
|
if strings.Contains(m.ProductID, "PAN") {
|
|
sensor = "PAN"
|
|
}
|
|
GTiffToJPG(out, strings.Replace(out, ".tiff", ".jpg", 1), sensor, false)
|
|
|
|
return nil
|
|
}
|
|
|
|
func computeExtend(corners *Corners) (lng1, lat1, lng2, lat2 float64) {
|
|
lng1 = math.Min(corners.UpperLeft.Longitude, corners.LowerLeft.Longitude)
|
|
lng1 = math.Min(lng1, corners.UpperRight.Longitude)
|
|
lng1 = math.Min(lng1, corners.LowerRight.Longitude)
|
|
|
|
lat1 = math.Max(corners.UpperLeft.Latitude, corners.LowerLeft.Latitude)
|
|
lat1 = math.Max(lat1, corners.UpperRight.Latitude)
|
|
lat1 = math.Max(lat1, corners.LowerRight.Latitude)
|
|
|
|
lng2 = math.Max(corners.UpperLeft.Longitude, corners.LowerLeft.Longitude)
|
|
lng2 = math.Max(lng2, corners.UpperRight.Longitude)
|
|
lng2 = math.Max(lng2, corners.LowerRight.Longitude)
|
|
|
|
lat2 = math.Min(corners.UpperLeft.Latitude, corners.LowerLeft.Latitude)
|
|
lat2 = math.Min(lat2, corners.UpperRight.Latitude)
|
|
lat2 = math.Min(lat2, corners.LowerRight.Latitude)
|
|
|
|
return
|
|
}
|