跳转至

地理相关函数

函数

GREAT_CIRCLE_DISTANCE

计算两个坐标之间的距离。

CREATE TEMPORARY FUNCTION
  GREAT_CIRCLE_DISTANCE
AS
  'tech.leovan.hive.udf.geo.GreatCircleDistanceUDF';

参数

返回值

距离(单位:千米):DOUBLE 类型

示例

SQL:

SELECT
  GREAT_CIRCLE_DISTANCE(39.909175, 116.397452, 31.239698, 121.499707)
;

输出结果为:

1067.9805366585604

SQL:

SELECT
  GREAT_CIRCLE_DISTANCE(
      39.909175, 116.397452, 31.239698, 121.499707,
      'gcj02', 'mean')
;

输出结果为:

1067.9805366585604

SQL:

SELECT
  GREAT_CIRCLE_DISTANCE(
      39.909175, 116.397452, 31.239698, 121.499707,
      'gcj02', 'equatorial')
;

输出结果为:

1069.1754509458906

GEOHASH_ENCODE

根据给定的经纬度计算指定精度的 Geohash。

CREATE TEMPORARY FUNCTION
  GEOHASH_ENCODE
AS
  'tech.leovan.hive.udf.geo.GeohashEncodeUDF';

参数

  • LATITUDE(必选):DOUBLE 类型,坐标纬度
  • LONGITUDE(必选):DOUBLE 类型,坐标经度
  • PRECISION(必选):INTEGER 类型,Geohash 精度

返回值

Geohash 编码:STRING 类型

示例

SQL:

SELECT
  GEOHASH_ENCODE(39.909175, 116.397452, 7)
;

输出结果为:

wx4g09n

GEOHASH_DECODE

根据 Geohash 计算中心点纬度、中心点经度、边界纬度最小值、边界纬度最大值、边界经度最小值、边界经度最大值。

CREATE TEMPORARY FUNCTION
  GEOHASH_DECODE
AS
  'tech.leovan.hive.udf.geo.GeohashDecodeUDF';

参数

  • GEOHASH(必选):STRING 类型,Geohash

返回值

中心点纬度、中心点经度、边界纬度最小值、边界纬度最大值、边界经度最小值、边界经度最大值的数组:ARRAY<DOUBLE> 类型

示例

SQL:

SELECT
  GEOHASH_DECODE('wx4g09n')
;

输出结果为:

[
  39.90852355957031,
  116.39808654785156,
  39.9078369140625,
  39.909210205078125,
  116.39739990234375,
  116.39877319335938
]

COORDINATE_SYSTEM_CONVERT

根据给定的经纬度以及转换前后坐标系计算转换后坐标系的经纬度。

CREATE TEMPORARY FUNCTION
  COORDINATE_SYSTEM_CONVERT
AS
  'tech.leovan.hive.udf.geo.CoordinateSystemConvertUDF';

参数

返回值

转换后坐标系的经纬度:ARRAY<DOUBLE> 类型

示例

SQL:

SELECT
  COORDINATE_SYSTEM_CONVERT(39.909175, 116.397452, 'GCJ02', 'WGS84')
;

输出结果为:

[
  39.90777149066542,
  116.39120837626726
]

附录

Geohash 误差

GeoHash 精度 纬度 Bits 经度 Bits 纬度误差 经度误差 距离误差(千米)
1 2 3 ±23 ±23 ±2500
2 5 5 ±2.8 ±5.6 ±630
3 7 8 ±0.70 ±0.70 ±78
4 10 10 ±0.087 ±0.18 ±20
5 12 13 ±0.022 ±0.022 ±2.4
6 15 15 ±0.0027 ±0.0055 ±0.61
7 17 18 ±0.00068 ±0.00068 ±0.076
8 20 20 ±0.000085 ±0.00017 ±0.01911
9 22 23 ±0.000021 ±0.000021 ±0.00478
10 25 25 ±0.00000268 ±0.00000536 ±0.0005971
11 27 28 ±0.00000067 ±0.00000067 ±0.0001492
12 30 30 ±0.00000008 ±0.00000017 ±0.00000186