Better handling of features that cross the antimeridian

This commit is contained in:
Eric Fischer
2015-12-03 13:12:34 -08:00
parent 53471521f3
commit c832b34160
4 changed files with 25 additions and 25 deletions
+2 -22
View File
@@ -2,39 +2,19 @@
#include "projection.h"
// http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
void latlon2tile(double lat, double lon, int zoom, unsigned int *x, unsigned int *y) {
void latlon2tile(double lat, double lon, int zoom, long long *x, long long *y) {
double lat_rad = lat * M_PI / 180;
unsigned long long n = 1LL << zoom;
long long llx = n * ((lon + 180) / 360);
long long lly = n * (1 - (log(tan(lat_rad) + 1 / cos(lat_rad)) / M_PI)) / 2;
if (lat >= 85.0511) {
lly = 0;
}
if (lat <= -85.0511) {
lly = n - 1;
}
if (llx < 0) {
llx = 0;
}
if (lly < 0) {
lly = 0;
}
if (llx >= n) {
llx = n - 1;
}
if (lly >= n) {
lly = n - 1;
}
*x = llx;
*y = lly;
}
// http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
void tile2latlon(unsigned int x, unsigned int y, int zoom, double *lat, double *lon) {
void tile2latlon(long long x, long long y, int zoom, double *lat, double *lon) {
unsigned long long n = 1LL << zoom;
*lon = 360.0 * x / n - 180.0;
*lat = atan(sinh(M_PI * (1 - 2.0 * y / n))) * 180.0 / M_PI;