

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 공간 데이터
<a name="access-graph-opencypher-22-spatial-data"></a>

Amazon Neptune은 이제 공간 쿼리를 지원하므로 그래프에 기하학적 데이터를 저장하고 분석할 수 있습니다. 지리적 위치(예: 맵의 좌표)에 일반적으로 사용되는 공간 기능은 위치와 근접성이 중요한 2차원 데이터와 함께 작동합니다. 이 기능을 사용하여 "어떤 스토어가이 고객으로부터 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 구현은 경도 및 위도 값과 호환됩니다. `ST_DistanceSpheroid`를 사용하여 WGS84/SRID 4326을 기반으로 거리를 계산합니다.

현재 구현은 3차원 좌표 저장을 지원합니다. 공간 함수는 현재 x축 및 y축(2차원) 좌표 사용만 지원합니다. z축 좌표는 현재 사용 가능한 공간 함수에서 지원되지 않습니다.

## 위치 데이터 저장
<a name="storing-spatial-data"></a>

Geometry 속성 유형을 사용하여 노드 및 엣지에 위치 데이터를 저장합니다. 지리적 셰이프를 텍스트로 나타내는 표준 방법인 WKT(Well-Known Text) 형식에서 지오메트리 값을 생성합니다. 예를 들어 포인트 위치를 저장하려면

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

지리적 좌표로 작업할 때 첫 번째 인수(x)는 경도를 나타내고 두 번째 인수(y)는 위도를 나타냅니다. 이는 공간 데이터베이스에 사용되는 표준 좌표 순서와 ISO 19125 표준을 따릅니다.

**참고**  
 이제 Neptune은 "Geometry"라는 새로운 데이터 유형을 지원합니다. 노드 또는 엣지의 Geometry 속성은 `ST_GeomFromText` 함수를 사용하여 WKT 문자열에서 생성할 수 있습니다.  
Neptune은 공간 유형 함수의 성능을 개선하기 위해 특수 공간 인덱스에 포인트 데이터를 자동으로 저장합니다. 예를 들어 다각형 내에서 지점을 찾는 데 `ST_Contains` 사용되는는 특수 공간 인덱스에 의해 가속화됩니다.  
[ 지오메트리의 잘 알려진 텍스트 표현을 위한 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에서 공간 함수를 사용하는 방법을 보여줍니다.

데이터에 Geometry 속성 대신 별도의 위도 및 경도 속성이 있는 경우 쿼리 시 해당 속성을 지점으로 변환할 수 있습니다. 지정된 위치에 가장 가까운 공항 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>

대부분의 쿼리 메서드는 Geometry 값을 사람이 읽을 수 있는 WKT 문자열로 반환합니다. Bolt 드라이버를 사용하는 경우 효율성을 위해 Geometry 값이 WKB(Well-Known Binary) 형식으로 반환됩니다. WKB를 애플리케이션의 Geometry 객체로 변환합니다.

```
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);
}
```

# 공간 함수
<a name="access-graph-opencypher-22-spatial-functions"></a>

Neptune openCypher에서 지오메트리 데이터 유형 작업에 사용할 수 있는 공간 함수는 다음과 같습니다.
+ [ST\$1Point](access-graph-opencypher-22-spatial-functions-st-point.md)
+ [ST\$1GeomFromText](access-graph-opencypher-22-spatial-functions-st-geomfromtext.md)
+ [ST\$1AsText](access-graph-opencypher-22-spatial-functions-st-astext.md)
+ [ST\$1GeometryType](access-graph-opencypher-22-spatial-functions-st-geometrytype.md)
+ [ST\$1Equals](access-graph-opencypher-22-spatial-functions-st-equals.md)
+ [ST\$1Contains](access-graph-opencypher-22-spatial-functions-st-contains.md)
+ [ST\$1Intersects](access-graph-opencypher-22-spatial-functions-st-intersect.md)
+ [ST\$1Distance](access-graph-opencypher-22-spatial-functions-st-distance.md)
+ [ST\$1DistanceSpheroid](access-graph-opencypher-22-spatial-functions-st-distancespheroid.md)
+ [ST\$1Envelope](access-graph-opencypher-22-spatial-functions-st-envelope.md)
+ [ST\$1Buffer](access-graph-opencypher-22-spatial-functions-st-buffer.md)

# ST\$1Point
<a name="access-graph-opencypher-22-spatial-functions-st-point"></a>

ST\$1Point는 입력 좌표 값에서 점을 반환합니다.

**구문**

```
ST_Point(x, y, z)
```

**인수**
+ `x` - 첫 번째 좌표를 나타내는 데이터 형식 DOUBLE PRECISION의 값입니다.
+ `y` - 두 번째 좌표를 나타내는 데이터 형식 DOUBLE PRECISION의 값입니다.
+ `z` - (선택 사항)

**순서 조정**

지리적 좌표로 작업할 때 첫 번째 인수(`x`)는 **경도**를 나타내고 두 번째 인수(`y`)는 **위도를** 나타냅니다. 이는 공간 데이터베이스에 사용되는 표준 좌표 순서와 ISO 19125 표준을 따릅니다.

```
// Correct: longitude first, latitude second
ST_Point(-84.4281, 33.6367)  // Atlanta airport

// Incorrect: latitude first, longitude second
ST_Point(33.6367, -84.4281)  // This will return NaN in distance calculations
```

**유효한 좌표 범위**

지리적 데이터의 경우 좌표가 유효한 범위 내에 있는지 확인합니다.
+ 경도(`x`): -180\$1180
+ 위도(`y`): -90\$190

이러한 범위를 벗어나는 좌표는와 같은 거리 계산 함수와 함께 사용할 때 `NaN` (숫자가 아님)를 반환합니다`ST_DistanceSpheroid`.

**반환 타입**

하위 유형 POINT의 GEOMETRY

x 또는 y가 null이면 null이 반환됩니다.

**예시**

다음은 입력 좌표에서 점 지오메트리를 구성합니다.

```
RETURN ST_Point(5.0, 7.0); 
POINT(5 7)
```

# ST\$1GeomFromText
<a name="access-graph-opencypher-22-spatial-functions-st-geomfromtext"></a>

ST\$1GeomFromText는 입력 지오메트리의 WKT(Well-Known Text) 표현으로부터 지오메트리 객체를 구성합니다.

**구문**

```
ST_GeomFromText(wkt_string)
```

**인수**
+ `wkt_string` - 지오메트리의 WKT 표현인 데이터 유형 STRING의 값입니다.

**반환 타입**

GEOMETRY

wkt\$1string이 null이면 null이 반환됩니다.

wkt\$1string이 유효하지 않으면 BadRequestException이 반환됩니다.

**예시**

```
RETURN ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))')             
POLYGON((0 0,0 1,1 1,1 0,0 0))
```

# ST\$1AsText
<a name="access-graph-opencypher-22-spatial-functions-st-astext"></a>

ST\$1AsText는 입력 지오메트리의 WKT(Well-Known Text) 표현을 반환합니다.

**구문**

```
ST_AsText(geo)
```

**인수**
+ `geo` - GEOMETRY 데이터 유형의 값 또는 GEOMETRY로 평가되는 표현식입니다.

**반환 타입**

STRING

geo가 null이면 null이 반환됩니다.

입력 파라미터가 Geometry가 아닌 경우 BadRequestException이 반환됩니다.

결과가 64-KB STRING보다 크면 오류가 반환됩니다.

**예시**

```
RETURN ST_AsText(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))'))             
POLYGON((0 0,0 1,1 1,1 0,0 0))
```

# ST\$1GeometryType
<a name="access-graph-opencypher-22-spatial-functions-st-geometrytype"></a>

ST\$1GeometryType은 지오메트리 유형을 문자열로 반환합니다.

**구문**

```
ST_GeometryType(geom)
```

**인수**
+ `geom` - GEOMETRY 데이터 형식의 값 또는 GEOMETRY 형식으로 평가되는 표현식입니다.

**반환 타입**

STRING

geom이 null이면 null이 반환됩니다.

입력 파라미터가 Geometry가 아닌 경우 BadRequestException이 반환됩니다.

**예시**

```
RETURN ST_GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
ST_LineString
```

# ST\$1Equals
<a name="access-graph-opencypher-22-spatial-functions-st-equals"></a>

ST\$1Equals는 입력 지오메트리의 2D 프로젝션이 토폴로지상 동일한 경우 true를 반환합니다. 지오메트리에 동일한 점 집합이 있는 경우 토폴로지상 동일한 것으로 간주됩니다. 토폴로지상 동일한 지오메트리에서 버텍스 순서는 이러한 평등을 유지하면서 다를 수 있습니다.

**구문**

```
ST_Equals(geom1, geom2)
```

**인수**
+ `geom1` - GEOMETRY 데이터 유형의 값 또는 GEOMETRY 유형으로 평가되는 표현식입니다.
+ `geom2` - GEOMETRY 데이터 유형의 값 또는 GEOMETRY 유형으로 평가되는 표현식입니다. 이 값을 geom1과 비교하여 geom1과 같은지 판별합니다.

**반환 타입**

BOOLEAN

geom1 또는 geom2가 null이면 null이 반환됩니다.

geom1 또는 geom2가 Geometries가 아닌 경우 BadRequestException이 반환됩니다.

**예시**

```
RETURN ST_Equals(
    ST_GeomFromText('POLYGON ((0 2,1 1,0 -1,0 2))'), 
    ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
false
```

다음은 두 라인스트링이 기하학적으로 동일한지 확인합니다.

```
RETURN ST_Equals(
    ST_GeomFromText('LINESTRING (1 0, 10 0)'), 
    ST_GeomFromText('LINESTRING(1 0,5 0,10 0)'));
true
```

# ST\$1Contains
<a name="access-graph-opencypher-22-spatial-functions-st-contains"></a>

ST\$1Contains는 첫 번째 입력 지오메트리의 2D 프로젝션에 두 번째 입력 지오메트리의 2D 프로젝션이 포함된 경우 true를 반환합니다. 지오메트리 A는 B의 모든 지점이 A의 지점이고 내부에 비어 있지 않은 교차점이 있는 경우 지오메트리 B를 포함합니다. ST\$1Contains(A, B)는 ST\$1Within(B, A)과 동일합니다.

**구문**

```
ST_Contains(geom1, geom2)
```

**인수**
+ `geom1` - GEOMETRY 유형의 값 또는 GEOMETRY 유형으로 평가되는 표현식입니다.
+ `geom2` - GEOMETRY 유형의 값 또는 GEOMETRY 유형으로 평가되는 표현식입니다. 이 값을 geom1과 비교하여 해당 값이 geom1에 포함되어 있는지 판별합니다.

**반환 타입**

BOOLEAN

geom1 또는 geom2가 null이면 null이 반환됩니다.

입력 파라미터가 Geometry가 아닌 경우 BadRequestException이 반환됩니다.

**예시**

```
RETURN ST_Contains(
    ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), 
    ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
false
```

# ST\$1Intersects
<a name="access-graph-opencypher-22-spatial-functions-st-intersect"></a>

ST\$1Intersects는 두 입력 지오메트리의 2D 프로젝션에 공통되는 점이 하나 이상인 경우 true를 반환합니다.

**구문**

```
ST_Intersects(geom1, geom2)
```

**인수**
+ `geom1` - GEOMETRY 데이터 유형의 값 또는 GEOMETRY 유형으로 평가되는 표현식입니다.
+ `geom2` - GEOMETRY 데이터 유형의 값 또는 GEOMETRY 유형으로 평가되는 표현식입니다.

**반환 타입**

BOOLEAN

geom1 또는 geom2가 null이면 null이 반환됩니다.

입력 파라미터가 Geometry가 아닌 경우 BadRequestException이 반환됩니다.

**예시**

```
RETURN ST_Intersects(
    ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(2 2,2 5,5 5,5 2,2 2))'), 
    ST_GeomFromText('MULTIPOINT((4 4),(6 6))'));
true
```

# ST\$1Distance
<a name="access-graph-opencypher-22-spatial-functions-st-distance"></a>

입력 지오메트리의 경우 ST\$1Distance는 두 입력 지오메트리 값의 2D 프로젝션 간 최소 유클리드 거리를 반환합니다.

**구문**

```
ST_Distance(geo1, geo2)
```

**인수**
+ `geo1` - GEOMETRY 데이터 형식의 값 또는 GEOMETRY 형식으로 평가되는 표현식입니다.
+ `geo2` - GEOMETRY 데이터 유형의 값 또는 GEOMETRY로 평가되는 표현식입니다.

**반환 타입**

입력 지오메트리와 동일한 단위의 DOUBLE PRECISION.

geo1 또는 geo2가 null이면 null이 반환됩니다.

입력 파라미터가 Geometry가 아닌 경우 BadRequestException이 반환됩니다.

**예시**

```
RETURN ST_Distance(
    ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), 
    ST_GeomFromText('POLYGON((-1 -3,-2 -1,0 -3,-1 -3))'));
1.4142135623731
```

# ST\$1DistanceSpheroid
<a name="access-graph-opencypher-22-spatial-functions-st-distancespheroid"></a>

두 lon/lat 지오메트리 사이의 최소 거리를 미터 단위로 반환합니다. 구상체는 WGS84/SRID 4326입니다.

**구문**

```
ST_DistanceSpheroid(geom1, geom2);
```

**인수**
+ `geom1` - GEOMETRY 데이터 유형의 값 또는 GEOMETRY 유형으로 평가되는 표현식입니다.
+ `geom2` - GEOMETRY 데이터 유형의 값 또는 GEOMETRY 유형으로 평가되는 표현식입니다.

**반환 타입**

FLOAT

geom이 null이면 null이 반환됩니다.

**예시**

```
RETURN ST_DistanceSpheroid(
    ST_GeomFromText('POINT(-110 42)'),
    ST_GeomFromText('POINT(-118 38)'))
814278.77
```

# ST\$1Envelope
<a name="access-graph-opencypher-22-spatial-functions-st-envelope"></a>

ST\$1Envelope은 다음과 같이 입력 지오메트리의 최소 경계 상자를 반환합니다.
+ 입력 지오메트리가 비어 있는 경우 반환된 지오메트리는 POINT EMPTY가 됩니다.
+ 입력 지오메트리의 최소 경계 상자가 점으로 변형되는 경우 반환된 지오메트리는 점입니다.
+ 위의 항목 중 어느 것도 true가 아니면 함수는 버텍스가 최소 경계 상자의 모서리인 counter-clockwise-oriented 다각형을 반환합니다.

비어 있지 않은 모든 입력에 대해 이 함수는 입력 지오메트리의 2D 프로젝션에서 작동합니다.

**구문**

```
ST_Envelope(geom)
```

**인수**
+ `geom` - GEOMETRY 데이터 형식의 값 또는 GEOMETRY 형식으로 평가되는 표현식입니다.

**반환 타입**

GEOMETRY

geom이 null이면 null이 반환됩니다.

**예시**

```
RETURN ST_Envelope(ST_GeomFromText("POLYGON ((2 1, 4 3, 6 1, 5 5, 3 4, 2 1))"))
POLYGON ((2 1, 6 1, 6 5, 2 5, 2 1))
```

# ST\$1Buffer
<a name="access-graph-opencypher-22-spatial-functions-st-buffer"></a>

ST\$1Buffer는 xy 데카르트 평면에 투영된 입력 형상으로부터의 거리가 입력 거리보다 작거나 같은 모든 점을 나타내는 2D 형상을 반환합니다.

**구문**

```
ST_Buffer(geom, distance, number_of_segments_per_quarter_circle)
```

**인수**
+ `geom` - GEOMETRY 데이터 형식의 값 또는 GEOMETRY 형식으로 평가되는 표현식입니다.
+ `distance` - 버퍼의 거리(또는 반경)를 나타내는 데이터 유형 DOUBLE PRECISION의 값입니다.
+ `number_of_segments_per_quarter_circle` - 데이터 형식 INTEGER의 값입니다(0보다 크거나 같아야 함). 이 값은 입력 형상의 각 꼭짓점 주위의 1/4 원을 근사화하는 점의 수를 결정합니다. 음수 값은 기본적으로 0입니다. 기본값은 8입니다.

**반환 타입**

GEOMETRY

ST\$1Buffer 함수는 xy 데카르트 평면에서 2차원(2D) 형상을 반환합니다.

**예시**

```
RETURN ST_Buffer(ST_GeomFromText('LINESTRING (1 2,5 2,5 8)'), 2, 4);
POLYGON ((3 4, 3 8, 3.1522409349774265 8.76536686473018,
         3.585786437626905 9.414213562373096, 4.234633135269821 9.847759065022574,
         5 10, 5.765366864730179 9.847759065022574,
         6.414213562373095 9.414213562373096, 6.847759065022574 8.76536686473018,
         7 8, 7 2, 6.847759065022574 1.2346331352698203,
         6.414213562373095 0.5857864376269051, 5.765366864730179 0.1522409349774265,
         5 0, 1 0, 0.2346331352698193 0.152240934977427,
         -0.4142135623730954 0.5857864376269051,
         -0.8477590650225737 1.2346331352698208, -1 2.0000000000000004,
         -0.8477590650225735 2.7653668647301797,
         -0.4142135623730949 3.414213562373095,
         0.2346331352698206 3.8477590650225735, 1 4, 3 4))
```

다음은 원을 근사하는 입력 포인트 지오메트리의 버퍼를 반환합니다. 이 명령은 1/4 원당 세그먼트 수로 3을 지정하므로 함수에서는 기본값인 3개 세그먼트를 사용하여 1/4 원을 근사화합니다.

```
RETURN ST_Buffer(ST_GeomFromText('POINT (1 1)'), 1.0, 8));
POLYGON ((2 1, 1.9807852804032304 0.8049096779838718,
     1.9238795325112867 0.6173165676349102, 1.8314696123025453 0.4444297669803978,
     1.7071067811865475 0.2928932188134525, 1.5555702330196022 0.1685303876974548,
     1.3826834323650898 0.0761204674887133, 1.1950903220161284 0.0192147195967696,
     1 0, 0.8049096779838718 0.0192147195967696, 0.6173165676349103 0.0761204674887133,
    0.444429766980398 0.1685303876974545, 0.2928932188134525 0.2928932188134524,
     0.1685303876974546 0.4444297669803978, 0.0761204674887133 0.6173165676349102,
     0.0192147195967696 0.8049096779838714, 0 0.9999999999999999,
     0.0192147195967696 1.1950903220161284, 0.0761204674887132 1.3826834323650896,
     0.1685303876974545 1.555570233019602, 0.2928932188134523 1.7071067811865475,
     0.4444297669803978 1.8314696123025453, 0.6173165676349097 1.9238795325112865,
     0.8049096779838714 1.9807852804032304, 0.9999999999999998 2,
     1.1950903220161284 1.9807852804032304, 1.38268343236509 1.9238795325112865,
     1.5555702330196017 1.8314696123025453, 1.7071067811865475 1.7071067811865477,
     1.8314696123025453 1.5555702330196022, 1.9238795325112865 1.3826834323650905,
     1.9807852804032304 1.1950903220161286, 2 1))
```