PostGIS  3.6.1dev-r@@SVN_REVISION@@

◆ geohash_point()

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

Definition at line 613 of file lwalgorithm.c.

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