

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 空间数据
<a name="access-graph-opencypher-22-spatial-data"></a>

Amazon Neptune 现在支持空间查询，允许您在图表中存储和分析几何数据。虽然空间要素通常用于地理位置（例如地图上的坐标），但它适用于任何位置和邻近度很重要的二维数据。使用此功能回答诸如 “哪些商店距离该客户 5 英里以内？” 之类的问题 、“查找与该服务区相交的所有配送路线” 或 “此平面图中的哪些组件与 HVAC 区域重叠？” Neptune 使用适用于点、多边形和其他几何形状的行业标准空间类型函数来实现空间支持。您可以将空间数据存储为节点和边的属性，然后使用空间函数计算距离、检查点是否落在边界内或查找重叠区域，所有这些都在 OpenCypher 查询中完成。

**常见用例**：
+ **地理应用**：基于位置的建议、地理围栏、路线规划和区域分析
+ **设施和空间管理**：平面图布局、设备布局和区域覆盖范围
+ **网络拓扑**：物理基础设施映射、覆盖区域和服务边界
+ **设计和 CAD**：二维设计中的组件定位、碰撞检测和空间关系
+ **游戏开发**：角色定位、碰撞检测和 area-of-effect计算

与其他数据库一样，Amazon Neptune 中的空间类型实现遵循了 ISO/IEC 13249-3:2016 指令。[空间函数](access-graph-opencypher-22-spatial-functions.md)它们以 OpenCypher 查询语言提供。

## 坐标系
<a name="access-graph-opencypher-22-spatial-data-coordinate-system"></a>

Neptune 有一个用于整个数据库的空间参考标识符 (SRID)。坐标系的同质性减少了用户在查询中的错误并提高了数据库性能。第一个版本 (1.4.7.0) 支持笛卡尔坐标系，也称为 SRID 0。

SRID 0 的 Neptune 实现与经度和纬度值兼容。用于`ST_DistanceSpheroid`根据 WGS84 /SRID 4326 计算距离。

当前的实现支持存储三维坐标。空间函数目前仅支持使用 x 轴和 y 轴（二维）坐标。可用空间函数目前不支持 z 轴坐标。

## 存储位置数据
<a name="storing-spatial-data"></a>

使用 Geometry 属性类型存储节点和边上的位置数据。使用知名文本 (WKT) 格式创建几何值，这是将地理形状表示为文本的标准方法。例如，要存储点位置，请执行以下操作：

```
CREATE (n:airport {code: 'ATL', location: ST_GeomFromText('POINT (-84.4281 33.6367)')})
```

使用地理坐标时，第一个参数 (x) 代表经度，第二个参数 (y) 代表纬度。这遵循空间数据库中使用的标准坐标顺序和 ISO 19125 标准。

**注意**  
 Neptune 现在支持一种名为 “几何” 的新数据类型。可以使用`ST_GeomFromText`函数从 WKT 字符串创建节点或边的几何属性。  
Neptune 会自动将点数据存储在专门的空间索引中，以提高空间类型函数的性能。例如，专门的空间索引可以加速`ST_Contains`用于查找多边形内的点。  
[维基百科页面，其中包含几何图形的知名文本表示](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry)

## 批量加载空间数据
<a name="loading-spatial-data-bulk"></a>

批量加载数据时，请在 CSV 标题中指定几何类型。Neptune 将解析 WKT 字符串并创建相应的几何属性：

```
:ID,:LABEL,code:String,city:String,location:Geometry
21,airport,ATL,Atlanta,POINT (-84.42810059 33.63669968)
32,airport,ANC,Anchorage,POINT (-149.9960022 61.17440033)
43,airport,AUS,Austin,POINT (-97.66989899 30.19449997)
```

有关完整的 CSV 格式详细信息，请参阅 [OpenCypher 批量加载](bulk-load-tutorial-format-opencypher.md)格式。

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

以下查询示例使用[航空路线数据集](https://github.com/krlawrence/graph/tree/main/sample-data)来演示如何在 Neptune 中使用空间函数。

如果您的数据具有单独的纬度和经度属性而不是几何属性，则可以在查询时将其转换为点。查找距离给定位置最近的 10 个机场：

```
MATCH (a:airport)
WITH a, ST_GeomFromText('POINT (' + a.lon + ' ' + a.lat + ')') AS airportLocation
WITH a, airportLocation, ST_Distance(ST_GeomFromText('POINT (-84.4281 33.6367)'), airportLocation) AS distance
WHERE distance IS NOT NULL
RETURN a.code, a.city, distance
ORDER BY distance ASC
LIMIT 10
```

如果您已经将位置存储为，`ST_Point`则可以直接使用这些位置值：

1. 设置 属性

   ```
   MATCH (a:airport)
   SET a.location = ST_GeomFromText('POINT (' + a.lon + ' ' + a.lat + ')')
   ```

1. 使用 ST\$1Distance 进行查询：

   ```
   MATCH (a:airport)
   WHERE a.location IS NOT NULL
   WITH a, ST_Distance(ST_GeomFromText('POINT (-84.4281 33.6367)'), a.location) AS distance
   RETURN a.code, a.city, distance
   ORDER BY distance ASC
   LIMIT 10
   ```

### 使用 Bolt 驱动器
<a name="querying-spatial-data-bolt"></a>

大多数查询方法以 WKT 字符串的形式返回 Geometry 值，这些值是人类可读的。如果您使用的是 Bolt 驱动程序，为了提高效率，几何值将以 WKB（众所周知的二进制）格式返回。在应用程序中将 WKB 转换为几何对象：

```
try (Session session = driver.session()) {
    Result result = session.run("MATCH (n:airport {code: 'ATL'}) RETURN n.location as geom");
    
    Record record = result.single();
    byte[] wkbBytes = record.get("geom").asByteArray();
    
    // Convert WKB to Geometry object using JTS library
    WKBReader wkbReader = new WKBReader();
    Geometry geom = wkbReader.read(wkbBytes);
}
```