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