#include #include #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; }