Bagikan melalui


Poligon

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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.

Eksterior dan cincin interior Poligon mendefinisikan batasnya. Ruang dalam cincin mendefinisikan interior Poligon.

Ilustrasi di bawah ini menunjukkan contoh instans Polygon .

Examples of geometry Polygon instances

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 interior adalah bagian dari eksterior instans 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 ini adalah instans Poligon yang diterima:

  • Instans Poligon 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 instans 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 instans Poligon hanya perlu berisi cincin dengan empat poin yang akan diterima.

Contoh berikut melemparkan System.FormatException karena instans 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 eksterior tidak sama dengan titik akhir. Contoh berikut memiliki cincin eksterior yang dapat diterima, tetapi cincin interior tidak dapat diterima. Ini juga melempar .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 interior Poligon dapat menyentuh diri mereka sendiri dan satu sama lain pada satu titik tangen, tetapi jika cincin interior salib Poligon, instans 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 berlaku karena dua cincin interior menyentuh pada satu titik dan tidak saling melintasi. Contoh berikut menunjukkan Polygon instans 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 valid karena dua cincin dalam menyentuh pada beberapa titik berturut-turut. @g4 tidak valid karena interior dua cincin dalam 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. 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.

Berlawanan jajaran jajaran

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

Visualization of 'left-hand rule' counter-clockwise orientation

Searah jajaran

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

Visualization of 'left-hand rule' clockwise orientation

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 cocok di dalam satu belahan. STBuffer() juga akan mengembalikan null jika output melebihi satu belahan.

Orientasi dapat dibalik memanfaatkan metode perluasan ReorientObject .

Contoh

Contoh A.

Contoh berikut membuat instans sederhana geometryPolygon dengan celah 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 . Dalam contoh Polygonberikut, cincin interior dan eksterior tumpang tindih dan instans 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 di atas 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 di atas 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).

Lihat Juga

STArea (Jenis Data geometri)
STExteriorRing (Tipe Data geometri)
STNumInteriorRing (Jenis Data geometri)
STInteriorRingN (Jenis Data geometri)
STCentroid (Tipe Data geometri)
STPointOnSurface (Jenis Data geometri)
MultiPolygon
Data Spasial (SQL Server)
STIsValid (Jenis Data geografi)
STIsValid (Tipe Data geometri)