598{
599 int is_even=1, i=0;
600 double lat[2], lon[2], mid;
601 char bits[] = {16,8,4,2,1};
602 int bit=0, ch=0;
603 char *geohash = NULL;
604
606
607 lat[0] = -90.0;
608 lat[1] = 90.0;
609 lon[0] = -180.0;
610 lon[1] = 180.0;
611
613 {
614 if (is_even)
615 {
616 mid = (lon[0] + lon[1]) / 2;
617 if (longitude >= mid)
618 {
619 ch |= bits[bit];
620 lon[0] = mid;
621 }
622 else
623 {
624 lon[1] = mid;
625 }
626 }
627 else
628 {
629 mid = (lat[0] + lat[1]) / 2;
630 if (latitude >= mid)
631 {
632 ch |= bits[bit];
633 lat[0] = mid;
634 }
635 else
636 {
637 lat[1] = mid;
638 }
639 }
640
641 is_even = !is_even;
642 if (bit < 4)
643 {
644 bit++;
645 }
646 else
647 {
648 geohash[i++] =
base32[ch];
649 bit = 0;
650 ch = 0;
651 }
652 }
653 geohash[i] = 0;
654 return geohash;
655}
void * lwalloc(size_t size)