PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ geohash_point()

lwvarlena_t* geohash_point ( double  longitude,
double  latitude,
int  precision 
)

Definition at line 595 of file lwalgorithm.c.

596 {
597  int is_even=1, i=0;
598  double lat[2], lon[2], mid;
599  char bits[] = {16,8,4,2,1};
600  int bit=0, ch=0;
603  char *geohash = v->data;
604 
605  lat[0] = -90.0;
606  lat[1] = 90.0;
607  lon[0] = -180.0;
608  lon[1] = 180.0;
609 
610  while (i < precision)
611  {
612  if (is_even)
613  {
614  mid = (lon[0] + lon[1]) / 2;
615  if (longitude >= mid)
616  {
617  ch |= bits[bit];
618  lon[0] = mid;
619  }
620  else
621  {
622  lon[1] = mid;
623  }
624  }
625  else
626  {
627  mid = (lat[0] + lat[1]) / 2;
628  if (latitude >= mid)
629  {
630  ch |= bits[bit];
631  lat[0] = mid;
632  }
633  else
634  {
635  lat[1] = mid;
636  }
637  }
638 
639  is_even = !is_even;
640  if (bit < 4)
641  {
642  bit++;
643  }
644  else
645  {
646  geohash[i++] = base32[ch];
647  bit = 0;
648  ch = 0;
649  }
650  }
651 
652  return v;
653 }
static uint8_t precision
Definition: cu_in_twkb.c:25
#define LWVARHDRSZ
Definition: liblwgeom.h:311
#define LWSIZE_SET(varsize, len)
Definition: liblwgeom.h:325
void * lwalloc(size_t size)
Definition: lwutil.c:227
static char * base32
Definition: lwalgorithm.c:587
uint32_t size
Definition: liblwgeom.h:307
char data[]
Definition: liblwgeom.h:308

References base32, lwvarlena_t::data, lwalloc(), LWSIZE_SET, LWVARHDRSZ, precision, and lwvarlena_t::size.

Referenced by lwgeom_geohash(), and test_geohash_point().

Here is the call graph for this function:
Here is the caller graph for this function: