使用esri的gis-tools-for-hadoop工具包,在hive中实现空间计算

以基站工参表实现空间关系判断(点在多边形内)为例,使用ESRI的gis-tools-for-hadoop工具包,在hive中实现数据空间计算的几个主要步骤:

  1. 上传空间地理实体数据到hadoop集群;
  2. hive中创建地理实体表;
  3. 与基站工参表做空间判断(点在多边形内)。

一、Hive

Hive是基于Hadoop的数据仓库,采用MPP架构(大规模并行处理),存储结构化数据,提供sql查询功能,sql语句转换为MapReduce任务运行。非常适合数据仓库的统计分析。

二、gis-tools-for-hadoop

gis-tools-for-hadoop是ESRI推出的开源工具包,与hive结合,使用分布式运算实现海量空间数据的存取、计算、关系判断等功能。包括两个jar包:

  1. esri-geometry-api.jar
  2. spatial-sdk-hadoop.jar

jar包下载地址

三、实现空间关系判断和绑定到地理区块

0. 数据准备

将地理实体面数据导出geojson文件,放到同一个目录下(geojson8.31目录)

1. 将地理实体数据和esri的两个jar上传到hadoop集群

hadoop fs -copyFromLocal bch/user/meimei/geojson8.31/* /user/meihong/geojson
hadoop fs -copyFromLocal bch/user/meimei/esri-geometry-api.jar /user/meihong/esri-geometry-api.jar
hadoop fs -copyFromLocal tmp/meimei/spatial-sdk-hadoop.jar /user/meihong/spatial-sdk-hadoop.jar

2. hive中创建地理实体表

use syxzDB;
drop table if exists geo_block;
CREATE TABLE if not exists geo_block (id string, name string, boundaryshape binary, cid string) ROW FORMAT SERDE 'com.esri.hadoop.hive.serde.JsonSerde' STORED AS INPUTFORMAT 'com.esri.json.hadoop.EnclosedJsonInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '/user/meihong/geojson';
select id,cid from geo_block; --测试数据是否导入

3. sql语句实现点在多边形内的空间关系判断,并生成新表

add jar hdfs://bch/user/meimei/esri-geometry-api.jar;
add jar hdfs://bch/user/mei/spatial-sdk-hadoop.jar;
create temporary function ST_Point as 'com.esri.hadoop.hive.ST_Point';
create temporary function ST_Contains as 'com.esri.hadoop.hive.ST_Contains';

insert overwrite table t_cell_match
select cell.city,cell.county,cell.cell_name,cell.net_type,cell.lc,cell.lon,cell.lat,cell.coverage,
geo_block.id,geo_block.name,geo_block.cid from cell left outer join geo_block 
where ST_Contains(geo_block.boundaryshape,ST_Point(cell.lon,cell.lat));

扫码加入我的知识星球:“时空大数据”,可获取更多更高品质的地图、地理信息、GIS、大数据、时空分析、实景三维、地图可视化等方面的知识和文件,前20名可享5折优惠券。
使用esri的gis-tools-for-hadoop工具包,在hive中实现空间计算

上一篇:Redis数据实战之GEO在LBS中应用与自定义新数据类型


下一篇:Uncaught Invalid geoJson format TypeError: Cannot read properties of undefined (reading ‘length‘)