

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Data Spasial
<a name="access-graph-opencypher-22-spatial-data"></a>

Amazon Neptunus sekarang mendukung kueri spasial, memungkinkan Anda untuk menyimpan dan menganalisis data geometris dalam grafik Anda. Meskipun umumnya digunakan untuk lokasi geografis (seperti koordinat pada peta), fitur spasial bekerja dengan data dua dimensi di mana posisi dan kedekatan penting. Gunakan fitur ini untuk menjawab pertanyaan seperti “Toko mana yang berada dalam jarak 5 mil dari pelanggan ini?” , “Temukan semua rute pengiriman yang bersinggungan dengan area layanan ini,” atau “Komponen mana dalam denah lantai ini yang tumpang tindih dengan zona HVAC?” Neptunus mengimplementasikan dukungan spasial menggunakan fungsi Tipe Spasial standar industri yang bekerja dengan titik, poligon, dan bentuk geometris lainnya. Anda dapat menyimpan data spasial sebagai properti pada node dan tepi, kemudian menggunakan fungsi spasial untuk menghitung jarak, memeriksa apakah titik berada dalam batas, atau menemukan wilayah yang tumpang tindih, semua dalam kueri OpenCypher Anda.

**Kasus penggunaan umum:**
+ **Aplikasi geografis**: Rekomendasi berbasis lokasi, geofencing, perencanaan rute, dan analisis wilayah
+ **Manajemen fasilitas dan ruang**: Tata letak denah lantai, penempatan peralatan, dan cakupan zona
+ **Topologi jaringan**: Pemetaan infrastruktur fisik, area cakupan, dan batas layanan
+ **Desain dan CAD**: Pemosisian komponen, deteksi tabrakan, dan hubungan spasial dalam desain 2D
+ **Pengembangan game**: Penentuan posisi karakter, deteksi tabrakan, dan perhitungan area-of-effect

Implementasi Jenis Spasial di Amazon Neptunus mengikuti arahan ISO/IEC 13249-3:2016, seperti database lainnya. Yang [Fungsi Spasial](access-graph-opencypher-22-spatial-functions.md) tersedia dalam bahasa query OpenCypher.

## Sistem koordinat
<a name="access-graph-opencypher-22-spatial-data-coordinate-system"></a>

Neptunus memiliki satu Spatial Reference Identifier (SRID) untuk seluruh database. Homogenitas sistem koordinat mengurangi kesalahan pengguna dalam query dan meningkatkan kinerja database. Rilis pertama (1.4.7.0) mendukung sistem koordinat Cartesian, juga disebut sebagai SRID 0.

Implementasi Neptunus dari SRID 0 kompatibel dengan nilai bujur dan lintang. Gunakan `ST_DistanceSpheroid` untuk menghitung jarak berdasarkan WGS84 /SRID 4326.

Implementasi saat ini mendukung penyimpanan koordinat 3 dimensi. Fungsi Spasial saat ini hanya mendukung penggunaan koordinat sumbu x dan y (2 dimensi). Koordinat sumbu z saat ini tidak didukung oleh Fungsi Spasial yang tersedia.

## Menyimpan data lokasi
<a name="storing-spatial-data"></a>

Menyimpan data lokasi pada node dan tepi menggunakan tipe properti Geometry. Buat nilai Geometri dari format Teks Terkenal (WKT), cara standar untuk mewakili bentuk geografis sebagai teks. Misalnya, untuk menyimpan lokasi titik:

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

Saat bekerja dengan koordinat geografis, argumen pertama (x) mewakili garis bujur dan argumen kedua (y) mewakili garis lintang. Ini mengikuti urutan koordinat standar yang digunakan dalam database spasial dan standar ISO 19125.

**catatan**  
 Neptunus sekarang mendukung tipe data baru yang disebut “Geometri”. Properti Geometri dari node atau edge dapat dibuat dari string WKT menggunakan fungsi. `ST_GeomFromText`  
Neptunus akan secara otomatis menyimpan data Poin dalam indeks spasial khusus untuk meningkatkan kinerja fungsi Tipe Spasial. Misalnya, `ST_Contains` digunakan untuk menemukan titik-titik dalam poligon dipercepat oleh indeks spasial khusus.  
[Halaman Wikipedia untuk representasi Teks Terkenal dari geometri](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry)

## Memuat data spasial secara massal
<a name="loading-spatial-data-bulk"></a>

Saat memuat data secara massal, tentukan jenis Geometri di header CSV Anda. Neptunus akan mengurai string WKT dan membuat properti Geometri yang sesuai:

```
: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)
```

Untuk detail format CSV lengkap, lihat Format beban massal [OpenCypher](bulk-load-tutorial-format-opencypher.md).

## Meminta data spasial
<a name="querying-spatial-data"></a>

Contoh kueri berikut menggunakan [dataset rute udara](https://github.com/krlawrence/graph/tree/main/sample-data) untuk menunjukkan cara menggunakan Fungsi Spasial di Neptunus.

Jika data Anda memiliki properti lintang dan bujur yang terpisah alih-alih properti Geometri, Anda dapat mengonversinya menjadi titik pada waktu kueri. Temukan 10 bandara terdekat ke lokasi tertentu:

```
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
```

Jika Anda sudah memiliki lokasi yang disimpan`ST_Point`, Anda dapat menggunakan nilai lokasi tersebut secara langsung:

1. Mengatur properti

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

1. Kueri menggunakan 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
   ```

### Menggunakan driver Bolt
<a name="querying-spatial-data-bolt"></a>

Sebagian besar metode kueri mengembalikan nilai Geometri sebagai string WKT, yang dapat dibaca manusia. Jika Anda menggunakan driver Bolt, nilai Geometri dikembalikan dalam format WKB (Biner Terkenal) untuk efisiensi. Mengkonversi WKB ke objek Geometri dalam aplikasi Anda:

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

# Fungsi Spasial
<a name="access-graph-opencypher-22-spatial-functions"></a>

Fungsi spasial berikut tersedia di Neptunus OpenCypher untuk bekerja dengan tipe data geometri:
+ [ST\$1titik](access-graph-opencypher-22-spatial-functions-st-point.md)
+ [ST\$1 GeomFromText](access-graph-opencypher-22-spatial-functions-st-geomfromtext.md)
+ [ST\$1 AsText](access-graph-opencypher-22-spatial-functions-st-astext.md)
+ [ST\$1 GeometryType](access-graph-opencypher-22-spatial-functions-st-geometrytype.md)
+ [ST\$1sama](access-graph-opencypher-22-spatial-functions-st-equals.md)
+ [ST\$1Berisi](access-graph-opencypher-22-spatial-functions-st-contains.md)
+ [ST\$1berpotongan](access-graph-opencypher-22-spatial-functions-st-intersect.md)
+ [ST\$1Jarak](access-graph-opencypher-22-spatial-functions-st-distance.md)
+ [ST\$1 DistanceSpheroid](access-graph-opencypher-22-spatial-functions-st-distancespheroid.md)
+ [ST\$1amplop](access-graph-opencypher-22-spatial-functions-st-envelope.md)
+ [ST\$1Buffer](access-graph-opencypher-22-spatial-functions-st-buffer.md)

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

ST\$1point mengembalikan titik dari nilai koordinat masukan.

**Sintaksis**

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

**Argumen**
+ `x`- Nilai tipe data PRESISI GANDA yang mewakili koordinat pertama.
+ `y`- Nilai tipe data PRESISI GANDA yang mewakili koordinat kedua.
+ `z`- (opsional)

**Urutan koordinat**

**Saat bekerja dengan koordinat geografis, argumen pertama (`x`) mewakili **garis bujur** dan argumen kedua (`y`) mewakili garis lintang.** Ini mengikuti urutan koordinat standar yang digunakan dalam database spasial dan standar 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
```

**Rentang koordinat yang valid**

Untuk data geografis, pastikan koordinat berada dalam rentang yang valid:
+ Bujur (`x`): -180 hingga 180
+ Lintang (`y`): -90 hingga 90

Koordinat di luar rentang ini akan kembali `NaN` (Bukan Angka) bila digunakan dengan fungsi perhitungan jarak seperti`ST_DistanceSpheroid`.

**Jenis pengembalian**

GEOMETRI dari titik subtipe

Jika x atau y adalah null, maka null dikembalikan.

**Contoh**

Berikut ini membangun geometri titik dari koordinat masukan.

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

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

ST\$1 GeomFromText membangun objek geometri dari representasi teks terkenal (WKT) dari geometri input.

**Sintaksis**

```
ST_GeomFromText(wkt_string)
```

**Argumen**
+ `wkt_string`- Nilai tipe data STRING yang merupakan representasi WKT dari geometri.

**Jenis pengembalian**

GEOMETRY

Jika wkt\$1string adalah null, maka null dikembalikan.

Jika wkt\$1string tidak valid, maka a dikembalikan. BadRequestException 

**Contoh**

```
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\$1 AsText
<a name="access-graph-opencypher-22-spatial-functions-st-astext"></a>

ST\$1 AsText mengembalikan representasi teks terkenal (WKT) dari geometri input.

**Sintaksis**

```
ST_AsText(geo)
```

**Argumen**
+ `geo`- Nilai tipe data GEOMETRI, atau ekspresi yang mengevaluasi GEOMETRI.

**Jenis pengembalian**

STRING

Jika geo adalah null, maka null dikembalikan.

Jika parameter input bukan Geometri, maka a BadRequestException dikembalikan.

Jika hasilnya lebih besar dari STRING 64-KB, maka kesalahan dikembalikan.

**Contoh**

```
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\$1 GeometryType
<a name="access-graph-opencypher-22-spatial-functions-st-geometrytype"></a>

ST\$1 GeometryType mengembalikan jenis geometri sebagai string.

**Sintaksis**

```
ST_GeometryType(geom)
```

**Argumen**
+ `geom`- Nilai tipe data GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI.

**Jenis pengembalian**

STRING

Jika geom adalah null, maka null dikembalikan.

Jika parameter input bukan Geometri, maka a BadRequestException dikembalikan.

**Contoh**

```
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\$1sama
<a name="access-graph-opencypher-22-spatial-functions-st-equals"></a>

ST\$1equals mengembalikan true jika proyeksi 2D dari geometri masukan secara topologi sama. Geometri dianggap sama secara topologi jika memiliki himpunan titik yang sama. Dalam geometri yang sama secara topologi, urutan simpul mungkin berbeda sambil mempertahankan kesetaraan ini.

**Sintaksis**

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

**Argumen**
+ `geom1`- Nilai tipe data GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI.
+ `geom2`- Nilai tipe data GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI. Nilai ini dibandingkan dengan geom1 untuk menentukan apakah itu sama dengan geom1.

**Jenis pengembalian**

BOOLEAN

Jika geom1 atau geom2 adalah null, maka null dikembalikan.

Jika geom1 atau geom2 bukan Geometri, maka a dikembalikan. BadRequestException 

**Contoh**

```
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
```

Berikut ini memeriksa apakah kedua garis garis secara geometris sama.

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

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

ST\$1contains mengembalikan true jika proyeksi 2D dari geometri input pertama berisi proyeksi 2D dari geometri input kedua. Geometri A berisi geometri B jika setiap titik di B adalah titik di A, dan interiornya memiliki persimpangan yang tidak kosong. ST\$1contains (A, B) setara dengan st\$1Within (B, A).

**Sintaksis**

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

**Argumen**
+ `geom1`- Nilai tipe GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI.
+ `geom2`- Nilai tipe GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI. Nilai ini dibandingkan dengan geom1 untuk menentukan apakah itu terkandung dalam geom1.

**Jenis pengembalian**

BOOLEAN

Jika geom1 atau geom2 adalah null, maka null dikembalikan.

Jika parameter input bukan Geometri, maka a BadRequestException dikembalikan.

**Contoh**

```
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\$1berpotongan
<a name="access-graph-opencypher-22-spatial-functions-st-intersect"></a>

ST\$1Intersects mengembalikan true jika proyeksi 2D dari dua geometri input memiliki setidaknya satu titik yang sama.

**Sintaksis**

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

**Argumen**
+ `geom1`- Nilai tipe data GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI.
+ `geom2`- Nilai tipe data GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI.

**Jenis pengembalian**

BOOLEAN

Jika geom1 atau geom2 adalah null, maka null dikembalikan.

Jika parameter input bukan Geometri, maka a BadRequestException dikembalikan.

**Contoh**

```
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\$1Jarak
<a name="access-graph-opencypher-22-spatial-functions-st-distance"></a>

Untuk geometri masukan, ST\$1distance mengembalikan jarak Euclidean minimum antara proyeksi 2D dari dua nilai geometri input.

**Sintaksis**

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

**Argumen**
+ `geo1`- Nilai tipe data GEOMETRI, atau ekspresi yang mengevaluasi tipe GEOMETRI.
+ `geo2`- Nilai tipe data GEOMETRI, atau ekspresi yang mengevaluasi GEOMETRI.

**Jenis pengembalian**

PRESISI GANDA dalam satuan yang sama dengan geometri input.

Jika geo1 atau geo2 adalah null, maka null dikembalikan.

Jika parameter input bukan Geometri, maka a BadRequestException dikembalikan.

**Contoh**

```
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\$1 DistanceSpheroid
<a name="access-graph-opencypher-22-spatial-functions-st-distancespheroid"></a>

Mengembalikan jarak minimum dalam meter antara dua lon/lat geometri. Spheroid adalah WGS84 /SRID 4326.

**Sintaksis**

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

**Argumen**
+ `geom1`- Nilai tipe data GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI.
+ `geom2`- Nilai tipe data GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI.

**Jenis pengembalian**

FLOAT

Jika geom adalah null, maka null dikembalikan.

**Contoh**

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

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

ST\$1Envelope mengembalikan kotak batas minimum dari geometri masukan, sebagai berikut:
+ Jika geometri input kosong, geometri yang dikembalikan akan menjadi POINT EMPTY.
+ Jika kotak pembatas minimum dari geometri input merosot ke suatu titik, geometri yang dikembalikan adalah sebuah titik.
+ Jika tidak ada yang sebelumnya benar, fungsi mengembalikan counter-clockwise-oriented poligon yang simpulnya adalah sudut kotak pembatas minimum.

Untuk semua input nonempty, fungsi beroperasi pada proyeksi 2D dari geometri input.

**Sintaksis**

```
ST_Envelope(geom)
```

**Argumen**
+ `geom`- Nilai tipe data GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI.

**Jenis pengembalian**

GEOMETRY

Jika geom adalah null, maka null dikembalikan.

**Contoh**

```
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 mengembalikan geometri 2D yang mewakili semua titik yang jaraknya dari geometri input yang diproyeksikan pada bidang XY-Cartesian kurang dari atau sama dengan jarak input.

**Sintaksis**

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

**Argumen**
+ `geom`- Nilai tipe data GEOMETRI atau ekspresi yang mengevaluasi tipe GEOMETRI.
+ `distance`- Nilai tipe data PRESISI GANDA yang mewakili jarak (atau radius) buffer.
+ `number_of_segments_per_quarter_circle`- Nilai tipe data INTEGER (harus lebih besar atau sama dengan 0). Nilai ini menentukan jumlah titik untuk mendekati seperempat lingkaran di sekitar setiap simpul geometri input. Nilai negatif default ke nol. Defaultnya adalah 8.

**Jenis pengembalian**

GEOMETRY

Fungsi ST\$1Buffer mengembalikan geometri dua dimensi (2D) di bidang XY-Cartesian.

**Contoh**

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

Berikut ini mengembalikan buffer dari geometri titik input yang mendekati lingkaran. Karena perintah menentukan 3 sebagai jumlah segmen per seperempat lingkaran, fungsi menggunakan tiga segmen untuk memperkirakan lingkaran seperempat.

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