mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-02 16:35:40 +02:00
Add the ability to tippecanoe-decode into EPSG:3857 instead of WGS84
This commit is contained in:
@@ -1,7 +1,17 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include "projection.hpp"
|
||||
|
||||
struct projection projections[] = {
|
||||
{"EPSG:4326", lonlat2tile, tile2lonlat, "urn:ogc:def:crs:OGC:1.3:CRS84"},
|
||||
{"EPSG:3857", epsg3857totile, tiletoepsg3857, "urn:ogc:def:crs:EPSG::3857"},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
||||
struct projection *projection = &projections[0];
|
||||
|
||||
// http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
|
||||
void lonlat2tile(double lon, double lat, int zoom, long long *x, long long *y) {
|
||||
// Must limit latitude somewhere to prevent overflow.
|
||||
@@ -48,6 +58,16 @@ void epsg3857totile(double ix, double iy, int zoom, long long *x, long long *y)
|
||||
}
|
||||
}
|
||||
|
||||
void tiletoepsg3857(long long ix, long long iy, int zoom, double *ox, double *oy) {
|
||||
if (zoom != 0) {
|
||||
ix <<= (32 - zoom);
|
||||
iy <<= (32 - zoom);
|
||||
}
|
||||
|
||||
*ox = (ix - (1LL << 31)) * M_PI * 6378137.0 / (1LL << 31);
|
||||
*oy = ((1LL << 32) - 1 - iy - (1LL << 31)) * M_PI * 6378137.0 / (1LL << 31);
|
||||
}
|
||||
|
||||
unsigned long long encode(unsigned int wx, unsigned int wy) {
|
||||
unsigned long long out = 0;
|
||||
|
||||
@@ -72,3 +92,21 @@ void decode(unsigned long long index, unsigned *wx, unsigned *wy) {
|
||||
*wy |= ((index >> (64 - 2 * (i + 1) + 0)) & 1) << (32 - (i + 1));
|
||||
}
|
||||
}
|
||||
|
||||
void set_projection_or_exit(const char *optarg) {
|
||||
struct projection *p;
|
||||
for (p = projections; p->name != NULL; p++) {
|
||||
if (strcmp(p->name, optarg) == 0) {
|
||||
projection = p;
|
||||
break;
|
||||
}
|
||||
if (strcmp(p->alias, optarg) == 0) {
|
||||
projection = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (p->name == NULL) {
|
||||
fprintf(stderr, "Unknown projection (-s): %s\n", optarg);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user