PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ geohash_point()

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

Definition at line 603 of file lwalgorithm.c.

604 {
605  int is_even=1, i=0;
606  double lat[2], lon[2], mid;
607  char bits[] = {16,8,4,2,1};
608  int bit=0, ch=0;
611  char *geohash = v->data;
612 
613  lat[0] = -90.0;
614  lat[1] = 90.0;
615  lon[0] = -180.0;
616  lon[1] = 180.0;
617 
618  while (i < precision)
619  {
620  if (is_even)
621  {
622  mid = (lon[0] + lon[1]) / 2;
623  if (longitude >= mid)
624  {
625  ch |= bits[bit];
626  lon[0] = mid;
627  }
628  else
629  {
630  lon[1] = mid;
631  }
632  }
633  else
634  {
635  mid = (lat[0] + lat[1]) / 2;
636  if (latitude >= mid)
637  {
638  ch |= bits[bit];
639  lat[0] = mid;
640  }
641  else
642  {
643  lat[1] = mid;
644  }
645  }
646 
647  is_even = !is_even;
648  if (bit < 4)
649  {
650  bit++;
651  }
652  else
653  {
654  geohash[i++] = base32[ch];
655  bit = 0;
656  ch = 0;
657  }
658  }
659 
660  return v;
661 }
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:595
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: