QuadTile infrastructure.
This commit is contained in:
parent
285d61bf4c
commit
33a65a90c9
7 changed files with 202 additions and 0 deletions
3
lib/quad_tile/extconf.rb
Normal file
3
lib/quad_tile/extconf.rb
Normal file
|
@ -0,0 +1,3 @@
|
|||
require "mkmf"
|
||||
|
||||
create_makefile("quad_tile_so")
|
47
lib/quad_tile/quad_tile.c
Normal file
47
lib/quad_tile/quad_tile.c
Normal file
|
@ -0,0 +1,47 @@
|
|||
#include "ruby.h"
|
||||
#include "quad_tile.h"
|
||||
|
||||
static VALUE tile_for_point(VALUE self, VALUE lat, VALUE lon)
|
||||
{
|
||||
unsigned int x = lon2x(NUM2DBL(lon));
|
||||
unsigned int y = lat2y(NUM2DBL(lat));
|
||||
|
||||
return UINT2NUM(xy2tile(x, y));
|
||||
}
|
||||
|
||||
static VALUE tiles_for_area(VALUE self, VALUE minlat, VALUE minlon, VALUE maxlat, VALUE maxlon)
|
||||
{
|
||||
unsigned int minx = lon2x(NUM2DBL(minlon));
|
||||
unsigned int maxx = lon2x(NUM2DBL(maxlon));
|
||||
unsigned int miny = lat2y(NUM2DBL(minlat));
|
||||
unsigned int maxy = lat2y(NUM2DBL(maxlat));
|
||||
VALUE tiles = rb_ary_new();
|
||||
unsigned int x;
|
||||
unsigned int y;
|
||||
|
||||
for (x = minx; x <= maxx; x++)
|
||||
{
|
||||
for (y = miny; y <= maxy; y++)
|
||||
{
|
||||
rb_ary_push(tiles, UINT2NUM(xy2tile(x, y)));
|
||||
}
|
||||
}
|
||||
|
||||
return tiles;
|
||||
}
|
||||
|
||||
static VALUE tile_for_xy(VALUE self, VALUE x, VALUE y)
|
||||
{
|
||||
return UINT2NUM(xy2tile(NUM2UINT(x), NUM2UINT(y)));
|
||||
}
|
||||
|
||||
void Init_quad_tile_so(void)
|
||||
{
|
||||
VALUE m = rb_define_module("QuadTile");
|
||||
|
||||
rb_define_module_function(m, "tile_for_point", tile_for_point, 2);
|
||||
rb_define_module_function(m, "tiles_for_area", tiles_for_area, 4);
|
||||
rb_define_module_function(m, "tile_for_xy", tile_for_xy, 2);
|
||||
|
||||
return;
|
||||
}
|
25
lib/quad_tile/quad_tile.h
Normal file
25
lib/quad_tile/quad_tile.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
#include <math.h>
|
||||
|
||||
inline unsigned int xy2tile(unsigned int x, unsigned int y)
|
||||
{
|
||||
unsigned int tile = 0;
|
||||
int i;
|
||||
|
||||
for (i = 15; i >= 0; i--)
|
||||
{
|
||||
tile = (tile << 1) | ((x >> i) & 1);
|
||||
tile = (tile << 1) | ((y >> i) & 1);
|
||||
}
|
||||
|
||||
return tile;
|
||||
}
|
||||
|
||||
inline unsigned int lon2x(double lon)
|
||||
{
|
||||
return round((lon + 180.0) * 65535.0 / 360.0);
|
||||
}
|
||||
|
||||
inline unsigned int lat2y(double lat)
|
||||
{
|
||||
return round((lat + 90.0) * 65535.0 / 180.0);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue