尝试使用我可以找到的JAR(不确定它们是否是最佳选择,我需要使用ESRI并在Hive中进行操作):

ADD JAR /home/user/lib/esri-geometry-api-1.2.1.jar;
ADD JAR /home/user/lib/spatial-sdk-hive-1.1.1-SNAPSHOT.jar;
ADD JAR /home/user/lib/esri-geometry-api.jar;
ADD JAR /home/user/lib/spatial-sdk-hadoop.jar;

CREATE TEMPORARY FUNCTION ST_Polygon AS 'com.esri.hadoop.hive.ST_Polygon';
CREATE TEMPORARY FUNCTION ST_Point AS 'com.esri.hadoop.hive.ST_Point';
CREATE TEMPORARY FUNCTION ST_Contains AS 'com.esri.hadoop.hive.ST_Contains';
CREATE TEMPORARY FUNCTION ST_Geometry AS 'com.esri.hadoop.hive.ST_Geometry';

运行以下查询:
SELECT
    IF(1=1, 40.7484445, 0) AS latitude,
    IF(1=1,-73.9878531, 0) AS longitude
FROM any_table
WHERE
    NOT ST_Contains(
        ST_POLYGON('POLYGON((170.0 20.0, -170.0 73.0, -50.0 20.0, -50.0 73.0))'),
        ST_Point(CAST(longitude AS DOUBLE), CAST(latitude AS DOUBLE)))
LIMIT 1;

在多边形'POLYGON((170.0 20.0, -170.0 73.0, -50.0 20.0, -50.0 73.0))'大致为美国框的情况下,给定的坐标40.7484445,-73.9878531属于纽约。结果在WHERE NOT中为空,但仍返回这些坐标。它没有按预期进行过滤。

我做错了什么?

最佳答案

只能加载几何API的一个版本。同样,只有spaced-sdk-hadoop或一对spaced-sdk-json和spaced-sdk-hive中的一个。

WKT多边形的末端顶点重复起始顶点。

多边形需要按顶点顺序指定,而不是按锯齿形顺序排列。

几何API是平面的,将不支持在国际日期变更线周围进行环绕。

预期纬度为-170而不是+170。

wget https://github.com/Esri/spatial-framework-for-hadoop/releases/download/v1.1/spatial-sdk-hive-1.1.jar \
https://github.com/Esri/spatial-framework-for-hadoop/releases/download/v1.1/spatial-sdk-json-1.1.jar \
https://github.com/Esri/geometry-api-java/releases/download/v1.2.1/esri-geometry-api-1.2.1.jar

hive -S
添加jar /pathto/esri-geometry-api-1.2.1.jar
/pathto/spatial-sdk-json-1.1.jar
/pathto/spatial-sdk-hive-1.1.jar;
创建临时函数ST_AsBinary作为'com.esri.hadoop.hive.ST_AsBinary';
-...

选择ST_Contains(ST_Polygon(1,1,1,4,4,4,4,4,1),ST_Point(2,3));
真正
选择ST_Contains(ST_Polygon('POLYGON((1 1,1 4,4 4,4 1,1 1))'),ST_Point(2,3));
真正
选择ST_Contains(ST_POLYGON('POLYGON((-170.0 20.0,-170.0 73.0,-50.0 20.0,-50.0 73.0,-170.0 20.0))'),ST_Point(-73.9878531,40.7484445));
真正
选择不ST_Contains(ST_POLYGON('POLYGON((-170.0 20.0,-170.0 73.0,-50.0 20.0,-50.0 73.0,-170.0 20.0))'),ST_Point(-73.9878531,40.7484445));

10-08 19:50