为了让广大的开发者
更深入地了解
百度地图开放平台的技术能力
轻松掌握满满的技术干货
更加简单地接入
开放平台的服务
我们特别推出了
“位置服务(LBS)开发微课堂”
系列技术案例
第四期的主题是
《逆地理编码升级》
逆地理编码服务,作为开发者最常用的服务之一,能够将地理坐标转换成用户可以直观理解的结构化地址,让位置信息一目了然。
在该服务中,行政区划和道路数据直接关系到了所提供的地址信息的质量。例如,在天气预报服务中,需要精准描述当前区县或城市的位置信息;而对于外卖、快递等行业来说,详细的道路信息则是必不可少的。
近期,百度地图对逆地理编码接口服务进行了重大升级,升级后的服务引入了不同版本的行政区划数据,可以供开发者根据业务需求灵活选择。同时,还进一步丰富了所返回的道路数据,新增了道路方位和投影点等关键字段,进一步提升了地理位置描述的精确性和用户体验。
01 背景介绍
在具体介绍本次升级之前,需要先介绍两个位置服务中应用广泛的技术:geohash和mbr。
1.1 geohash
geohash是一种常见的空间索引技术,能够高效、准确地查询定位点周边的数据。
geohash是将地球展开成东西经[-180,180]度,南北纬[-90,90]的平面,然后对平面的中间进行一次竖向南北切分得到左右相同的两个格子0、1,再对这两个格子进行横向东西切分得到四个相同的格子00、01、10、11。
接下来我们对这些格子进行递归,切分次数越多,二进制编码越长,网格越小,精度也就越高。
我们使用数字0-9和去掉了a、i、l、o的22个字母,共32个字符,对切分得到的每个格子的01编号每5位进行一个base32编码,最终得到了当前格子的geohash。
例如:119.998,33.9999进行30位编码计算得到geohashint为111001110010001000110011011001,对该编码值每5位进行base32可以得到geohash为wwj36t。
我们可以想象地图上所有的道路、行政区划数据都被放置到某一个或多个网格中。
1.2 mbr
最小边界矩形(Minimum Bounding Rectangle)是计算几何和计算机图形学中的一个概念,它指的是能够完全包含一个给定几何形状或一组点的最小的轴对齐矩形。轴对齐意味着矩形的边与坐标系的轴平行。
在地理信息系统中,mbr被用作空间索引的一部分,以加速空间查询。通过使用mbr,可以快速排除不相关的对象,提高查询效率。最小边界矩形的表达只需要通过左下角和右上角两个x,y即可。
计算最小边界矩形的方式也非常简单,只需要找所有坐标的x的最大最小值,和y的最大最小值,然后将x、y的最小值作为左下角坐标,最大值作为右上角坐标即可。
1.3 通过mbr查询所命中的geohash
通过mbr的左下角和右上角的两个坐标,我们可以快速计算出左下和右上两个顶点的geohash。
由于每个格子的geohashint是经纬度交叉编码,经度切分左0右1、纬度切分上1下0。根据这一特性,我们可以通过位运算的方式快速得到每个相邻网格的geohashint值。
我们以左下和右上两个顶点所在的geohash为边界,使用双层循环,外层循环控制Y轴+1,内存循环控制X轴+1,筛选出mbr所命中的所有的geohash。
02 支持不同版本行政区划数据
给定一个坐标,识别该坐标所属的省、市、区、县、街道五级行政区划,需要经过以下几步:
- 寻找数据源
- 数据预处理
- 数据检索召回
为了提升行政区划数据在各类场景下的准确性,百度地图引入了“民政部”和“统计局”两个数据源。
2.1 行政区划数据来源
目前国内存在“民政部”和“统计局”两套行政区划数据,这两套数据需要进行复杂的数据工艺的处理才可以使用。
新版本的逆地理编码服务可以支持任意版本行政区划数据的召回,供开发者根据业务需求选择。
2.2 行政区划数据预处理
国内行政区划数据都是嵌套式的,一个省下面有多个市,一个市只会属于一个省,区县、乡镇数据类似。
因此只要能判定出当前定位点属于哪个乡镇,通过嵌套关系即可获取所属的省、市、区县的信息。
首先我们将乡镇信息计算mbr。
随后我们计算当前乡镇的mbr所命中的所有geohash,快速过滤掉不相关的geohash,以加快计算速度。然后计算原始行政区划边界和这些geohash的相对位置关系,得到包含、相交、相离三种情况。
由上图我们可以看到,geohash和行政区划数据,是多对多的关系。
我们整理了一份以geohash为key,乡镇数据为value集合的数据结构。对于包含和相交的场景,我们将当前行政区划面数据记录到对应的geohash的value集合里。
2.3 行政区划数据检索召回
对于请求点,我们先计算所属的geohash格子,如果命中的geohash1只有1条行政区划数据记录,则可认为当前请求点属于苏家坨镇;
如果命中的geohash7有两条行政区划数据记录,则需要计算点面位置关系,最终得出请求点所属的行政区划,常见的方式为射线法。
射线法
对于简单的凸多边形或凹多边形,我们可以使用射线法从目标点向任意方向投射一条射线,然后计算这条射线与多边形边界的交点数量来判断点的位置关系:
- 如果射线穿过多边形的边界奇数次,则点在多边形内部。
- 如果射线穿过多边形的边界偶数次,则点在多边形外部。
射线方向可以任意选择,通常选择水平或垂直(并不影响计算结果)。
如上图,水平向右发送射线,点A穿过多边形1次判断在多边形内部,点B穿过多边形2次判断在多边形外部。
03 道路数据更加丰富
在召回道路数据时,新版本的逆地理编码服务不仅可以获取到当前请求点到道路的距离,还能提供道路位于请求点的哪个方位以及道路距离请求点最近的坐标。
例如:环村东路位于东侧248米,道路距离请求点最近的坐标为:115.341877,35.240830。
3.1 道路数据预处理
和面数据匹配算法类似,首先计算线数据的mbr,然后计算mbr所占用的geohash(绿色格子)。
得到mbr之后,计算线段相交的mbr格子(红色格子),代表该道路属于当前格子。
同样的道路和geohash也是多对多的关系,我们也整理了一份以geohash为key,道路信息为value集合的数据结构。
对于相交的道路数据,我们将道路记录到对应geohash的value集合里。
3.2 道路数据检索
对于用户请求,通常以当前请求点为圆点,计算半径300米的圆的mbr,随后通过mbr得到该点周边300米的geohash。
随后将这些geohash包含的道路数据全部取出,首先计算点到线段的投影点,随后根据请求点和投影点,计算得到点到这些线段的距离和方向。然后排序筛选出距离最近的道路信息进行返回。
04 性能卓越,稳定性强
百度地图逆地理编码服务的性能和稳定性一直保持行业领先。我们采用了索引和数据全部加载进内存的方式,减少与磁盘的交互,保证了服务的极限性能。
新功能上线前后,从开放平台入口层采集到的指标没有任何变化,新功能没有对原有性能产生影响,服务依旧保持了卓越的性能。
05 使用指南
5.1 行政区划召回
通过region_data_source参数来控制召回民政部行政区划数据或是统计局行政区划数据。
枚举值 1-统计局;2-民政部。
默认召回民政部行政区划数据。
5.2 道路信息召回
通过extensions_road参数来控制是否召回道路详细信息,最多可以返回周边300米内的3条道路。
全新的逆地理编码接口服务已经发布,欢迎开发者前往百度地图开放平台官网查看使用~!
查看路径:开发者频道>开发文档>Web服务API>全球逆地理编码(lbsyun.baidu.com/faq/api?tit…
未来,百度地图将结合自身海量数据的优势,不断深挖不同行业对地理位置描述的诉求,持续优化逆地理编码服务,让坐标值的语义化描述更加准确。
·END·
你还想了解哪些技术内容?
快来评论区留言告诉我们吧!