Aracılığıyla paylaş


Polygon

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL analiz uç noktasıMicrosoft Fabric'te ambarMicrosoft Fabric'te SQL veritabanı

Çokgen, dış sınırlayıcı halkayı ve sıfır veya daha fazla iç halkayı tanımlayan bir nokta dizisi olarak depolanan iki boyutlu bir yüzeydir.

Çokgen örnekler

Çokgen örnek, en az üç ayrı noktası olan bir halkadan oluşturulabilir. Çokgen bir örnek de boş olabilir.

Bir Poligonun dış ve iç halkaları sınırını tanımlar. Halkaların içindeki boşluk , Çokgen'in içini tanımlar.

Aşağıdaki çizimde Çokgen örnekleri gösterilmiştir.

Geometri Çokgen örnekleri.

Çizimde gösterildiği gibi:

  1. Şekil 1, sınırı dış halka tarafından tanımlanan çokgen bir örnektir.

  2. Şekil 2, sınırı dış halka ve iki iç halka ile tanımlanan çokgen bir örnektir. İç halkaların içindeki alan , Çokgen örneğinin dış kısmının bir parçasıdır.

  3. Şekil 3 geçerli bir Çokgen örneğidir çünkü iç halkaları tek bir tanjant noktasında kesişmektedir.

Kabul edilen örnekler

Kabul edilen Çokgen örnekleri, özel durum oluşturmadan geometri veya coğrafya değişkeninde depolanabilen örneklerdir. Aşağıdakiler Çokgen örnekleri kabul edilir:

  • Boş bir Çokgen örneği
  • Kabul edilebilir bir dış halkaya (LineString) ve sıfır veya daha fazla kabul edilebilir iç halkaya (LineStrings) sahip bir Polygon örneği

Halkanın (LineString) kabul edilebilir olması için aşağıdaki ölçütler gereklidir.

  • LineString örneği kabul edilmelidir.
  • LineString örneğinin en az dört noktası olmalıdır.
  • LineString örneğinin başlangıç ve bitiş noktaları aynı olmalıdır.

Aşağıdaki örnekte kabul edilen Çokgen örnekleri gösterilmektedir.

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))';  

@g4 ve @g5 kabul edilen bir Çokgen örneğinin geçerli bir Çokgen örneği olmayabileceğini gösterir. @g5 ayrıca, bir Çokgen örneğinin kabul edilmesi için yalnızca dört nokta içeren bir halka içermesi gerektiğini gösterir.

Aşağıdaki örnekler bir System.FormatException fırlatır çünkü Çokgen örnekleri kabul edilmez.

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

@g1 kabul edilmiyor çünkü dış halka için LineString örneği yeterli nokta içermiyor. @g2 kabul edilmez çünkü dış halka LineString örneğinin başlangıç noktası bitiş noktasıyla aynı değil. Aşağıdaki örnekte kabul edilebilir bir dış halka vardır, ancak iç halka kabul edilemez. Bu da bir System.FormatException oluşturur.

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

Geçerli örnekler

Bir Çokgen'in iç halkaları teğet noktalarında hem kendilerine hem de birbirlerine dokunabilir, ancak bir Çokgen'in iç halkaları kesişirse, örnek geçersizdir.

Aşağıdaki örnekte geçerli Çokgen örnekleri gösterilmektedir.

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 geçerli çünkü iki iç halka tek bir noktada dokunuyor ve birbirleriyle kesişmiyor. Aşağıdaki örnekte geçerli olmayan örnekler gösterilmektedir Polygon .

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 geçerli değildir çünkü iç halka dış halkaya iki yerden dokunur. @g2 geçerli değildir çünkü ilk iç halkanın içindeki ikinci iç halkadır. @g3 geçerli değildir çünkü iki iç halka birbirini izleyen birden çok noktaya dokunur. @g4 geçerli değildir çünkü iki iç halkanın iç kısımları çakışıyor. @g5 geçerli değildir çünkü dış halka ilk halka değildir. @g6 geçerli değildir çünkü halkanın en az üç ayrı noktası yoktur.

Uzamsal verilerin yönü

Çokgenin halka yönü, planar sistemde önemli bir faktör değildir. SQL için OGC Basit Özellikler Belirtimi bir halka sıralamasını dikte etmez ve SQL Server halka sıralamasını uygulamaz.

Elipsoid bir sistemde, yönü olmayan bir çokgenin bir anlamı yoktur veya belirsizdir. Örneğin, ekvator çevresindeki bir halka kuzey veya güney yarım küreyi tanımlar mı? Uzamsal örneği depolamak için coğrafya veri türünü kullanırsak halkanın yönünü belirtmemiz ve örneğin konumunu doğru şekilde açıklamamız gerekir.

Elipoid sistemdeki poligonun iç kısmı "sol el kuralı" ile tanımlanır: Kendinizi bir coğrafya Poligonunun halkası boyunca yürüdüğünü düşünüyorsanız, listelendikleri sırayla noktaları takip ederseniz, soldaki alan Çokgen'in iç kısmı ve sağ taraftaki alan Poligon'un dış kısmı olarak ele alınır.

Saat yönünün tersine

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

'Sol el kuralı' yönünün saat yönünün tersine görselleştirilmesi.

Saat yönünde

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

'Sol el kuralı'nın saat yönünde görselleştirilmesi.

SQL Server'da uyumluluk düzeyi 100 veya daha düşük olduğunda , coğrafya veri türü aşağıdaki kısıtlamalara sahiptir:

  • Her coğrafya örneğinin tek bir yarım küreye sığması gerekir. Bir yarım küreden daha büyük uzamsal nesneler depolanamaz.

  • Açık Jeo-Uzamsal Konsorsiyum (OGC) Well-Known Metin (WKT) veya Well-Known İkili (WKB) gösterimlerinden elde edilen ve yarım küreden daha büyük bir nesne oluşturan tüm coğrafya örnekleri bir ArgumentException hatası oluşturur.

  • İki coğrafya örneğinin (, , ve STIntersection()STUnion()gibiSTDifference()STSymDifference()) girişini gerektiren coğrafya veri türü yöntemleri, yöntemlerin sonuçları tek bir yarım küreye sığmazsa null döndürür. STBuffer() ayrıca çıkış tek bir yarım küreyi aşarsa null döndürür.

Yönlendirme, ReorientObject (coğrafya Veri Türü) genişletilmiş yönteminden yararlanarak tersine çevrilebilir.

Examples

Örnek A.

Aşağıdaki örnek, bir boşluk ve SRID 10 ile basit geometry Polygon bir örnek oluşturur.

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

Örnek B.

Geçerli olmayan bir örnek girilebilir ve geçerli geometry bir örneğe dönüştürülebilir. Aşağıdaki örneğinde Polygoniç ve dış halkalar çakışıyor ve örnek geçerli değil.

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))'
    );  

Örnek C.

Aşağıdaki örnekte, geçersiz örnek MakeValid() kullanılarak geçerli hale getirilmiştir.

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

Önceki geometry örnekten döndürülen örnek bir MultiPolygonörneğidir.

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

Örnek D.

Bu, geçersiz bir örneği geçerli bir geometri örneğine dönüştürmenin başka bir örneğidir. Aşağıdaki örnekte Polygon örnek, tam olarak aynı olan üç nokta kullanılarak oluşturulmuştur:

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

Daha önce döndürülen geometri örneği bir Point(1 3)şeklindedir. Eğer Polygon verilen POLYGON((1 3, 1 5, 1 3, 1 3)) ise, MakeValid()LINESTRING(1 3, 1 5) döndürür.