Eu tenho algumas centenas de formas ( polygon
s e multipolygon
s) cada uma composta por dezenas de milhares de pontos que eu estou tentando entrar em SQL Server 2008.
Infelizmente, as formas que tentei importar são "destras" (o perímetro de cada uma é desenhado no sentido horário em torno dos pontos que ela contém). O servidor SQL assume formas "canhotas" (anti-horário no interior), pelo menos para os geography
tipos. Isso significa que o SQL assume que estou tentando selecionar a terra inteira, exceto a minha forma. Algumas pessoas descrevem isso como formas "de dentro para fora".
Do MSDN , que frustrantemente não diz qual orientação de toque usar:
Se usarmos o
geography
tipo de dados para armazenar a instância espacial, devemos especificar a orientação do anel e descrever com precisão o local da instância.
Se você usar a orientação de toque incorreta no SQL 2008, ela trava com o seguinte erro (ênfase minha):
Ocorreu um erro do .NET Framework durante a execução da rotina definida pelo usuário ou da "geografia" agregada: Microsoft.SqlServer.Types.GLArgumentException: 24205: A entrada especificada não representa uma instância geográfica válida porque excede um único hemisfério. Cada instância geográfica deve caber dentro de um único hemisfério. Um motivo comum para esse erro é que um polígono tem a orientação incorreta do toque.
Importar as formas como em geometry
vez de geography
funcionar bem, mas eu gostaria de usar geography
se puder.
No SQL 2012, parece bastante trivial corrigir esse problema, mas estou vinculado a 2008.
Como devo converter as formas?
fonte
Respostas:
O blog do Spatial Ed tinha uma solução concisa. Aqui está algum SQL demonstrando a transformação:
E um trecho do post de Ed:
fonte
Em> = SQL Server 2012, o método ReorientObject () deve fazer isso. Para <SQL Server 2012, abaixo está um método alternativo.
Para uma geografia SQL existente @g, o código abaixo extrai os pontos e recria um polígono com pontos (vértices) na ordem inversa:
(NOTA 1: funciona para polígonos simples, não para multipolígonos ou polígonos com anéis / centróides)
(NOTA 2: usando o sistema de coordenadas SRID 4326 (WGS 84))
fonte
Parece que eu posso usar algum híbrido profano de SQL e C # do SQL Server Spatial Tools , conforme sugerido no Stack Overflow .
Nota: No momento em que esta resposta foi publicada, não havia muitas informações por aí. Por favor, não tente esse método, a menos que você já precise do SQL Server Spatial Tools para outra coisa. Em vez disso, tente uma das outras respostas aqui ou no Stack Overflow .
fonte