No meu último post, eu falei sobre a função geometrica CircularString
introduzidos no SQL Server Denali, que permite que você
defina segmentos de curva circular entre os pontos em uma
série, com cada segmento do arco circular definida por um
ponto de ancoragem entre os dois terminais.
Neste post, eu vou falar sobre outro tipo função geometrica -
a CompoundCurve. Considerando que o LineString define uma
geometria tridimensional por interpolação linear entre uma
série de pontos, e o CircularString usa circular
interpolação, a CompoundCurve pode incluir uma mistura de
ambos os tipos.
Aqui está a sintaxe WKT de CompoundCurve constituído por
dois segmentos de linha e dois segmentos de arco circular. Aviso
que os segmentos de arco circular dentro da curva deve ser
prefixo CIRCULARSTRING, enquanto segmentos lineares
não exigem (e, de fato, não deve ter) a
palavra-chave LINESTRING correspondente.
DECLARE @CompoundCurve geometry = 'COMPOUNDCURVE((5 3, 5 13), CIRCULARSTRING(5 13, 7 15, 9 13), (9 13, 9 3), CIRCULARSTRING(9 3, 7 1, 5 3))'

O que é interessante é que nós realmente não precisamos usar a CompoundCurve para definir a geometria. A função CircularString só pode conter uma mistura de bordas curvas eretas: para bordas de linha reta, do ponto de ancoragem simplesmente precisa estar na linha reta entre o ponto de início e término. Por isso, poderia criar exatamente a mesma geometria utilizando o CircularString definindo um ponto adicional de ancoragem em cada um dos lados da seguinte forma:
DECLARE @CircularString geometry = 'CIRCULARSTRING(5 3, 5 8, 5 13, 7 15, 9 13, 9 8, 9 3

De fato, como dito anteriormente, a CompoundCurve é muito parecido com um GeometryCollection contendo uma mistura de LineStrings e CircularStrings. Portanto, poderíamos também definir esta mesma geometria da seguinte forma:
DECLARE @ geometria GeometryCollectionGEOMETRYCOLLECTION = '(LINESTRING (5 3, 5 13),CIRCULARSTRING (5 13 7 15 9 13), LINESTRING (9 13 9 3),CIRCULARSTRING (9 3 7 1, 5 3)) ';
Todas estas três instâncias contêm exatamente o mesmo conjunto de pontos, como pode ser demonstrado com o seguinte código:
SELECT@CompoundCurve.STEquals (@ CircularString) -retorna 1 (verdadeiro)
SELECT@CompoundCurve.STEquals (@ GeometryCollection) -retorna 1 (verdadeiro)
Você também pode testar o comprimento de cada instância:
SELECT@CompoundCurve.STLength (); - 32,5663706143592
SELECT@CircularString.STLength (); - 32,5663706143592
SELECT@GeometryCollection.STLength (); - 32,5663706143592
(Os dois segmentos de linha são 10 unidades de comprimento, eos dois arcos circulares combinados formam um círculo de raio 2 unidades. (10 * 2) + (2 * PI * 2) = 32,5663706143592)
Então, por que você nunca iria querer usar a classeCompoundCurve? Bem, embora não oferece mais funcionalidades que as duas alternativas apresentadas aqui, e representa exatamente o mesmo conjunto de pontos, ele fornece uma maneira mais eficiente de representar que a geometria, certamente em termos de espaço de armazenamento necessário. Comparando o tamanho de cada geometria neste exemplo:
Isso ocorre porque a CompoundCurve não requer a sobrecarga adicional da GeometryCollection (que é capaz de armazenar qualquer tipo de geometria), nem os pontos adicionais exigidas pela CircularString para definir os segmentos de linha reta.
Um Abraço a todos e até o próximo post.