Tuesday, June 19, 2012

geohash adjancent codes

An algorithm to find out neighbors of a geohash code.

  1. Base32: 123456789bcdefghjkmnpqrstuvwxyyz
  2. Neighbors (direction type)
    1. right even: bc01fg45238967deuvhjyznpkmstqrwx
    2. left even: 238967debc01fg45kmstqrwxuvhjyznp
    3. top even: p0r21436x8zb9dcf5h7kjnmqesgutwvy
    4. bottom even: 14365h7k9dcfesgujnmqp0r2twvyx8zb
    5. righ odd= top even (p0r21436x8zb9dcf5h7kjnmqesgutwvy)
    6. left odd= bottom even (14365h7k9dcfesgujnmqp0r2twvyx8zb)
    7. top odd= right even (bc01fg45238967deuvhjyznpkmstqrwx)
    8. bottom odd= left even (238967debc01fg45kmstqrwxuvhjyznp)
  3. Borders (direction type)
    1. right even: bcfguvyz
    2. left even: 0145hjnp
    3. top even: przx
    4. bottom even: 028b
    5. right odd= top even (przx)
    6. left odd= bottom even (028b)
    7. top odd= right even (bcfguvyz)
    8. bottom odd= left even (0145hjnp)
  4. function calculateAdjancent(String srcHashCode, String direction)
              srcHashCode = srcHashCode.toLowerCase();
              char lastCharacter=srcHashCode.charAt(srcHashCode.length-1);
              String type=(srcHashCode.length%2)?'odd': 'even':
              String base=srcHashCode.subString(0,srcHashCode.length-1);
             
              if(Borders[direction][type].indexOf(lastCharacter) != -1)
                       base=calculateAdjancent(base,direction);

              return base+BASE32[Neighbors[direction][type].indexOf(lastCharacter)];

 Ex. find a's right neighbor
       calculateAdjancent(a,right);

No comments:

Post a Comment