Gambaran Umum Tipe Data Spasial

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Ada dua jenis data spasial. Jenis data geometri mendukung data planar, atau Euclidean (bumi datar). Jenis data geometri keduanya sesuai dengan Fitur Sederhana Open Geospatial Consortium (OGC) untuk Spesifikasi SQL versi 1.1.0 dan sesuai dengan SQL MM (standar ISO). SQL Server juga mendukung jenis data geografi , yang menyimpan data elipsoidal (bumi bulat), seperti koordinat garis lintang dan bujur GPS.

Tip

Alat spasial SQL Server adalah kumpulan alat sumber terbuka yang disponsori Microsoft untuk digunakan dengan jenis spasial di SQL Server. Proyek ini menyediakan serangkaian fungsi yang dapat digunakan kembali yang dapat digunakan aplikasi. Fungsi-fungsi ini dapat mencakup rutinitas konversi data, transformasi baru, agregat, dll. Lihat Microsoft/SQLServerSpatialTools di GitHub untuk detail selengkapnya.

Objek data spasial

Jenis data geometri dan geografi mendukung 16 jenis objek data spasial, atau jenis instans. Namun, hanya 11 dari jenis instans ini yang dapat dibuat; Anda dapat membuat dan bekerja dengan instans ini (atau membuat instansnya) dalam database. Instans ini memperoleh properti tertentu dari jenis data induknya.

Gambar di bawah ini menunjukkan hierarki geometri di mana jenis data geometri dan geografi didasarkan. Jenis geometri dan geografi yang dapat instan ditunjukkan dengan warna biru.

geom_hierarchy

Ada jenis tambahan yang dapat digunakan untuk jenis data geografi: FullGlobe. Jenis geometri dan geografi dapat mengenali instans tertentu selama itu adalah instans yang terbentuk dengan baik, bahkan jika instans tidak ditentukan secara eksplisit. Misalnya, jika Anda menentukan instans Point secara eksplisit menggunakan metode STPointFromText(), geometri dan geografi mengenali instans sebagai Titik, selama input metode terbentuk dengan baik. Jika Anda menentukan instans yang sama menggunakan metode , STGeomFromText() jenis data geometri dan geografi mengenali instans sebagai Titik.

Subjenis untuk jenis geometri dan geografi dibagi menjadi jenis sederhana dan koleksi. Beberapa metode seperti STNumCurves() hanya berfungsi dengan jenis sederhana.

Jenis sederhananya adalah:

Jenis koleksi adalah:

Perbedaan jenis data geometri dan geografi

Dua jenis data spasial sering bersifat serupa. Ada beberapa perbedaan utama dalam cara data disimpan dan dimanipulasi.

Cara menyambungkan tepi didefinisikan

Data yang menentukan untuk jenis LineString dan Polygon hanyalah simpul. Tepi penghubung antara dua simpul dalam jenis geometri adalah garis lurus. Namun, tepi penghubung antara dua simpul dalam jenis geografi adalah busur elips besar pendek antara dua simpul. Elips yang besar adalah persimpangan elipsoid dengan bidang melalui pusatnya. Busur elips yang besar adalah segmen busur pada elips besar.

Bagaimana segmen busur melingkar didefinisikan

Segmen busur melingkar untuk jenis geometri didefinisikan pada bidang koordinat Kartesius XY (nilai Z diabaikan). Segmen busur melingkar untuk jenis geografi didefinisikan oleh segmen kurva pada bola referensi. Setiap paralel pada bola referensi dapat didefinisikan oleh dua busur melingkar pelengkap di mana titik-titik untuk kedua busur memiliki sudut lintang konstan.

Pengukuran dalam jenis data spasial

Dalam sistem planar (bumi datar), pengukuran jarak dan area diberikan dalam satuan pengukuran yang sama dengan koordinat. Menggunakan jenis data geometri, jarak antara (2, 2) dan (5, 6) adalah lima unit, terlepas dari unit yang digunakan.

Dalam sistem elips, atau bulat bumi, koordinat diberikan dalam derajat garis lintang dan bujur. Namun, panjang dan area biasanya diukur dalam meter dan meter persegi, meskipun pengukuran dapat bergantung pada pengidentifikasireferensi spasial instans geografi . Unit pengukuran yang paling umum untuk jenis data geografi adalah meter.

Orientasi data spasial

Orientasi cincin poligon bukanlah faktor penting dalam sistem planar. Fitur Sederhana OGC untuk Spesifikasi SQL tidak menentukan urutan cincin, dan SQL Server tidak memberlakukan pengurutan cincin.

Dalam sistem elipsoid, poligon tanpa orientasi tidak memiliki arti, atau ambigu. Misalnya, apakah cincin di sekitar khatulistiwa menggambarkan belahan bumi utara atau selatan? Jika kita menggunakan jenis data geografi untuk menyimpan instans spasial, kita harus menentukan orientasi cincin dan secara akurat menjelaskan lokasi instans.

Interior poligon dalam sistem elipsoidal didefinisikan oleh "aturan sebelah kiri": jika Anda membayangkan diri Anda berjalan di sepanjang cincin Poligon geografi, mengikuti titik-titik dalam urutan di mana mereka terdaftar, area di sebelah kiri diperlakukan sebagai interior Poligon, dan area di sebelah kanan sebagai eksterior Poligon.

Ketika tingkat kompatibilitas adalah 100 atau di bawahnya di SQL Server, jenis data geografi memiliki batasan berikut:

  • Setiap instans geografi harus pas di dalam satu belahan bumi. Tidak ada objek spasial yang lebih besar dari belahan bumi yang dapat disimpan.

  • Setiap instans geografi dari representasi Open Geospatial Consortium (OGC) Well-Known Text (WKT) atau Well-Known Binary (WKB) yang menghasilkan objek yang lebih besar dari belahan melempar ArgumentException.

  • Metode jenis data geografi yang memerlukan input dua instans geografi , seperti STIntersection(), STUnion(), STDifference(), dan STSymDifference(), akan mengembalikan null jika hasil dari metode tidak pas di dalam satu belahan. STBuffer() juga akan mengembalikan null jika output melebihi satu belahan.

Di SQL Server, FullGlobe adalah jenis poligon khusus yang mencakup seluruh dunia. Ini memiliki area, tetapi tidak ada batas atau simpul.

Cincin luar dan dalam dalam dalam geography jenis data

Fitur Sederhana OGC untuk Spesifikasi SQL membahas cincin luar dan cincin dalam, tetapi perbedaan ini tidak masuk akal untuk jenis data geografi SQL Server; cincin poligon apa pun dapat diambil untuk menjadi cincin luar.

Untuk informasi selengkapnya tentang spesifikasi OGC, lihat dokumen berikut ini:

Segmen busur melingkar

Tiga jenis instan dapat mengambil segmen busur melingkar: CircularString, CompoundCurve, dan CurvePolygon. Segmen busur melingkar didefinisikan oleh tiga titik dalam bidang dua dimensi dan titik ketiga tidak boleh sama dengan titik pertama. Beberapa contoh segmen busur melingkar:

circular_arc_segments

Dua contoh pertama menunjukkan segmen busur melingkar yang khas. Perhatikan bagaimana masing-masing dari tiga titik terletak di sekeliling lingkaran.

Dua contoh lainnya menunjukkan bagaimana segmen garis dapat didefinisikan sebagai segmen busur melingkar. Tiga titik masih diperlukan untuk menentukan segmen busur melingkar tidak seperti segmen garis biasa, yang dapat didefinisikan hanya dengan dua titik.

Metode yang beroperasi pada jenis segmen busur melingkar menggunakan segmen garis lurus untuk mempertanyakan busur melingkar. Jumlah segmen garis yang digunakan untuk mempertanyakan busur akan tergantung pada panjang dan kelengkungan busur. Nilai Z dapat disimpan untuk setiap jenis segmen busur melingkar, tetapi tidak akan digunakan dalam perhitungan.

Catatan

Jika nilai Z diberikan untuk segmen busur melingkar, maka nilai tersebut harus sama untuk semua titik di segmen busur melingkar agar diterima untuk input. Misalnya: CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) diterima, tetapi CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) tidak diterima.

Perbandingan LineString dan CircularString

Contoh ini menunjukkan cara menyimpan segitiga isosceles yang identik menggunakan instans LineString dan instans CircularString :

DECLARE @g1 geometry;
DECLARE @g2 geometry;
SET @g1 = geometry::STGeomFromText('LINESTRING(1 1, 5 1, 3 5, 1 1)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(1 1, 3 1, 5 1, 4 3, 3 5, 2 3, 1 1)', 0);
IF @g1.STIsValid() = 1 AND @g2.STIsValid() = 1
  BEGIN
      SELECT @g1.ToString(), @g2.ToString()
      SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]
  END

Perhatikan bahwa instans CircularString memerlukan tujuh poin untuk menentukan segitiga. Instans LineString hanya memerlukan empat poin untuk menentukan segitiga. Alasannya adalah bahwa instans CircularString menyimpan segmen busur melingkar dan bukan segmen garis. Sisi segitiga yang disimpan dalam instans CircularString adalah ABC, CDE, dan EFA. Sisi segitiga yang disimpan dalam instans LineString adalah AC, CE, dan EA.

Pertimbangkan contoh berikut:

SET @g1 = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 4 0)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(0 0, 2 2, 4 0)', 0);
SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length];

Berikut adalah hasil yang ditetapkan.

LS Length    CS Length
5.65685...   6.28318...

Instans CircularString menggunakan lebih sedikit titik untuk menyimpan batas kurva dengan presisi yang lebih besar daripada instans LineString . Instans CircularString berguna untuk menyimpan batas melingkar seperti radius pencarian 20 mil dari titik tertentu. Instans LineString baik untuk menyimpan batas yang linier seperti blok kota persegi.

Perbandingan LineString dan CompoundCurve

Contoh kode berikut menunjukkan cara menyimpan gambar yang sama menggunakan instans LineString dan CompoundCurve :

SET @g = geometry::Parse('LINESTRING(2 2, 4 2, 4 4, 2 4, 2 2)');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2), (4 2, 4 4), (4 4, 2 4), (2 4, 2 2))');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2, 4 4, 2 4, 2 2))');

Dalam contoh di atas, instans LineString atau instans CompoundCurve dapat menyimpan gambar. Contoh berikutnya ini menggunakan CompoundCurve untuk menyimpan ikatan pai:

SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(2 2, 1 3, 0 2),(0 2, 1 0, 2 2))');  

Instans CompoundCurve dapat menyimpan segmen busur melingkar (2 2, 1 3, 0 2) secara langsung, tetapi instans LineString harus mengonversi kurva menjadi beberapa segmen garis yang lebih kecil.

Perbandingan CircularString dan CompoundCurve

Contoh kode berikut menunjukkan bagaimana ikatan pai dapat disimpan dalam instans CircularString :

DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)');
SELECT @g.ToString(), @g.STLength();

Menyimpan ikatan pai menggunakan instans CircularString mengharuskan tiga titik digunakan untuk setiap segmen garis. Jika titik perantara tidak diketahui, titik perantara harus dihitung, atau titik akhir segmen garis harus digandakan seperti yang ditunjukkan cuplikan berikut:

SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');

Instans CompoundCurve memungkinkan komponen LineString dan CircularString sehingga hanya dua poin ke segmen garis ikatan pai perlu diketahui. Contoh kode ini menunjukkan cara menggunakan CompoundCurve untuk menyimpan gambar yang sama:

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING( 3 6.3246, 0 7, -3 6.3246), (-3 6.3246, 0 0, 3 6.3246))');
SELECT @g.ToString(), @g.STLength();

Perbandingan Poligon dan CurvePolygon

Instans CurvePolygon dapat menggunakan instans CircularString dan CompoundCurve saat menentukan cincin eksterior dan interiornya. Instans poligon tidak dapat.

Baca juga