2016-03-31 16 views
0

'dan genişletin Basit bir geometri çokgen şekline sahibim. Sınırlama kutusunu STEnvelope() kullanarak alabilirim. Temel olarak ekran görüntüsüne benzer şekilde uzaklaştırmak için noktaları orantılı olarak genişletmek istiyorum.Noktaları Geometry.STEnvelope()

Mssql sunucusunun bunu yapma yeteneği var mı?

  DECLARE @g GEOMETRY; 
     SET @g = GEOMETRY::STPolyFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326); 
     SELECT @g.STEnvelope() 

screen

Güncelleme: Ben bir çokgen ölçeklemek için bir demo sql komutu oluşturun. Bunun yerine, daha sonra sağdaki yeni poligonun merkezlenmesi. Yanlış yapıyorum

  DECLARE @zoom DECIMAL(22,22); 
     SET @zoom = 0.00001; 

     DECLARE @g GEOMETRY; 
     SET @g = geometry::STGeomFromText('POLYGON ((-12934935.9561 5405312.0569999963, -12934925.8363 5405305.5031, -12934930.8382 5405297.7252999991, -12934940.957899999 5405304.2792000026, -12934935.9561 5405312.0569999963))', 3857) 

     SELECT @g.STPointN(1) 
     UNION ALL 
     SELECT @g.STPointN(2) 
     UNION ALL 
     SELECT @g.STPointN(3) 
     UNION ALL 
     SELECT @g.STPointN(4) 
     UNION ALL 
     SELECT Geometry::Point(@g.STPointN(1).STX + (@g.STPointN(1).STX * (CASE WHEN @g.STPointN(1).STX > 0 THEN @zoom ELSE [email protected] END)), @g.STPointN(1).STY + (@g.STPointN(1).STY * (CASE WHEN @g.STPointN(1).STY > 0 THEN @zoom ELSE [email protected] END)), 3857) 
     UNION ALL 
     SELECT Geometry::Point(@g.STPointN(2).STX + (@g.STPointN(2).STX * (CASE WHEN @g.STPointN(2).STX > 0 THEN @zoom ELSE [email protected] END)), @g.STPointN(2).STY + (@g.STPointN(2).STY * (CASE WHEN @g.STPointN(2).STY > 0 THEN @zoom ELSE [email protected] END)), 3857) 
     UNION ALL 
     SELECT Geometry::Point(@g.STPointN(3).STX + (@g.STPointN(3).STX * (CASE WHEN @g.STPointN(3).STX > 0 THEN @zoom ELSE [email protected] END)), @g.STPointN(3).STY + (@g.STPointN(3).STY * (CASE WHEN @g.STPointN(3).STY > 0 THEN @zoom ELSE [email protected] END)), 3857) 
     UNION ALL 
     SELECT Geometry::Point(@g.STPointN(4).STX + (@g.STPointN(4).STX * (CASE WHEN @g.STPointN(4).STX > 0 THEN @zoom ELSE [email protected] END)), @g.STPointN(4).STY + (@g.STPointN(4).STY * (CASE WHEN @g.STPointN(4).STY > 0 THEN @zoom ELSE [email protected] END)), 3857) 

enter image description here

?

+0

kısa, hayır, MS SQL Server, _scaling_ (onu çağırdığınızda yakınlaştırma) geometri nesneleri için yerleşik bir Geometri yöntemine sahip değil. 'STBuffer' yöntemi, bir geometri nesnesi etrafında belirli bir boyutta bir tampon koyacaktır (bunu, CSS'de _padding_'e benzetebilirsiniz), ancak aradığınız çözümden şüphe duyuyorum. Özel bir işlev yazılmalıdır. –

+0

Özel bir işlev oluşturmaya yönelik bazı işaretçiler ve kabul edilen yanıt, bir CLR depolanmış prok uygulamasında sarılabileceğiniz bir C# kitaplığından bahseder. Http://stackoverflow.com/questions/1109536/an-algorithm-for-inflating-deflating- dengeleme-arabelleğe alma-poligonlar –

+0

Kathy, her seferinde kareleri mi arıyorsun yoksa sadece senin örneğinde kareler kullandın mı, ama gerçekte bu herhangi bir dikdörtgen şekil olabilir mi? –

cevap