You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include "lua.h"
#include "lauxlib.h"
#include "geohash.h"
// 算法 来源 https://github.com/yinqiwen/geohash-int
static int _geohash_encode(lua_State *L)
{
double lat = (double)luaL_checknumber(L, 1);
double lon = (double)luaL_checknumber(L, 2);
uint8_t step = (uint8_t)luaL_checknumber(L, 3);
// 纬度
double lat_min = (double)luaL_checknumber(L, 4);
double lat_max = (double)luaL_checknumber(L, 5);
// 经度
double lon_min = (double)luaL_checknumber(L, 6);
double lon_max = (double)luaL_checknumber(L, 7);
// printf("==== _geohash_encode latL:%lf lon:%lf step:%d ===== \n", lat, lon, step);
// printf(" ^^^^^^ _geohash_encode lat_max:%lf lat_min:%lf lon_max:%lf lon_min:%lf ^^^^ \n", lat_max, lat_min, lon_max, lon_min);
GeoHashRange lat_range, lon_range;
lat_range.max = lat_max;
lat_range.min = lat_min;
lon_range.max = lon_max;
lon_range.min = lon_min;
GeoHashBits fast_hash;
geohash_fast_encode(lat_range, lon_range, lat, lon, step, &fast_hash);
lua_pushnumber(L, fast_hash.bits);
return 1;
}
static int _geohash_neighbors(lua_State *L)
{
double bits = (double)luaL_checknumber(L, 1);
uint8_t step = (uint8_t)luaL_checknumber(L, 2);
GeoHashBits fast_hash;
fast_hash.bits = bits;
fast_hash.step = step;
GeoHashNeighbors neighbors;
geohash_get_neighbors(fast_hash, &neighbors);
lua_pushnumber(L, neighbors.north.bits);
lua_pushnumber(L, neighbors.north_east.bits);
lua_pushnumber(L, neighbors.north_west.bits);
lua_pushnumber(L, neighbors.south.bits);
lua_pushnumber(L, neighbors.south_east.bits);
lua_pushnumber(L, neighbors.south_west.bits);
lua_pushnumber(L, neighbors.east.bits);
lua_pushnumber(L, neighbors.west.bits);
return 8;
}
LUALIB_API int luaopen_geohash(lua_State *L)
{
luaL_checkversion(L);
luaL_Reg l[] = {
{"hashfastencode", _geohash_encode},
{"hashgetneighbors", _geohash_neighbors},
{NULL, NULL}};
luaL_newlib(L, l);
return 1;
}