geohash地图_通过GeoHash匹配将中国二手经济放在地图上

geohash地图

阿里巴巴仙宇科技团队如何重新编码GPS数据并将十亿个项目映射到本地“商业区”

在中国正在崛起的电子商务平台中,阿里巴巴的闲鱼已成为买卖二手商品的热门新目的地,全国已有超过十亿用户提交商品。 这种庞大的库存量不仅分布在全国各地的仓库中,而且分布在全国“商业区”的各个家庭中,这已经挑战了应用程序的设计师,利用GPS定位数据来为物品和购买者加快货物的流动,这是传统处理方法所面临的挑战到目前为止,还没有找到适合的选择。

为了构建可扩展的系统,以有效地将商品和购买者匹配到商业区,Xianyu团队使用了一套算法,基于GeoHash精确匹配对位置数据进行重新编码,从而大大减少了完成交易所需的计算量。 该方法还提供了一种新颖的方法,用于为与算法识别的区域相邻的区域推断代码,从而再次减少了繁重的计算。

让我们仔细看一下Xianyu的成就背后的努力,以及该应用程序的框架如何简化编码上下文中的空间关系。

解决问题

为了有效地将城市划分为较小的商业区,鲜玉首先评估了交通网络以及购物中心和居民区的分布等因素,然后像阿里巴巴的故乡杭州一样,对分区进行了制图。

杭州市仙屿商业区地图

根据用户共享的GPS信息,首先将平台上列出的项目编码为点数据,这些数据以未排序的方式分布在区域地图上。 仙屿使用此GPS数据对位于商业区内的物品进行库存,并将其推荐给位于同一地区的可能的买家。 因此,有用的建议取决于对指定商业区域内项目的准确计算。

根据先玉数据库中的计算,商务区充当多边形数据参数,它们的形状和大小不同,并且彼此不重叠。 同时,项目是带有GPS标签的点数据。 问题是,先玉如何快速,准确地确定这些海量数据点所属的商务区? 传统方法是使用空间关系方程式来计算点-表面关系,但这涉及处理大量数据-考虑到在咸鱼上交易的商品数量,这一任务已经超出了可行性。

总体而言,中国城市被划分为大约10,000个不同规模的商业区,每个商业区的参数行范围从10到80。 使用上述方法将项目与商业区进行匹配,必须完成20万亿次基本操作才能处理总数据量。 尝试使用该方法运行超过两天后,使用阿里巴巴内部离线计算群集采取这种方法未返回任何结果。

面对创新的需要,鲜宇使用了基于GeoHash的精确匹配算法和粗糙的GeoHash匹配,并在一定程度上使用了基于空间关系方程的精确匹配算法。 在一天之内,这种方法能够成功返回相同任务的结果,从而准确匹配10亿个项目和10,000个商业区的数据。

GeoHash点数据的技术原理

在最基本的层次上,GeoHash将2D地理坐标编码为字母和数字字符串。 这些字符串中的每一个代表一个特定的地理矩形,并由该矩形内的所有坐标共享。 因此,字符串越长,对应的矩形将越小且定义更精确。

在对地理位置进行编码时,计算目标纬度和经度以决定它们是否落在原始间隔[-90,90]的左侧或右侧区间(对于纬度)和[-180,180]。 记录在左边的点为0,记录在右边的点为1。 然后将上一步中获得的间隔对半折叠,以执行进一步的搜索功能,进而返回新的二进制代码。 当此过程导致长度达到所需精度的二进制代码时,将根据以下规则对代码进行交织:将经度值放在偶数位上,将纬度值放在奇数位上,从而生成新的二进制字符串。 在最后一步中,根据Base32表将该二进制字符串转换为字符串,这将生成精确的地理坐标的GeoHash字符串。

下面给出了坐标为“ 30.280245,120.027162”的GeoHash字符串计算示例。 首先,纬度是二进制文件,已根据以下步骤进行了编码:

1.将[-90,90]分为两个相等的部分。 “ 30.280245”位于右部分(0,90),因此第一位是1。

2.将[0,90]分为两个相等的部分。 “ 30.280245”位于左部分(0,45),因此第二位为0。

3.继续重复此过程,使结果间隔越来越小,其两个端点越来越接近“ 30.280245”。

下图所示的过程详细介绍了第一轮迭代:

这些迭代将继续进行,直到代码的长度达到所需的精度为止。 15位二进制代码的完整迭代表如下:

所得的纬度二进制代码为10101 01100 01000。

经度的二进制代码可以通过相同的迭代过程来获得:

经度的所得二进制代码是11010 10101 01101。

按照将经度值放在偶数位比特上并将纬度值放在奇数位比特上的规则,然后对纬度和经度的二进制代码进行交织以生成最终的二进制代码:11100 11001 10011 10010 00111 00010。

接下来,确定Base32码,每五个二进制码对应一个双十二进制码。 因此,将五个二进制位转换为十进制位,返回值为28、25、19、18、7、2。基于下面的Base32代码表,所得代码为wtmk72。

这些结果可以随后在geohash.org上进行验证。 在这种情况下,验证结果如下:

geohash.org结果中显示的前几位与之前的计算结果一致。 如验证网站所示,通过二进制除法过程进行的多轮迭代同样可以返回更长,更精确的结果。

GeoHash字符串的长度与精度相对应,如下所示:

获取表面数据的GeoHash代码

上一节介绍的标准GeoHash算法只能计算2D点坐标的GeoHash代码。 但是,为了完成位置匹配任务,Xianyu还需要一种方法来确定相关表面数据(地理信息系统或GIS中的多边形对象)的GeoHash代码。 这需要对先前工作中应用的算法进行进一步扩展。

此方法的第一步是确定所讨论多边形的最小边界矩形(MBR),然后计算MBR西南角坐标的GeoHash代码。 在逆GeoHash编码过程中确定与该GeoHash代码相对应的矩形GeoHash块。 从此GeoHash块开始,Xianyu的机制然后搜索与北部和东部相同大小的相邻GeoHash块,直到从MBR完全定义了GeoHash块为止。 这样放置的某些GeoHash块的边缘可能不会与所讨论的多边形相交,如果是,则必须通过后续步骤中详细介绍的一系列计算来删除这些块。

对于上面的示例,下面给出了结果的高清图像,其中蓝色的GeoHash块与原始多边形部分相交,橙色的GeoHash块完全包含在其中。

以下流程图演示了上述算法:

查找相邻GeoHash块的快速算法

在上一节的GeoHash编码流程图中,用青绿色和橙色标记的两个步骤分别负责查找与东部和北部相邻的GeoHash字符串。

通过常规方法,可以使用描述当前已解码的GeoHash块的信息来获取相邻块内一个点的坐标。 然后将该点进行GeoHash编码,并将结果用作相邻块的GeoHash代码。 如下图所示,获取“ wtmk72”周围的8个相邻块的代码涉及将“ wtmk72”解码为4个顶点(N1,N2,N3和N4)的坐标,这是使用逆GeoHash编码过程完成的。 然后将这些坐标用于计算N5的坐标,N5是右侧相邻块内的随机点。 然后对N5进行GeoHash编码,以获取“ wtmk78”,即右侧相邻块的代码。 可以以相同的方式获得“ wtmk72”周围其他7个相邻块的代码。

该方法需要解码处理,然后是编码处理。 这会占用大量时间,尤其是如果指定的GeoHash字符串很长(因此需要许多解码编码周期)时。

通过观察GeoHash编码表的模式和Z阶曲线的特征,Xianyu能够验证一种通过查找表快速确定相邻GeoHash字符串的方法。

在这里继续使用GeoHash字符串“ wtmk72”作为示例是有意义的。 相应的十进制数字为“ 28、25、19、18、7、2”,二进制代码为11100 11001 10011 10010 0011100010。其中w对应于代表“经度,纬度,经度,纬度”的5个二进制代码11100。 t分别对应于5个二进制代码11001,分别代表“纬度,经度,纬度,经度,纬度”。 为了概括此结果,GeoHash字符串中的奇数位字符(在此示例中为“ w”,“ m”和“ 7”)表示对应于“经度,纬度,经度,纬度,经度”的二进制位,而偶数位置位字符(在此示例中为“ t”,“ k”和“ 2”)表示与“纬度,经度,纬度,经度,纬度”相对应的二进制位。

“ w”的二进制代码为11100,翻译为“右,上,右,下,左”。 “ t”的二进制代码为11001,翻译为“上,右,下,左,上”。

此字符方向转换揭示了下表中显示的奇数位的字符位置映射:

以下是偶数位位的字符位置映射表:

有趣的是,这两个表可以通过反转其轴并相应地进行换位而相互转换。

通过使用这两个表,Xianyu的系统可以快速确定每个字符周围的8个字符。 要计算给定GeoHash字符串周围的8个GeoHash值:

·如果字符串的最后一个字符未超出该方向的边界,则方法是保持前几个字符不变,并沿该方向取得相邻字符。

·如果最后一个字符在此方向上超出表格边界,则方法是在该方向上找到倒数第二个字符的相邻字符,然后在同一方向上找到最后一个字符的圆形相邻字符。

·如果倒数第二个字符在此方向上的相邻字符也落在表格边界之外,则必须首先在该方向上找到倒数第二个字符的相邻字符,依此类推。

考虑“ wtmk72”的示例,找到围绕此GeoHash字符串的8个字符串等效于找到最后一个字符“ 2”的相邻字符。 偶数位表适用于'2',其8个相邻字符为'1','3','9','0','8','p','r','x',其中,“ p”,“ r”和“ x”落入表格的下边界,并且通过连接偶数位表格的上部和下部获得邻接关系。 对于这3个位于边界之下的字符,方法是在倒数第二个字符“ 7”下方找到相邻的字符。 “ 7”在奇数位上,因此此处使用奇数位表。 表中紧接在“ 7”下方的相邻字符是“ 5”。 因此,“ wtmk72”,“ wtmk73”,“ wtmk79”,“ wtmk70”,“ wtmk78”,“ wtmk5p”,“ wtmk5r”和“ wtmk5x”的8个相邻的GeoHash字符串。

使用这种相邻的以字符为中心的快速算法,上一部分流程图中详细介绍的表面数据GeoHash编码算法变得更加高效。

将质量点数据与曲面数据链接

Xianyu建立海量点数据与地面数据之间链接的新方法涉及到计算物料GPS数据(点数据)和商业区AOI数据(多边形数据)的GeoHash代码,如使用上述算法所详述。 这些GeoHash代码的长度相同,并且每个点数据都有唯一的GeoHash字符串。 同样,每条表面数据都对应一个或多个GeoHash代码,这些代码“完全包含”或“部分包含”。

为了继续使用这些完全包含的字符串,鲜宇将所有项目的GeoHash字符串加入了商务区字符串。 所得的<items,business district>数据使您能够确定这些项目所属的商业区。

对于仍需要确定适当商业区的其他项目,方法是将其GeoHash字符串加入部分包含的商业区字符串中。 生成的<项目,商业区>数据指示可能的“商业区项目”包含模式。 为了验证这种包含关系,对商品的GPS数据和商业区AOI数据进行了几何关系运算。

如下图所示,第1项的点数据的GeoHash代码为“ wtmk70j”,成功将其与曲面数据的完全包含的字符串“ wtmk70j”结合在一起。 这确认了可以将项目1归类为属于此表面数据。

项目2的点数据的GeoHash代码为“ wtmk70r”,成功将其连接到表面数据的部分包含的字符串“ wtmk70r”。 因此,项目2似乎属于表面数据,尽管这需要进一步的几何点-表面计算进行确认。 项目3的点数据的GeoHash代码与表面数据的任何GeoHash块代码都不匹配,后者可以快速确认项目3不属于此表面数据。

在实际情况下,需要有效地协调来自中国各地的大量项目GPS数据和大量的商业区数据。 通常,由于完全包含在表面数据的第一个实例中,大多数项目可以一步分配到商业区。 对于其他项目,GeoHash匹配可以减少几何计算,以将项目和商业区从“ 1个项目x全国所有商业区”直角坐标产品规模匹配到“ 1个项目x 1个(或多个)商业区”直角坐标产品规模匹配。 这样,可以避免绝大多数不必要的几何计算,从而节省了大量时间。

在实践中,咸鱼使用本文详细介绍的快速算法处理了10亿个项目和10,000个商业区的数据,Xianyu使用了10亿个GeoHash点编码计算,10,000个GeoHash表面编码计算和500万次计算来确定点是否落在表面内,总共约有1800亿个基本运算,仅是传统方法所需的20万亿个基本运算中的很小一部分。 使用本文详细介绍的算法,阿里巴巴的离线计算平台在不到一天的时间内完成了这一壮举。

有许多几何算法可以确定给定点与多边形之间的包含关系。 最常用的是射线投射算法。 简而言之,这涉及从该点绘制射线并计算射线与多边形线相交的次数。 如果数字为奇数,则该点位于多边形内部;否则,该点位于多边形内。 如果不是,它必须在它之外。

本质上,使用GeoHash简化大量点数据和表面数据之间空间关系的计算是一种空间索引方法。 GIS领域已应用了许多有用的空间索引技术,包括R树系列(R树,R +束,R *树),四叉树,KD树和网格索引,每种索引都有其自己的独特特性。 除了处理点-面关系问题之外,本文中的方法还可以快速处理点-点,多边形-多边形,点-线和线-线关系。 例如,可以快速确定大型公交车站属于哪条道路,以及多条道路或铁路是否相交。

(罗俊峰罗俊沣原创)

参考

[1] https://en.wikipedia.org/wiki/Geohash

[2] https://en.wikipedia.org/wiki/Pointinpolygon

[3] https://www.geeksforgeeks.org/how-to-check-if-a-given-point-lies-inside-a-polygon

[4] https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/search-aggregations-bucket-geohashgrid-aggregation.html

[5] http://blog.notdot.net/2009/11/Damn-Cool-Algorithms-Spatial-indexing-with-Quadtrees-and-Hilbert-Curves

阿里巴巴科技

关于阿里巴巴最新技术的第一手和深入信息→Facebook: “阿里巴巴技术” 。 Twitter: “阿里巴巴技术”

翻译自: https://hackernoon.com/putting-chinas-second-hand-economy-on-the-map-with-geohash-matching-f6eb7626ff96

geohash地图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值