mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-02-23 10:30:16 +00:00
Move projection and tile arithmetic to its own file
This commit is contained in:
parent
754dbf152a
commit
46100c34df
4
Makefile
4
Makefile
@ -10,13 +10,13 @@ vector_tile.pb.cc vector_tile.pb.h: vector_tile.proto
|
|||||||
|
|
||||||
PG=
|
PG=
|
||||||
|
|
||||||
tippecanoe: geojson.o jsonpull.o vector_tile.pb.o tile.o clip.o pool.o mbtiles.o geometry.o
|
tippecanoe: geojson.o jsonpull.o vector_tile.pb.o tile.o clip.o pool.o mbtiles.o geometry.o projection.o
|
||||||
g++ $(PG) -O3 -g -Wall -o $@ $^ -lm -lz -lprotobuf-lite -lsqlite3
|
g++ $(PG) -O3 -g -Wall -o $@ $^ -lm -lz -lprotobuf-lite -lsqlite3
|
||||||
|
|
||||||
enumerate: enumerate.o
|
enumerate: enumerate.o
|
||||||
gcc $(PG) -O3 -g -Wall -o $@ $^ -lsqlite3
|
gcc $(PG) -O3 -g -Wall -o $@ $^ -lsqlite3
|
||||||
|
|
||||||
decode: decode.o vector_tile.pb.o
|
decode: decode.o vector_tile.pb.o projection.o
|
||||||
g++ $(PG) -O3 -g -Wall -o $@ $^ -lm -lz -lprotobuf-lite -lsqlite3
|
g++ $(PG) -O3 -g -Wall -o $@ $^ -lm -lz -lprotobuf-lite -lsqlite3
|
||||||
|
|
||||||
libjsonpull.a: jsonpull.o
|
libjsonpull.a: jsonpull.o
|
||||||
|
12
decode.cc
12
decode.cc
@ -7,6 +7,10 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "vector_tile.pb.h"
|
#include "vector_tile.pb.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "projection.h"
|
||||||
|
}
|
||||||
|
|
||||||
// https://github.com/mapbox/mapnik-vector-tile/blob/master/src/vector_tile_compression.hpp
|
// https://github.com/mapbox/mapnik-vector-tile/blob/master/src/vector_tile_compression.hpp
|
||||||
inline bool is_compressed(std::string const& data) {
|
inline bool is_compressed(std::string const& data) {
|
||||||
return data.size() > 2 && (uint8_t)data[0] == 0x78 && (uint8_t)data[1] == 0x9C;
|
return data.size() > 2 && (uint8_t)data[0] == 0x78 && (uint8_t)data[1] == 0x9C;
|
||||||
@ -44,14 +48,6 @@ int dezig(unsigned n) {
|
|||||||
return (n >> 1) ^ (-(n & 1));
|
return (n >> 1) ^ (-(n & 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
// http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
|
|
||||||
void tile2latlon(unsigned int x, unsigned int y, int zoom, double *lat, double *lon) {
|
|
||||||
unsigned long long n = 1LL << zoom;
|
|
||||||
*lon = 360.0 * x / n - 180.0;
|
|
||||||
double lat_rad = atan(sinh(M_PI * (1 - 2.0 * y / n)));
|
|
||||||
*lat = lat_rad * 180 / M_PI;
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle(std::string message, int z, unsigned x, unsigned y) {
|
void handle(std::string message, int z, unsigned x, unsigned y) {
|
||||||
GOOGLE_PROTOBUF_VERIFY_VERSION;
|
GOOGLE_PROTOBUF_VERIFY_VERSION;
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ void usage(char **argv) {
|
|||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
extern int optind;
|
extern int optind;
|
||||||
extern char *optarg;
|
//extern char *optarg;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
while ((i = getopt(argc, argv, "")) != -1) {
|
while ((i = getopt(argc, argv, "")) != -1) {
|
||||||
|
67
geojson.c
67
geojson.c
@ -17,6 +17,7 @@
|
|||||||
#include "tile.h"
|
#include "tile.h"
|
||||||
#include "pool.h"
|
#include "pool.h"
|
||||||
#include "mbtiles.h"
|
#include "mbtiles.h"
|
||||||
|
#include "projection.h"
|
||||||
|
|
||||||
int low_detail = 10;
|
int low_detail = 10;
|
||||||
int full_detail = 12;
|
int full_detail = 12;
|
||||||
@ -56,72 +57,6 @@ int mb_geometry[GEOM_TYPES] = {
|
|||||||
VT_POLYGON,
|
VT_POLYGON,
|
||||||
};
|
};
|
||||||
|
|
||||||
// http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
|
|
||||||
void latlon2tile(double lat, double lon, int zoom, unsigned int *x, unsigned int *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) {
|
|
||||||
unsigned long long n = 1LL << zoom;
|
|
||||||
*lon = 360.0 * x / n - 180.0;
|
|
||||||
float lat_rad = atan(sinh(M_PI * (1 - 2.0 * y / n)));
|
|
||||||
*lat = lat_rad * 180 / M_PI;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long long encode(unsigned int wx, unsigned int wy) {
|
|
||||||
long long out = 0;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < 32; i++) {
|
|
||||||
long long v = ((wx >> (32 - (i + 1))) & 1) << 1;
|
|
||||||
v |= (wy >> (32 - (i + 1))) & 1;
|
|
||||||
v = v << (64 - 2 * (i + 1));
|
|
||||||
|
|
||||||
out |= v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
void decode(unsigned long long index, unsigned *wx, unsigned *wy) {
|
|
||||||
*wx = *wy = 0;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < 32; i++) {
|
|
||||||
*wx |= ((index >> (64 - 2 * (i + 1) + 1)) & 1) << (32 - (i + 1));
|
|
||||||
*wy |= ((index >> (64 - 2 * (i + 1) + 0)) & 1) << (32 - (i + 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int indexcmp(const void *v1, const void *v2) {
|
int indexcmp(const void *v1, const void *v2) {
|
||||||
const struct index *i1 = v1;
|
const struct index *i1 = v1;
|
||||||
const struct index *i2 = v2;
|
const struct index *i2 = v2;
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#include "tile.h"
|
#include "tile.h"
|
||||||
#include "clip.h"
|
#include "clip.h"
|
||||||
|
#include "projection.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
drawvec decode_geometry(char **meta, int z, unsigned tx, unsigned ty, int detail) {
|
drawvec decode_geometry(char **meta, int z, unsigned tx, unsigned ty, int detail) {
|
||||||
|
68
projection.c
Normal file
68
projection.c
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#include <math.h>
|
||||||
|
#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) {
|
||||||
|
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) {
|
||||||
|
unsigned long long n = 1LL << zoom;
|
||||||
|
*lon = 360.0 * x / n - 180.0;
|
||||||
|
float lat_rad = atan(sinh(M_PI * (1 - 2.0 * y / n)));
|
||||||
|
*lat = lat_rad * 180 / M_PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long long encode(unsigned int wx, unsigned int wy) {
|
||||||
|
long long out = 0;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 32; i++) {
|
||||||
|
long long v = ((wx >> (32 - (i + 1))) & 1) << 1;
|
||||||
|
v |= (wy >> (32 - (i + 1))) & 1;
|
||||||
|
v = v << (64 - 2 * (i + 1));
|
||||||
|
|
||||||
|
out |= v;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
void decode(unsigned long long index, unsigned *wx, unsigned *wy) {
|
||||||
|
*wx = *wy = 0;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 32; i++) {
|
||||||
|
*wx |= ((index >> (64 - 2 * (i + 1) + 1)) & 1) << (32 - (i + 1));
|
||||||
|
*wy |= ((index >> (64 - 2 * (i + 1) + 0)) & 1) << (32 - (i + 1));
|
||||||
|
}
|
||||||
|
}
|
4
projection.h
Normal file
4
projection.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
void latlon2tile(double lat, double lon, int zoom, unsigned int *x, unsigned int *y);
|
||||||
|
void tile2latlon(unsigned int x, unsigned int y, int zoom, double *lat, double *lon);
|
||||||
|
unsigned long long encode(unsigned int wx, unsigned int wy);
|
||||||
|
void decode(unsigned long long index, unsigned *wx, unsigned *wy);
|
1
tile.cc
1
tile.cc
@ -19,6 +19,7 @@ extern "C" {
|
|||||||
#include "pool.h"
|
#include "pool.h"
|
||||||
#include "clip.h"
|
#include "clip.h"
|
||||||
#include "mbtiles.h"
|
#include "mbtiles.h"
|
||||||
|
#include "projection.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CMD_BITS 3
|
#define CMD_BITS 3
|
||||||
|
2
tile.h
2
tile.h
@ -24,6 +24,4 @@ struct index {
|
|||||||
struct index *next;
|
struct index *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned long long encode(unsigned int wx, unsigned int wy);
|
|
||||||
|
|
||||||
long long write_tile(struct index *start, struct index *end, char *metabase, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int basezoom, struct pool *file_keys, char *layername, sqlite3 *outdb, double droprate);
|
long long write_tile(struct index *start, struct index *end, char *metabase, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int basezoom, struct pool *file_keys, char *layername, sqlite3 *outdb, double droprate);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user