Validação Oracle para tabelas espaciais
Autor: Mario Leonel Martinez Junior | Publicado: 2014-05-21T19:55:00-04:00

&nbsp; Hoje vamos falar um pouco sobre validação de tabelas espaciais no Oracle, eu fiz esse estudo há alguns anos atras e agora compartilho com a comundade Oracle de Plantão. O Banco de dados Oracle quando utilizado para armazenar dados espaciais requer que a tabela possua um campo do tipo sdo_geometry.Esse tipo de campo suporta a inserção de dados no formato Gis, onde são inseridos, por exemplo, informações como:Latitude, Longitude, dimensão, limites, projeção, fuso etc...Baseados nessas informações o Oracle monta um modelo de dados baseado em pontos formando a figura geométrica. &nbsp; &nbsp;  &nbsp; &nbsp; Podemos desta forma criar desde pontos a polygonos que podem ser usados para representar cursos de rios,áreas delimitadas,lagoas e nascentes.Para que seja possível criar essas representações espaciais os dados espaciais contidos nas tabelas devem ser íntegros e livres de erros geométricos. Como o Oracle não impede que os dados espaciais inconsistentes sejam inseridos a validação espacial deve ser feita após a inserção dos dados. Na imagem abaixo podemos ver alguns dos principais erros geométricos: &nbsp;  &nbsp; Ferramentas como o Geomedia e o Arcgis possuem uma validação nativa que pode serusada pelos usuários.Ilustração Geomedia: Em tools-&gt;Validate Geometria         &nbsp; &nbsp; É possível escolher uma tabela e verificar se a mesma esta valida segundo as regras básicas de integridade espacial.Contudo as referidas ferramentas possuem precisões geométricas distintas o que torna sua validação menos confiável, o que em alguns casos pode causar uma falsa impressão de dados geométricos validos. Mas ao transportar de uma ferramenta para outra, layers com problemas espaciais causam problemas, sendo exibidas de forma incorretas ou incompletas.Para contornar esse tipo de problema, procedemos da seguinte forma:O primeiro passo é definir a precisão em que trabalharemos, quanto menor fora a precisão menor será a tolerância a erros.Utilizar o pacote de validação Oracle sdo_geom para verificar a integridade dos dados espaciais.Esse pacote do Oracle realiza uma verificação de consistência para tipos geométricos validos e retorna de forma textual se a geometria esta valida.Exemplo:  select * from ( select 'LOTE_ORIGINAL'TABELA,COD_LOTE CAMPO_ID,desc_erro_geom(sdo_geom.validate_geometry_with_context(GEOMETRIA,0.01001))ERRO from LOTE_ORIGINAL ) where erro!= 'TRUE' Onde Lote_original é o nome da tabela a ser validadaSdo_geom.validate_geometry_with_context é o pacote oracle de validaçãoGeometria é o campo sdo_geometry0.01001 é a precisão usada De acordo com a aplicação deste comando, serão retornados somente os campos onde erro for diferente de TRUE, caso exista alguma ocorrência será apresentado com código de erro.A função sdo_geom verifica a consistência do tipo de geometria e da geometriaPara consistência da geometria a função checa o seguinte: Se o SDO_GTYPE é valido. Se o valor do SDO_ETYPE é consistente com o valor do SDO_GTYPE .Por exemplo, se o SDO_GTYPE é 2003, ele deve ter no mínimo um elemento do tipo POLYGON na geometria. Se o SDO_ELEM_INFO_ARRAY possui valores triplet validos.Para consistência da geometria, a função checa o seguinte: Polígonos devem possuir no mínimo quarto pontos, os quais incluem os pontos que fecham o polygono. Polygonos não se cruzam. Nenhum dos vértices de uma linha ou polygono são o mesmo. Polygonos são orientados corretamente. (Os limites do anel exterior devem estar no sentido anti-horário e os limites interior no sentido horário.) O anel interior do polygono toca o polygono exterior em não mais que um ponto. Se dois ou mais anéis interiores do polygono estiverem em um anel exterior, o polygono interior não pode tocar mais que um ponto. Linhas devem ter no mínimo dois pontos. Os valores do SDO_ETYPE 1-digito e 4-dígitos não sejam misturados (ou seja, usem os dois) na definição dos elementos do anel do polygono. Pontos em um arco não sejam co-lineares. As geometrias são especificadas com limites aplicáveis ao valor da coluna DIMINFO. As geometrias LRS possuem três ou quarto dimensões e uma posição de medida valida.Na validação da consistência da geometria, a função considera o valor da tolerância da geometria para determinar se as linhas se cruzam ou os pontos são os mesmos. Exemplo de retorno de erro: 13013 - A área não especifica se é borda ou buracoO código do erro assim como sua descrição pode ser encontrado na documentação da Oracle.Dessa maneira criamos uma função para tratar o retorno do erro mais amigável como demonstrado abaixo: create or replace function desc_erro_geom(p_resposta varchar2)return varchar2 isv_aux varchar2(5);beginv_aux := substr(p_resposta,0,5);case (v_aux)when '13011' thenreturn('Valor está acima do limite ');when '13013' thenreturn('A area não especifica se é borda ou buraco ');when '13018' thenreturn('A distancia especificada é invalida ');when '13019' thenreturn('As coordenadas dos vertices estão fora do limite especificado ');when '13020' thenreturn('Coordenada nula ');when '13021' thenreturn('As coordenadas do elemento geometrico não estão conectadas ');when '13022' thenreturn('O poligono possui segmentos que se cruzam ');when '13023' thenreturn('Um elemento interior (buraco) cruza com a borda do poligono');when '13024' thenreturn('O poligono tem menos de três segmentos');when '13025' thenreturn('O poligono não esta fechado ');when '13026' thenreturn('SDO_ETYPE invalido');when '13028' thenreturn('SDO_GTYPE invalido');when '13029' thenreturn('SDO_SRID invalido');when '13030' thenreturn('Conflito do SDO_GTYPE com o SDO_GEOM_METADATA para o objeto geometrico');when '13031' thenreturn('SDO_ELEM_INFO e SDO_ORDINATES são nulos e o SDO_GTYPE não é ponto ');when '13032' thenreturn('Geometria invalida devido ao(s) campo(s) SDO_POINT, SDO_ELEM_INFO ou SDO_ORDINATES ');when '13033' thenreturn('Dado(s) invalido(s) no SDO_ELEM_INFO da geometria ');when '13034' thenreturn('Dado(s) invalido(s) no SDO_ORDINATES da geometria ');when '13035' thenreturn('A geometria possui arcos em coordenadas geograficas ');when '13221' thenreturn('SDO_GTYPE invalido ');when '13331' thenreturn('Segmento LRS invalido ');when '13332' thenreturn('Ponto LRS invalido ');when '13333' thenreturn('Medida LRS alem do limite ');when '13334' thenreturn('Segmentos LRS não conectados ');when '13335' thenreturn('Medida LRS nula ');when '13340' thenreturn('A geometria de ponto tem mais que uma coordenada ');when '13341' thenreturn('A geometria de linha tem menos que duas coordenadas ');when '13342' thenreturn('A geometria de arco tem menos de três coordenadas ');when '13343' thenreturn('A geometria de polígono tem menos que quatro coordenadas ');when '13344' thenreturn('O polígono de arcos tem menos que cinco coordenadas ');when '13345' thenreturn('O polígono composto tem menos que cinco coordenadas ');when '13346' thenreturn('As coordenadas usadas no arco são colineares ');when '13347' thenreturn('As coordenadas que definem o arco não são distintas ');when '13348' thenreturn('O ultimo ponto do polígono deve ser igual ao primeiro ');when '13349' thenreturn('Borda do polígono se cruza ');when '13350' thenreturn('Duas ou mais bordas ou buracos da geometria de poligono complexo se tocam ');when '13351' thenreturn('Duas ou mais bordas ou buracos da geometria de poligono complexo se sobrepõem ');when '13352' thenreturn('As coordenadas que definem o circulo estão incorretas ');when '13353' thenreturn('O numero de dados no SDO_ELEM_INFO não é multiplo de três ');when '13354' thenreturn('O SDO_ELEM_INFO referencia uma posicao incorreta no SDO_ORDINATES da geometria ');when '13355' thenreturn('O numero de dados no SDO_ORDINATES não é multiplo das dimensoes da geometria ');when '13356' thenreturn('Pontos repetidos na geometria ');when '13356' thenreturn('O retangulo deve ter 2 pontos: superior direito e inferior esquerdo');when '13358' thenreturn('Um circulo deve ter 3 pontos ');when '13359' thenreturn('Os pontos do retangulo são coincidentes');when '13360' thenreturn('Subtipo invalido para tipo composto');when '13361' thenreturn('O tipo composto declara mais subtipos do que estão especificados no SDO_ELEM_INFO ');when '13362' thenreturn('Os subtipos do tipo composto são desconexos ');when '13363' thenreturn('Nenhum SDO_ETYPE é valido na geometria ');when '13366' thenreturn('Combinação invalida de borda e buracos no poligono ');when '13367' thenreturn('Orientação dos pontos da borda ou dos buracos está errada ');when '13368' thenreturn('Polígono simples não pode ter mais de um anel exterior ');when '13369' thenreturn('Valor do SDO_ETYPE de quatro digitos usado errado ');when '13371' thenreturn('Valores de medida da geometria LRS posicionados errados no SDO_ORDINATES ');when '13373' thenreturn('Retangulo formado por 2 pontos com dados geograficos não é suportado ');elsereturn(p_resposta);end case;end desc_erro_geom;/ Desta maneira, fazemos a validação em todas as tabelas de um esquema, e os erros espaciais serão exibidos, esses erros são repassados para os técnicos geo para serem corrigidos.Após as devidas correções os dados são testados novamente para nos certificarmos que não existem mais inconsistências. Apos essa etapa, os dados estão liberados para utilização. Era isso, Ate a proxima.