三,GeoHash encode与decode源码(源代码引用自)
encode源码
1 function encodeGeoHash(latitude, longitude) { 2 var is_even=1; 3 var i=0; 4 var lat = []; var lon = []; 5 var bit=0; 6 var ch=0; 7 var precision = 12; 8 geohash = ""; 9 10 lat[0] = -90.0; lat[1] = 90.0; 11 lon[0] = -180.0; lon[1] = 180.0; 12 13 while (geohash.length < precision) { 14 if (is_even) { 15 mid = (lon[0] + lon[1]) / 2; 16 if (longitude > mid) { 17 ch |= BITS[bit]; 18 lon[0] = mid; 19 } else 20 lon[1] = mid; 21 } else { 22 mid = (lat[0] + lat[1]) / 2; 23 if (latitude > mid) { 24 ch |= BITS[bit]; 25 lat[0] = mid; 26 } else 27 lat[1] = mid; 28 } 29 30 is_even = !is_even; 31 32 if (bit < 4) 33 bit++; 34 else { 35 geohash += BASE32[ch]; 36 bit = 0; 37 ch = 0; 38 } 39 } 40 return geohash; 41 }
decode源码
1 function decodeGeoHash(geohash) { 2 var is_even = 1; 3 var lat = []; var lon = []; 4 lat[0] = -90.0; lat[1] = 90.0; 5 lon[0] = -180.0; lon[1] = 180.0; 6 lat_err = 90.0; lon_err = 180.0; 7 8 for (i=0; i<geohash.length; i++) { 9 c = geohash[i]; 10 cd = BASE32.indexOf(c); 11 for (j=0; j<5; j++) { 12 mask = BITS[j]; 13 if (is_even) { 14 lon_err /= 2; 15 refine_interval(lon, cd, mask); 16 } else { 17 lat_err /= 2; 18 refine_interval(lat, cd, mask); 19 } 20 is_even = !is_even; 21 } 22 } 23 lat[2] = (lat[0] + lat[1])/2; 24 lon[2] = (lon[0] + lon[1])/2; 25 26 return { latitude: lat, longitude: lon}; 27 }