

# 查询地理空间数据
<a name="querying-geospatial-data"></a>

地理空间数据包含为对象指定地理位置的标识符。此类数据的示例包括天气报告、地图方向、包含地理位置的推特、店铺位置以及航空公司路线。地理空间数据在业务分析、报告和预测中起着重要的作用。

地理空间标识符 (如经度和纬度) 允许您将任何邮寄地址转换为一组地理坐标。

## 什么是地理空间查询？
<a name="geospatial-query-what-is"></a>

地理空间查询是在 Athena 中支持的专门类型 SQL 查询。它们在以下方面与非空间 SQL 查询不同：
+ 使用以下专门 geometry 数据类型：`point`、`line`、`multiline`、`polygon` 和 `multipolygon`。
+ 表示 geometry 数据类型之间的关系，例如 `distance`、`equals`、`crosses`、`touches`、`overlaps`、`disjoint` 等。

通过在 Athena 中使用地理空间查询，您可以运行这些操作和其他类似操作：
+ 找出两点之间的距离。
+ 检查一个区域 (多边形) 是否包含另一个区域。
+ 检查一条线是否穿过或接触另一条线或多边形。

例如，要在 Athena 中从雷尼尔山地理坐标的类型 `double` 的值获得 `point` 几何数据类型，请使用 `ST_Point (longitude, latitude)` 几何空间函数，如以下示例所示。

```
ST_Point(-121.7602, 46.8527)
```

## 输入数据格式和 Geometry 数据类型
<a name="geospatial-input-data-formats-supported-geometry-types"></a>

要在 Athena 中使用地理空间函数，请以 WKT 格式输入数据，或使用 Hive JSON SerDe。您还可以使用在 Athena 中受支持的几何数据类型。

### 输入数据格式
<a name="input-data-formats"></a>

为处理地理空间查询，Athena 支持以下数据格式的输入数据：
+  **WKT (已知文本)**。在 Athena 中，WKT 表示为 `varchar(x)` 或 `string` 数据类型。
+  **JSON 编码的地理空间数据**。为解析具有地理空间数据的 JSON 文件并为它们创建表，Athena 使用 [Hive JSON SerDe](https://github.com/Esri/spatial-framework-for-hadoop/wiki/Hive-JSON-SerDe)。有关在 Athena 中使用此 SerDe 的更多信息，请参阅 [JSON SerDe 库](json-serde.md)。

### Geometry 数据类型
<a name="geometry-data-types"></a>

为处理地理空间查询，Athena 支持以下专用几何数据类型：
+  `point` 
+  `line` 
+  `polygon` 
+  `multiline` 
+  `multipolygon` 

## 支持的地理空间函数
<a name="geospatial-functions-list"></a>

有关 Athena 引擎版本 3 中地理空间函数的信息，请参阅 Trino 文档中的 [地理空间函数](https://trino.io/docs/current/functions/geospatial.html)。

# 示例：地理空间查询
<a name="geospatial-example-queries"></a>

本主题中的示例从 GitHub 上提供的示例数据创建两个表，并根据数据查询这两个表。以下文件中的示例数据仅用于说明目的，并不能保证准确性：
+ **[https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/earthquake-data/earthquakes.csv](https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/earthquake-data/earthquakes.csv)** – 列出了加利福尼亚发生的地震。示例 `earthquakes` 表使用此数据中的字段。
+ **[https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/counties-data/california-counties.json](https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/counties-data/california-counties.json)** – 使用[符合 ESRI 标准的 GeoJSON 格式](https://doc.arcgis.com/en/arcgis-online/reference/geojson.htm)列出加利福尼亚州的县级数据。此数据包含多个字段，例如 `AREA`、`PERIMETER`、`STATE`、`COUNTY` 和 `NAME`，但示例 `counties` 表仅使用两个字段：`Name`（字符串）和 `BoundaryShape`（二进制）。
**注意**  
Athena 使用 `com.esri.json.hadoop.EnclosedEsriJsonInputFormat` 将 JSON 数据转换为地理空间二进制格式。

以下代码示例创建一个名为 `earthquakes` 的表：

```
CREATE external TABLE earthquakes
(
 earthquake_date string,
 latitude double,
 longitude double,
 depth double,
 magnitude double,
 magtype string,
 mbstations string,
 gap string,
 distance string,
 rms string,
 source string,
 eventid string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE LOCATION 's3://amzn-s3-demo-bucket/my-query-log/csv/';
```

以下代码示例创建一个名为 `counties` 的表：

```
CREATE external TABLE IF NOT EXISTS counties
 (
 Name string,
 BoundaryShape binary
 )
ROW FORMAT SERDE 'com.esri.hadoop.hive.serde.EsriJsonSerDe'
STORED AS INPUTFORMAT 'com.esri.json.hadoop.EnclosedEsriJsonInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/my-query-log/json/';
```

以下示例查询在 `counties` 和 `earthquake` 表中使用 `CROSS JOIN` 函数。此示例使用 `ST_CONTAINS` 来查询边界包含地震位置的县，这些位置由 `ST_POINT` 指定。然后，查询会按名称对这些县进行分组，然后按计数对其进行排序，并以降序返回它们。

```
SELECT counties.name,
        COUNT(*) cnt
FROM counties
CROSS JOIN earthquakes
WHERE ST_CONTAINS (ST_GeomFromLegacyBinary(counties.boundaryshape), ST_POINT(earthquakes.longitude, earthquakes.latitude))
GROUP BY  counties.name
ORDER BY  cnt DESC
```

此查询返回：

```
+------------------------+
| name             | cnt |
+------------------------+
| Kern             | 36  |
+------------------------+
| San Bernardino   | 35  |
+------------------------+
| Imperial         | 28  |
+------------------------+
| Inyo             | 20  |
+------------------------+
| Los Angeles      | 18  |
+------------------------+
| Riverside        | 14  |
+------------------------+
| Monterey         | 14  |
+------------------------+
| Santa Clara      | 12  |
+------------------------+
| San Benito       | 11  |
+------------------------+
| Fresno           | 11  |
+------------------------+
| San Diego        | 7   |
+------------------------+
| Santa Cruz       | 5   |
+------------------------+
| Ventura          | 3   |
+------------------------+
| San Luis Obispo  | 3   |
+------------------------+
| Orange           | 2   |
+------------------------+
| San Mateo        | 1   |
+------------------------+
```

## 其他资源
<a name="geospatial-example-queries-additional-resources"></a>

有关地理空间查询的更多示例，请参阅以下博客文章：
+ [在 Amazon Athena 中使用 UDF 和 AWS Lambda 扩展地理空间查询](https://aws.amazon.com/blogs/big-data/extend-geospatial-queries-in-amazon-athena-with-udfs-and-aws-lambda/) 
+ [使用 Amazon Athena 和 Amazon Quick 可视化超过 200 年的全球气候数据。](https://aws.amazon.com/blogs/big-data/visualize-over-200-years-of-global-climate-data-using-amazon-athena-and-amazon-quicksight/)
+ [使用 Amazon Athena 查询 OpenStreetMap](https://aws.amazon.com/blogs/big-data/querying-openstreetmap-with-amazon-athena/)