三,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 }

 

posted on 2013-02-05 16:50  muson  阅读(457)  评论(1编辑  收藏  举报