SDO_GEOMETRY

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
tesmerine
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 26 Set 2016 4:00 pm

Senhores,
Bom dia!

Durante essa semana, precisei trabalhar com uma tabela que possuía algumas colunas do tipo SDO_GEOMETRY. Basicamente eu precisava montar uma querie para converter esse dado em LATITUDE e LONGITUDE para que a aplicação .NET, pudesse "plotar" o ponto, utilizando uma api do google/maps. (Isso deveria ser uma querie que o .net iria utilizar internamente, para consumir as informações do banco produto).

Além disso a grande dificuldade era que isso deveria ser extraído de um ambiente, onde não poderia ser criado nenhum tipo de objeto (type,tabelas temporarias,functions, etc). Basicamente, a solução encontrada dada as limitações (não elegante, na minha opinião, mas funcional), foi retornar para aplicação uma string, concatenando o retorno.

Deixo abaixo, um código com tabelas "fictícias" ,para ilustrar a forma e as funções que utilizei para conversão do SDO_GEOMETRY em LAT/LON.

Selecionar tudo


DECLARE
  CURSOR CDADOS IS
     SELECT C.ID_PONTO "ID_PONTO",
            C.LOCATION "LOCATION"  ---COLUNA DO TIPO SDO_GEOMTRY
       FROM TABLE_GEOMETRY C;
  
  TYPE TDADOS IS TABLE OF CDADOS%ROWTYPE INDEX BY BINARY_INTEGER;      

  VDADOS TDADOS;  
  V_CONVERTED SDO_GEOMETRY;
  VRETORNO CLOB;

  FUNCTION FUN_MONTA_RETORNO(ID_PONTO VARCHAR2, LAT VARCHAR2, LON VARCHAR2)
     RETURN CLOB IS
     BEGIN
       RETURN TO_CHAR(ID_PONTO) || ';' || 
              TO_CHAR(LAT) || ';' || 
              TO_CHAR(LON) || '||';
     END FUN_MONTA_RETORNO;
  
BEGIN
  
  OPEN CDADOS;
  FETCH CDADOS BULK COLLECT INTO VDADOS;
  CLOSE CDADOS;
  
  FOR L IN 1..VDADOS.COUNT()
  LOOP
     BEGIN
        V_CONVERTED:= SDO_CS.TRANSFORM(SDO_GEOMETRY(VDADOS(L).LOCATION.SDO_GTYPE,    
                                       VDADOS(L).LOCATION.SDO_SRID,
                                       NULL,
                                       VDADOS(L).LOCATION.SDO_ELEM_INFO,
                                       SDO_ORDINATE_ARRAY(VDADOS(L).LOCATION.SDO_ORDINATES(1) / 100,
                                                          VDADOS(L).LOCATION.SDO_ORDINATES(2) / 100,
                                                          0)),8307);
              
        BEGIN
           VRETORNO := VRETORNO || FUN_MONTA_RETORNO(
                                                      TO_CHAR(VDADOS(L).ID_PONTO),
                                                      TO_CHAR(V_CONVERTED.SDO_ORDINATES(2)),
                                                      TO_CHAR(V_CONVERTED.SDO_ORDINATES(1))                                                     
                                                     );
                                                     
        END;    
                                                                                                 
     END; 
  END LOOP; 
  SELECT VRETORNO INTO :PRM_SAIDA FROM DUAL; 
END;
Observações:

Selecionar tudo

 SELECT VRETORNO INTO :PRM_SAIDA FROM DUAL
--> É utilizado somente internamente no .NET, para que o retorno da variavel VRETORNO , pudesse ser consumida, uma vez que não encontrei uma forma de fazer isso via cursor, dada as limitações já mencionadas.

Selecionar tudo

FUN_MONTA_RETORNO 
--> Essa função foi criada com o objetivo, apenas de concatenar o retorno dos campos na variavel VRETORNO, no inicio estava fazendo isso diretamente na variavel VRETORNO:=VRETORNO ||..... mas isso estava sendo muito oneroso. (Valeu Trevisolli, top manolo!!!!) :-o

Caso alguém conheça, alguma forma mais elegante/eficaz para converter um SDO_GEOMETRY em LAT/LON (googles_maps), por favor, compartilhe.

Abraço pessoal!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Obrigado por compartilhar com a gente!
É esse tipo de atitude que é sempre bem vinda nesse fórum! :-o
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Valeu por compartilhar com a gente brother.
Abraço,

Trevisolli
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes