求geoHash查询附件8个格子的原理。

ysm1850 2014-12-12 11:34:02
通过坐标实现附件地图的搜索。 可以参考这位仁兄的 码农SW 的转帖 http://blog.csdn.net/suwei19870312/article/details/9266577。
大概内容是坐标点根据geohash加密获取一块字符串块。 这个字符串表示一块区域里的所有坐标串。
但是为了解决边缘问题,需要计算这个块周围的八个格子。 请问计算周围8个格子的原理是什么。
...全文
433 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐三角 2014-12-18
  • 打赏
  • 举报
回复
http://en.wikipedia.org/wiki/Geohash
a12939026 2014-12-17
  • 打赏
  • 举报
回复
你贴出来的代码 不是关键点吧。。 calculateAdjacent 重点要看着方法吧。
ysm1850 2014-12-12
  • 打赏
  • 举报
回复
	private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'b', 'c', 'd', 'e',
			'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };

	public static final Map<String, String> BORDERS = new HashMap<String, String>();
	public static final Map<String, String> NEIGHBORS = new HashMap<String, String>();
	static {
		NEIGHBORS.put("right:even", "bc01fg45238967deuvhjyznpkmstqrwx");
		NEIGHBORS.put("left:even", "238967debc01fg45kmstqrwxuvhjyznp");
		NEIGHBORS.put("top:even", "p0r21436x8zb9dcf5h7kjnmqesgutwvy");
		NEIGHBORS.put("bottom:even", "14365h7k9dcfesgujnmqp0r2twvyx8zb");

		NEIGHBORS.put("right:odd", "p0r21436x8zb9dcf5h7kjnmqesgutwvy");
		NEIGHBORS.put("left:odd", "14365h7k9dcfesgujnmqp0r2twvyx8zb");
		NEIGHBORS.put("top:odd", "bc01fg45238967deuvhjyznpkmstqrwx");
		NEIGHBORS.put("bottom:odd", "238967debc01fg45kmstqrwxuvhjyznp");

		BORDERS.put("right:even", "bcfguvyz");
		BORDERS.put("left:even", "0145hjnp");
		BORDERS.put("top:even", "prxz");
		BORDERS.put("bottom:even", "028b");

		BORDERS.put("right:odd", "prxz");
		BORDERS.put("left:odd", "028b");
		BORDERS.put("top:odd", "bcfguvyz");
		BORDERS.put("bottom:odd", "0145hjnp");
	}


	public static String[] getGeoHashExpand(String geohash) {
		try {
			String geohashTop = calculateAdjacent(geohash, "top:");
			String geohashBottom = calculateAdjacent(geohash, "bottom:");
			String geohashRight = calculateAdjacent(geohash, "right:");
			String geohashLeft = calculateAdjacent(geohash, "left:");

			String geohashTopLeft = calculateAdjacent(geohashLeft, "top:");
			String geohashTopRight = calculateAdjacent(geohashRight, "top:");
			String geohashBottomRight = calculateAdjacent(geohashRight, "bottom:");
			String geohashBottomLeft = calculateAdjacent(geohashLeft, "bottom:");

			String[] expand = { geohash, geohashTop, geohashBottom, geohashRight, geohashLeft, geohashTopLeft,
					geohashTopRight, geohashBottomRight, geohashBottomLeft };
			return expand;
		} catch (Exception e) {
			logger.error("GeoHash Error",e);
			return null;
		}
	}

以上就根据一个geohash值 获取周围8个geohash值的代码,但是不知道原理。求教!
ysm1850 2014-12-12
  • 打赏
  • 举报
回复
引用 1 楼 a12939026 的回复:
我没有深入的理解过GEO,不过简单的来说,GEO就是将一个块分为32个小块,然后不断细分下去。 你可以自己画个图,32个小块的位置其实是固定的,这样每个小块的周围8个的编码也可以固定(就算你找不出公式,最多存32份数据作为基础即可)
我现在是有公式,有代码,但是不知道是什么原理。
a12939026 2014-12-12
  • 打赏
  • 举报
回复
我没有深入的理解过GEO,不过简单的来说,GEO就是将一个块分为32个小块,然后不断细分下去。 你可以自己画个图,32个小块的位置其实是固定的,这样每个小块的周围8个的编码也可以固定(就算你找不出公式,最多存32份数据作为基础即可)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧