ref: c6a16dc58a2cb3152cd0b08b81fbf85df713280b
dir: /osm.c/
#include <u.h>
#include <libc.h>
#include "dat.h"
#include "fns.h"
static double
asinh(double x)
{
double s = sqrt(x*x + 1);
return log(x + s);
}
int
lon2tilex(double lon, int z)
{
return (int)(floor((lon + 180.0) / 360.0 * (1<<z)));
}
int
lat2tiley(double lat, int z)
{
double latrad = lat * PI/180.0;
return (int)(floor((1.0 - asinh(tan(latrad)) / PI) / 2.0 * (1<<z)));
}
double tilex2long(int x, int z)
{
return x / (double)(1<<z) * 360.0 - 180.0;
}
double tiley2lat(int y, int z)
{
double n = PI - 2.0 * PI * y / (double)(1<<z);
return 180.0 / PI * atan(0.5 * (exp(n) - exp(-n)));
}
GBundle
getbundle(GPos pos, int z)
{
GBundle ret;
ret.x = lon2tilex(pos.lon, z);
ret.y = lat2tiley(pos.lat, z);
ret.z = z;
return ret;
}
static char*
defaultformaturl(GBundle b)
{
return smprint("https://tile.openstreetmap.org/%d/%d/%d.png", b.z, b.x, b.y);
}
static GProvider defaultprovider = {
.formaturl = defaultformaturl,
};
GProvider*
getprovider()
{
return &defaultprovider;
}