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
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}
void * lwalloc(size_t size)
#define LWSIZE_SET(varsize, len)
References base32, lwvarlena_t::data, lwalloc(), LWSIZE_SET, LWVARHDRSZ, precision, and lwvarlena_t::size.
Referenced by lwgeom_geohash(), and test_geohash_point().