PostGIS  3.2.2dev-r@@SVN_REVISION@@

◆ geohash_point()

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

Definition at line 606 of file lwalgorithm.c.

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

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: