

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 空間資料
<a name="access-graph-opencypher-22-spatial-data"></a>

Amazon Neptune 現在支援空間查詢，可讓您在圖形中存放和分析幾何資料。雖然 通常用於地理位置 （例如地圖上的座標），但空間特徵適用於位置和鄰近程度很重要的任何二維資料。使用此功能來回答以下問題：「哪些商店在此客戶 5 英里內？」、「尋找與此服務區域相交的所有交付路由」或「此平面圖中的哪些元件與 HVAC 區域重疊？」 Neptune 使用業界標準的空間類型函數實作空間支援，該函數可與點、多邊形和其他幾何形狀搭配使用。您可以將空間資料儲存為節點和邊緣上的屬性，然後使用空間函數來計算距離、檢查點是否落在邊界內，或尋找重疊區域，全都在您的 openCypher 查詢中。

**常見使用案例**：
+ **地理應用程式**：以位置為基礎的建議、地理圍欄、路由規劃和區域分析
+ **設施和空間管理**：平面圖配置、設備配置和區域涵蓋範圍
+ **網路拓撲**：實體基礎設施映射、涵蓋區域和服務界限
+ **設計和 CAD**：2D 設計中的元件定位、碰撞偵測和空間關係
+ **遊戲開發**：角色定位、碰撞偵測和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 實作與經度和緯度值相容。使用 根據 WGS84/SRID 4326 `ST_DistanceSpheroid`計算距離。

目前的實作支援儲存 3D 座標。空間函數目前僅支援使用 x 軸和 y 軸 (2 維） 座標。可用的空間函數目前不支援 z 軸座標。

## 儲存位置資料
<a name="storing-spatial-data"></a>

使用幾何屬性類型將位置資料存放在節點和邊緣。從 Well-Known Text (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`用於尋找多邊形內的點是由特殊空間索引加速。  
[ 幾何之 Well-Known Text 表示法的 Wikipedia 頁面 ](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>

下列查詢範例使用 [air-routes 資料集](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\_Distance 查詢：

   ```
   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 字串，這些字串可供人類讀取。如果您使用 Bolt 驅動程式，幾何值會以 WKB (Well-Known Binary) 格式傳回以提高效率。將 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);
}
```