satdump/src-core/common/projection/projs/mercator.cpp
2023-05-08 23:08:34 +02:00

104 lines
No EOL
3.1 KiB
C++

#include "mercator.h"
#include <cmath>
#include "logger.h"
namespace geodetic
{
namespace projection
{
void MercatorProjection::init(int img_width, int img_height /*, float tl_lon, float tl_lat, float br_lon, float br_lat*/)
{
scale_x = 0.5;
scale_y = 0.15 * (90.0 / 85.06) * 1.003;
#if 0
// Setup Crop
if (true)
{
double tl_lon = 0;
double tl_lat = 85.06;
double br_lon = 180; // 180;
double br_lat = 0;
image_height = img_height * 100000;
image_width = img_width * 100000;
actual_image_height = image_height + 100;
actual_image_width = image_width + 100;
int x1, x2;
int y1, y2;
forward(tl_lon, tl_lat, x1, y1);
forward(br_lon, br_lat, x2, y2);
logger->critical("%d %d %d %d", x1, x2, y1, y2);
double ratio_x = image_width / abs(x1 - x2);
double ratio_y = image_height / abs(y1 - y2);
offset_x = -x2 * ((double)img_width / (double)image_width);
offset_y = y1 * ((double)img_height / (double)image_height);
image_height = img_height * ratio_y;
image_width = img_width * ratio_x;
logger->critical("%d %d %d %d", offset_x, offset_y, (img_width / image_width), (img_height / image_height));
}
else
{
}
#endif
image_height = img_height;
image_width = img_width;
actual_image_height = img_height;
actual_image_width = img_width;
}
void MercatorProjection::forward(float lon, float lat, int &x, int &y)
{
if (lat > 85.06 || lat < -85.06)
{
x = y = -1;
return;
}
float px = (lon / 180.0) * (image_width * scale_x);
float py = asinh(tan(lat / 57.29578)) * (image_height * scale_y);
x = px + (image_width / 2);
y = image_height - (py + (image_height / 2));
// x += offset_x;
// y += offset_y;
if (x < 0 || y < 0)
x = y = -1;
if (x >= actual_image_width || y >= actual_image_height)
x = y = -1;
}
void MercatorProjection::reverse(int x, int y, float &lon, float &lat)
{
if (y < 0 || y >= actual_image_height || x < 0 || x >= actual_image_width)
{
lon = lat = -1;
return;
}
double px = (x - double(image_width / 2));
double py = (image_height - double(y)) - double(image_height / 2);
lat = atan(sinh(py / (image_height * scale_y))) * 57.29578;
lon = (px / (image_width * scale_x)) * 180;
if (lat > 85.06 || lat < -85.06 || lon < -180 || lon > 180)
{
lon = lat = -1;
return;
}
}
};
};