PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ geohash_point()

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

Definition at line 598 of file lwalgorithm.c.

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

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: