SQL 2008 için çokgen “handedness” i değiştirin (çokgen tepe noktası sırası ters)


11

Ben bir kaç yüz şekilleri (var polygonler ve multipolygonlar) onlarca Ben SQL 2008 girmeye çalışıyorum o noktalarda binlerce oluşan her.

Ne yazık ki, içe aktarmaya çalıştığım şekiller "sağ elle" (her birinin çevresi içerdiği noktalar etrafında saat yönünde çizilir). SQL sunucusu, en azından geographytipler için "solak" şekiller (iç mekanda saat yönünün tersine) alır . Bu, SQL, şeklim dışında tüm dünyayı seçmeye çalıştığımı varsayar . Bazı insanlar bunu "içten dışa" şekiller olarak tanımlar.

Gönderen MSDN bombalanmasını demiyor, hangi halka yönelim bir kullanmaktır:

geographyUzamsal örneği saklamak için veri türünü kullanırsak, halkanın yönünü belirtmeli ve örneğin konumunu doğru bir şekilde tanımlamalıyız.

SQL 2008'de yanlış halka yönünü kullanırsanız, aşağıdaki hatayla kilitlenir (benimkini vurgulayın):

Kullanıcı tanımlı rutin veya toplu "coğrafya" yürütülürken bir .NET Framework hatası oluştu: Microsoft.SqlServer.Types.GLArgumentException: 24205: Belirtilen girdi, tek bir yarım küreyi aştığı için geçerli bir coğrafya örneğini temsil etmiyor. Her coğrafya örneği tek bir yarımkürenin içine sığmalıdır. Bu hatanın yaygın bir nedeni, bir çokgenin yanlış halka yönüne sahip olmasıdır.

Şekiller geometryyerine içe aktarma geographyiyi çalışıyor, ancak geographyyapabilirsem kullanmak istiyorum .

SQL 2012'de, bu sorunu düzeltmek oldukça önemsiz görünüyor , ancak 2008'e bağlıyım.

Şekilleri nasıl dönüştürmeliyim?


1
+1 harika bir soru ... Sql sunucusunun solak şekilleri aldığını söyleyen bir bağlantınız var mı?
Kirk Kuykendall

@Kirk Teşekkürler. Resmi belgeleri bulmakta sorun yaşıyorum, ancak MSDN (burada hangi şekilde kullanacağını söylemese de) önemli olduğunu söyledi "halka yönlendirme" diyor. Ayrıca çöktüğünde bir hata alırım.
Michael - Clay Shirky

Yanıtlar:


14

Spatial Ed'in blogunun özlü bir çözümü vardı. İşte dönüşümü gösteren bazı SQL:

DECLARE @geom GEOMETRY = 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))';
DECLARE @geog GEOGRAPHY = @geom.MakeValid().STUnion(@geom.STStartPoint()).STAsText()

Ed'in gönderisinden bir alıntı :

Bu davranışın anahtarı STUnion()yöntemdir. Bu, belirli bir özellik için tüm geometri üzerinde çalışan, OGC tabanlı bir yöntem olduğundan, çokgenleri yöntem için gereken yönlendirmeye zorlar - ki bu sadece Geography[...] tipi için kullanılır . Gösterilen bu yöntem, oldukça küçüktür, başını küçük tutar [...].


2
SQL Server 2008 R2'de, STUnion () içine de .MakeValid () koymak zorunda kaldım ve bunu işe almak için: .STUnion (@ geom.MakeValid (). STStartPoint ())
Chris Smith

@Smitty SQL'in başlangıç ​​noktasını başka türlü belirleyemediği durumlar için bu mantıklıdır. Belki de şekil kendi başına veya diğer garip koşullarda iki katına çıkarsa?
Michael - Clay Shirky

Evet, benim durumumda, şekil çılgın ve kendisiyle örtüşüyor.
Chris Smith

0

> = SQL Server 2012'de, ReorientObject () yöntemi bunu başarmalıdır. <SQL Server 2012 için aşağıdaki alternatif bir yöntemdir.

Varolan bir SQL coğrafyası @g için, aşağıdaki kod noktaları çıkarır ve noktaları (köşeleri) ters sırada olan bir çokgeni yeniden oluşturur:
(NOT 1: basit çokgenler için çalışır, çokgenler veya halkalar / sentroidli çokgenler için değil)
(NOT 2: SRID 4326 (WGS 84) koordinat sistemini kullanarak)

--For existing geography @g
DECLARE @GeometryText varchar(max), @ReversedPolygon geography
DECLARE @GeometryType varchar(20) = 'POLYGON', @Count int
SET @Count = @g.STNumPoints()
WHILE @Count > 0
BEGIN
    SET @GeometryText = @GeometryText + CONVERT(varchar(30),CONVERT(decimal(12,8),@g.STPointN(@Count).Long)) + ' ' + CONVERT(varchar(30),CONVERT(decimal(12,8),@g.STPointN(@Count).Lat))
    SET @Count = @Count - 1
    IF @Count > 0 SET @GeometryText = @GeometryText + ','
END
SET @GeometryText = @GeometryType +'((' + @GeometryText + '))'
SET @ReversedPolygon = geography::STGeomFromText(@GeometryText, 4326); 

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.