大数据GPS离线解析方法与流程

文档序号:31204804发布日期:2022-08-20 02:25阅读:157来源:国知局
大数据GPS离线解析方法与流程
大数据gps离线解析方法
技术领域
1.本发明属于地理空间应用技术和大数据离线计算领域,具体涉及一种大数据情况下的gps离线解析方法。


背景技术:

2.随着车联网技术的不断发展,越来越多的车主购买智能网联汽车,同时,由这些智能网联汽车产生的用户行为数据也越来越多,其中就包含汽车的轨迹数据。轨迹数据中记录着不同时刻汽车的gps定位信息,在进行地域相关的统计时,需要先根据gps坐标解析出其现实意义的物理地址,从而识别出gps点所属的区域(省、市、区县)。在大数据背景下,快速的解析出gps位置数据成为一种必要的需求。
3.针对gps点物理地址的解析,通常的技术手段是调用地图服务供应商所提供的api接口来实现。但是若每一个gps点都进行api接口的调用,由于调用接口都有时间延迟,对于大量的gps点进行解析时,响应时间会很长,并且响应时间会随着数据量的增加而线性增长。显然,这种逐个调用接口的方式不适用于大量gps点的快速解析。
4.为解决上述问题,公开号为cn113138985a的中国专利文献公开了一种gps数据解析方法及系统,在该申请中,通过将已解析的gps位置数据存入数据库,避免了每次重复的去调用接口解析之前已经解析过的gps位置数据。该方法随着已解析数据的增多,可以一定程度上提高后续解析的速度,但其仍然是逐条地解析,并且依赖于接口的调用,解析过程较为复杂,在大数据情况下,解析速度受到限制。
5.因此,提供一种解析过程基于数据库的、不依赖于接口调用的gps位置数据快速解析方法成为本领域技术人员需要解决的问题。


技术实现要素:

6.针对上述现有技术的不足,本发明所要解决的技术问题是:如何提供一种无需依赖接口调用,且解析简便和快捷的gps离线解析方法。
7.为了解决上述技术问题,本发明采用了如下的技术方案:
8.一种大数据gps离线解析方法,其特征在于,包括如下步骤:s1,通过geohash对一定经纬度范围内的区域按给定精度全面编码,并调用接口解析编码中的各区域gps位置数据,将返回的gps位解析信息和所有gps位置点的geohash编码存储在一标准表内;s2,在数据库中注册与s1中相同的geohash编码自定义函数;s3,通过自定义函数编码当前车辆行驶轨迹中的gps位置信息,然后与s1中的标准表关联,从而大批量获取行驶轨迹中gps位置点对应的区域信息。这样,通过在经纬度范围内各个gps点进行编码,并将编码与位置点的解析信息对应后,存储在标准表后,若使用时,无需再批量对行驶轨迹进行解析,并在离线的情况下使用标准表内的编码点来查询该编码点的位置信息。这种方式,只需事先一次性录入整个解析后的信息,后续直接将编码与解析信息对应,查询方式简便,快捷,且标准表稳定,在较长时间内无需更新和改变,解析成本低。
9.进一步的,采用geohash进行编码的具体步骤如下:先将所要编码的gps位置点的经度和纬度分别转换为二进制编码,然后将产生的经度二进制编码和纬度二进制编码合并,最后,将合并后的二进制编码转换为10进制竖直,生成base32编码。所采用的编码能够确保位置点与经度和纬度相对应,确保位置点正确,合并后能够准确对应位置点,确保位置点所对应地点足够准确。
10.进一步的,通过geohash对一定经纬度范围内的区域按需求精度全面编码时,先选取靠近该经纬范围内的地理几何中心为一个随机点作为编码起始点,通过不断向周围点扩展的方式,在给定的精度上,不断对该经纬范围内的所有gps位置点进行编码。这样,以中心点向外扩展的方式,可避免编码遗漏。
11.进一步的,编码的给定精度与编码长度相对应,所述编码长度为1至12的整数。编码越长,所对应的精度就越高。
12.进一步的,当对随机选取的几何中心点通过geohash编码后,先将中心点的geohash编码放入已解析list,将中心点以外的其余所有geohash对象加入待解析队列;然后,判断已解析list是否为空,线程池线程是否无运行,如果list为空且无正在运行线程,则结束解析;若否则从线程池获取线程,消费队列中的geohash对象,根据对象中心点gps位置数据,调用api接口获取gps的解析信息;判断解析的信息是否正常,如果异常则结束该geohash对象的继续执行,如果正常,则将解析信息和geohash编码存入标准表,同时获取该geohash对象临近的多个geohash对象,并分别判断这几个geohash对象的中心点是否在选定的经纬度范围内,如果不在范围内,则结束该geohash对象的继续执行,如果在范围内,则判断geohash编码是否在已解析list中,如果在已解析list中,则结束该geohash对象的继续执行,如果不在已解析list中,则将该geohash对象加入待解析队列,等待解析。这样,通过线程池的方式来确保编码是否有遗漏,确保所有位置点都对应有一个编码,而在调用接口对编码解析信息的判定,可有效确保信息的准确性。同时对一个经纬度范围内的多个对象进行编码判断,能够有效确保编码信息的准确性。
13.进一步的,所述geohash编码自定义函数继承org.apache.hadoop.hive.ql.exec.udf类且实现evaluate函数。这样,可以在hive中直接使用自定义函数对给定经纬度在指定精度上进行geohash编码。
14.与现有技术相比,本发明得到的大数据gps离线解析方法具有如下优点:1、设置标准表后,避免逐条调用接口解析gps点;2、可进行大批量gps位置点的区域信息离线解析,大大提高了gps点的解析效率。
附图说明
15.图1为实施例中大数据gps离线解析方法的流程图;
16.图2为实施例中获取标准表的流程图。
具体实施方式
17.下面结合附图和实施例对本发明进一步说明。
18.实施例:
19.如图1所示,本实施例提供的大数据gps离线解析方法,它包括如下步骤:s1,通过
geohash对一定经纬度范围内的区域按给定精度全面编码,并调用接口解析编码中的各区域gps位置数据,将返回的gps位解析信息和所有gps位置点的geohash编码存储在一标准表内(具体的,所述标准表在数据库内,且为hive分布式表);s2,在数据库中注册与s1中相同的geohash编码自定义函数;s3,通过自定义函数编码当前车辆行驶轨迹中的gps位置信息,然后与s1中的标准表关联,从而大批量获取行驶轨迹中gps位置点对应的区域信息。
20.具体的,本实施例中所采用的编码方式为geohash编码。geohash是一种地理编码方法,其基本原理是将地球理解为一个二维平面,根据经纬度将平面递归分解成更小的子块,每个子块在一定的经纬度范围内拥有相同的编码。geohash将经纬度转换成字符串,并且在大部分情况下,字符串前缀匹配越多的距离越近。
21.geohash算法一共分三步,以经纬度(116.389550,39.928167)为例进行算法说明,具体如下:
22.首先,将经纬度转换为二进制。将纬度区间[-90,90]二分为[-90,0)、[0,90],可以确定39.928167属于右区间[0,90],标记为1;接着将[0,90]二分为[0,45)、[45,90],可以确定39.928167属于左区间[0,45),标记为0;递归上述拆分过程,39.928167总是属于拆分后的某个区间,且随着拆分次数的增加,这个区间会越来越逼近39.928167;最终我们可以得到纬度39.928167产生的二进制编码为101110001100011。同理,在地球的经度区间[-180,180]进行拆分,对经度116.389550进行逼近编码,可以得到经度116.389550产生的二进制编码为110100101100010。具体的,纬度39.928167的二进制编码如表1所示:
[0023][0024]
表1
[0025]
其次,将经纬度产生的二进制编码进行合并。经度放在偶数位,纬度放在奇数位,特别注意位数从0开始,0为偶数位。因此将(116.389550,39.928167)产生的编码合并后得到111001110100100011110000001101。
[0026]
最后,将合并后的二进制转换为10进制数据,然后生成base32编码。base32编码由数字(0-9)+字母(去掉a,i,l,o)组成。每5个二进制位得到一个10进制数,取值范围为0-31,分别对应base32编码的32个字符。从而可以得到(116.389550,39.928167)合并后的二进制
编码对应的10进制数为28、29、4、15、0、13,对应的base32编码为wx4g0e。
[0027]
具体的,数字与base32编码字符的对应关系如图2所示。
[0028][0029]
表2
[0030]
geohash编码后的长度不同,对应的精度也不同。同一块区域,编码长度越长,精度就越高,但同时该区域对应的编码数也会越多。实际应用中,应综合考虑编码精度和编码数,选择合适的编码长度。为便于理解,本实施例中所给出的geohash编码长度与精度的对应关系如表3所示:
[0031]
geohash长度宽度高度15009.4km4992.6km21252.3km624.1km3156.5km156km439.1km19.5km54.9km4.9km61.2km609.4m7152.9m152.4m838.2m19m94.8m4.8m101.2m59.5cm1114.9cm14.9cm123.7cm1.9cm
[0032]
表3
[0033]
在java中,利用开源的geohash包实现geohash算法。引入pom依赖:
[0034][0035][0036]
继而调用geohash类的静态方法实现:
[0037]
double lat=39.928167;
[0038]
double lon=116.389550;
[0039]
intprecision=7;
[0040]
geohash geohash=geohash.withcharacterprecision(lat,lon,precision);
[0041]
string hashcode=geohash.tobase32();
[0042]
其中,lat代表纬度,lon代表经度,precision代表geohash编码位数,precision取1到12的整数。为了对中国境内的区域进行全面编码,得到geohash编码和省、市、区县等的对应关系,综合考虑编码数量和编码精度,本实施例中将编码长度定为7。
[0043]
通过geohash对一定经纬度范围内的区域按需求精度全面编码时,先选取靠近该经纬范围内的地理几何中心为一个随机点作为编码起始点,通过不断向周围点扩展的方式,在给定的精度上,不断对该经纬范围内的所有gps位置点进行编码。这样,以中心点向外扩展的方式,可避免编码遗漏。
[0044]
如图2所示,本实施例中构件标准表的流程具体如下:
[0045]
步骤1,当对随机选取的几何中心点通过geohash编码后,先将中心点的geohash编码放入已解析list,将剩下的geohash对象加入待解析队列;
[0046]
步骤2,判断已解析list是否为空,线程池线程是否无运行,如果list为空且无正在运行线程,则结束解析;若否,则执行下一步;
[0047]
步骤3,从线程池获取线程,消费队列中的geohash对象,根据对象中心点gps位置数据,调用api接口获取gps的解析信息;
[0048]
步骤4,判断解析的信息是否正常,如果异常则结束该geohash对象的继续执行,如果正常,则执行下一步;
[0049]
步骤5,将解析信息和geohash编码存入标准表,同时获取该geohash对象临近的8个geohash对象,并分别判断这8个geohash对象的中心点是否在选定的经纬度范围内,如果不在范围内,则结束该geohash对象的继续执行,如果在范围内,则对该geohash对象执行下一步;
[0050]
步骤6,判断geohash编码是否在已解析list中,如果在已解析list中,则结束该geohash对象的继续执行,如果不在已解析list中,则将该geohash对象加入待解析队列,等待解析。
[0051]
通过以上步骤,可以将中国范围内的区域在指定精度上完成编码,每个geohash编码和对应的物理地址信息都存入了标准表。标准表的字段名以及字段类型如表4所示:
[0052]
字段标识数据类型含义geohashstringgeohash编码province_codestring省份代码province_namestring省份名称city_codestring城市代码city_namestring城市名称district_codestring区县代码district_namestring区县名称addrstring物理地址
[0053]

[0054]
这样,通过线程池的方式来确保编码是否有遗漏,确保所有位置点都对应有一个编码,而在调用接口对编码解析信息的判定,可有效确保信息的准确性。同时对一个经纬度范围内的多个对象进行编码判断,能够有效确保编码信息的准确性。
[0055]
由于大量的轨迹数据存储hive分布式表中,hive中并没有现成相同的geohash编码函数,所以在得到标准表之后,在实际解析轨迹数据中的gps位置数据前,我们还需要注册geohash编码的自定义函数。本实施例中,自定义函数需继承org.apache.hadoop.hive.ql.exec.udf类且实现evaluate函数,具体如下:
[0056]
将其打包成jar包,放到hdfs相关路径下,比如hdfs:///home/udf/hive/geohash.jar,在hive客户端执行命令:
[0057]
create function default.geohash as'udfgeohash'using jar'hdfs:///home/udf/hive/geohash.jar';
[0058]
然后我们就可以在hive库中通过default.geohash(lat,lon,precision)来得到经纬度为(lon,lat)、编码长度为precision的geohash编码了。
[0059]
在完成标准表和geohash自定义函数后,实际解析大批量路径中的gps位置数据时,只需要简单地通过自定义函数编码gps位置数据,然后与标准表join查询即可。下面给出了一个sql示例:
[0060][0061][0062]
其中ods.car_driving为轨迹表,day='2021-01-01'表示只取2021年1月1日这一天的轨迹数据,dim.geohash_standard表示标准表。上面sql得到了gps点与对应解析位置的信息。
[0063]
至此,我们完成了轨迹数据中gps位置数据的批量离线解析。
[0064]
最后需要说明的是,以上实施例仅用以说明本发明的技术方案而非限制技术方案,尽管申请人参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,那些对本发明的技术方案进行修改或者等同替换,而不脱离本技术方案的宗旨和范围,均应涵盖在本发明的权利要求范围当中。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1