PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ 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
void * lwalloc(size_t size)
Definition lwutil.c:227
#define LWSIZE_SET(varsize, len)
Definition liblwgeom.h:325
static char * base32
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: