Guest User

Untitled

a guest
May 20th, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.58 KB | None | 0 0
  1. #standardSQL
  2. CREATE TEMPORARY FUNCTION geohashEncode(latitude FLOAT64, logitude FLOAT64, precision FLOAT64)
  3. RETURNS STRING
  4. LANGUAGE js
  5. AS """
  6. var Geohash = {};
  7. /* (Geohash-specific) Base32 map */
  8. Geohash.base32 = '0123456789bcdefghjkmnpqrstuvwxyz';
  9.  
  10. lat = Number(latitude);
  11. lon = Number(logitude);
  12. precision = Number(precision);
  13.  
  14. if (isNaN(lat) || isNaN(lon) || isNaN(precision)) throw new Error('Invalid geohash');
  15.  
  16. var idx = 0; // index into base32 map
  17. var bit = 0; // each char holds 5 bits
  18. var evenBit = true;
  19. var geohash = '';
  20.  
  21. var latMin = -90, latMax = 90;
  22. var lonMin = -180, lonMax = 180;
  23.  
  24. while (geohash.length < precision) {
  25. if (evenBit) {
  26. // bisect E-W longitude
  27. var lonMid = (lonMin + lonMax) / 2;
  28. if (lon >= lonMid) {
  29. idx = idx*2 + 1;
  30. lonMin = lonMid;
  31. } else {
  32. idx = idx*2;
  33. lonMax = lonMid;
  34. }
  35. } else {
  36. // bisect N-S latitude
  37. var latMid = (latMin + latMax) / 2;
  38. if (lat >= latMid) {
  39. idx = idx*2 + 1;
  40. latMin = latMid;
  41. } else {
  42. idx = idx*2;
  43. latMax = latMid;
  44. }
  45. }
  46. evenBit = !evenBit;
  47.  
  48. if (++bit == 5) {
  49. // 5 bits gives us a character: append it and start over
  50. geohash += Geohash.base32.charAt(idx);
  51. bit = 0;
  52. idx = 0;
  53. }
  54. }
  55.  
  56. return geohash;
  57. """;
  58.  
  59. select geohashEncode(38.2842289, -0.5580645, 6);
Add Comment
Please, Sign In to add comment