Polygon

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceTitik akhir analitik SQL di Microsoft FabricGudang di Microsoft FabricDatabase SQL di Microsoft Fabric

Poligon adalah permukaan dua dimensi yang disimpan sebagai urutan titik yang menentukan cincin pembatas eksterior dan cincin interior nol atau lebih.

Instans poligon

Instans Poligon dapat dibentuk dari cincin yang memiliki setidaknya tiga titik berbeda. Instans Poligon juga dapat kosong.

Bagian luar dan cincin interior apa pun dari Poligon menentukan batasnya. Area di dalam cincin-cincin tersebut menentukan bagian dalam Polygon.

Ilustrasi berikut menunjukkan contoh instans Polygon.

Contoh instans Poligon geometri.

Seperti yang ditunjukkan dalam ilustrasi:

  1. Gambar 1 adalah instans Poligon yang batasnya didefinisikan oleh cincin eksterior.

  2. Gambar 2 adalah instans Poligon yang batasnya didefinisikan oleh cincin eksterior dan dua cincin interior. Area di dalam cincin bagian dalam merupakan bagian dari eksterior instance Polygon.

  3. Gambar 3 adalah instans Poligon yang valid karena cincin interiornya bersinggungan pada satu titik tangen.

Instans yang diterima

Instans Poligon yang Diterima adalah instans yang dapat disimpan dalam variabel geometri atau geografi tanpa melemparkan pengecualian. Berikut adalah instans Polygon yang diterima:

  • Instans Polygon kosong
  • Instans Polygon yang memiliki cincin eksterior yang dapat diterima (LineString) dan nol atau lebih cincin interior yang dapat diterima (LineStrings)

Kriteria berikut diperlukan agar cincin (LineString) dapat diterima.

  • Instans LineString harus diterima.
  • Instans LineString harus memiliki setidaknya empat poin.
  • Titik awal dan akhir instans LineString harus sama.

Contoh berikut menunjukkan instance Poligon yang diterima.

DECLARE @g1 geometry = 'POLYGON EMPTY';  
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 1))';  
DECLARE @g3 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 3 3, 0 3, 0 0))';  
DECLARE @g4 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(3 0, 6 0, 6 3, 3 3, 3 0))';  
DECLARE @g5 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';  

Karena @g4 dan @g5 menunjukkan instans Polygon yang diterima mungkin bukan instans Polygon yang valid. @g5 juga menunjukkan bahwa sebuah instance Polygon hanya perlu berisi satu ring dengan empat titik apa pun agar diterima.

Contoh berikut menghasilkan System.FormatException karena instance Polygon tidak diterima.

DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';  
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';  

@g1 tidak diterima karena instans LineString untuk cincin eksterior tidak berisi cukup poin. @g2tidak diterima karena titik awal instans LineString cincin luar tidak sama dengan titik akhirnya. Contoh berikut memiliki cincin eksterior yang dapat diterima, tetapi cincin interior tidak dapat diterima. Ini juga menghasilkan System.FormatException.

DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';  

Instans yang valid

Cincin bagian dalam dari Polygon dapat bersinggungan dengan dirinya sendiri maupun satu sama lain pada satu titik singgung, tetapi jika cincin bagian dalam dari Polygon saling berpotongan, instance tersebut tidak valid.

Contoh berikut menunjukkan instans Poligon yang valid.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20))';  
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0))';  
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, -5 -10, -10 0))';  
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();  

@g3 valid karena dua cincin bagian dalam bersinggungan pada satu titik dan tidak saling berpotongan. Contoh berikut menunjukkan instance Polygon yang tidak valid.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (20 0, 0 10, 0 -20, 20 0))';  
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (5 0, 1 5, 1 -5, 5 0))';  
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, 0 -10, -10 0))';  
DECLARE @g4 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 1 5, 0 -10, -10 0))';  
DECLARE @g5 geometry = 'POLYGON((10 0, 0 10, 0 -10, 10 0), (-20 -20, -20 20, 20 20, 20 -20, -20 -20) )';  
DECLARE @g6 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';  
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid(), @g6.STIsValid();  

@g1 tidak valid karena cincin dalam menyentuh cincin eksterior di dua tempat. @g2 tidak valid karena cincin dalam kedua di dalam interior cincin dalam pertama. @g3 tidak sah karena dua cincin bagian dalam bersentuhan di beberapa titik yang berurutan. @g4 tidak valid karena bagian dalam dari dua cincin bagian dalam saling tumpang tindih. @g5 tidak valid karena cincin eksterior bukan cincin pertama. @g6 tidak valid karena cincin tidak memiliki setidaknya tiga titik yang berbeda.

Orientasi data spasial

Orientasi cincin poligon bukanlah faktor penting dalam sistem planar. Spesifikasi Fitur Sederhana OGC untuk SQL tidak menetapkan urutan ring, dan SQL Server tidak menerapkan urutan ring.

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.

Counter-clockwise

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;

Visualisasi orientasi berlawanan arah jarum jam menurut 'aturan tangan kiri'.

Clockwise

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;

Visualisasi orientasi searah jarum jam menurut 'kaidah tangan kiri'.

Ketika tingkat kompatibilitas adalah 100 atau lebih rendah 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 lebih besar dari belahan bumi akan memunculkan 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 cocok di dalam satu belahan. STBuffer() juga akan mengembalikan null jika hasilnya melebihi satu hemisfer.

Orientasi dapat dibalik dengan memanfaatkan metode ekstensi ReorientObject (jenis data geografi).

Examples

Contoh A.

Contoh berikut membuat instance sederhana geometry Polygon dengan gap dan SRID 10.

DECLARE @g geometry;  
SET @g = geometry::STPolyFromText(
    'POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))',
    10);

Contoh B.

Instans yang tidak valid dapat dimasukkan dan dikonversi ke instans yang valid geometry . Pada contoh Polygon berikut, cincin bagian dalam dan luar saling tumpang tindih dan objek tersebut tidak valid.

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

Contoh C.

Dalam contoh berikut, instans yang tidak valid dibuat valid dengan MakeValid().

SET @g = @g.MakeValid();  
SELECT @g.ToString();  

geometry Instans yang dikembalikan dari contoh sebelumnya adalah MultiPolygon.

MULTIPOLYGON (((2 0, 3 1, 2 2, 1.5 1.5, 2 1, 1.5 0.5, 2 0)),
              ((1 0, 1.5 0.5, 1 1, 1.5 1.5, 1 2, 0 1, 1 0)))

Contoh D.

Ini adalah contoh lain untuk mengonversi instans yang tidak valid ke instans geometri yang valid. Dalam contoh Polygon berikut, instans telah dibuat menggunakan tiga poin yang sama persis:

DECLARE @g geometry  
SET @g = geometry::Parse('POLYGON((1 3, 1 3, 1 3, 1 3))');  
SET @g = @g.MakeValid();  
SELECT @g.ToString()  

Instans geometri yang dikembalikan sebelumnya adalah Point(1 3). Jika yang Polygon diberikan POLYGON((1 3, 1 5, 1 3, 1 3)) maka MakeValid() akan mengembalikan LINESTRING(1 3, 1 5).