Exemple #1
0
        internal bool AtualizarRascunho(FeicaoGeometria geoFeicao, int objectid, string tabelaRascunho, string primaryKey, int idLayerFeicao)
        {
            OracleConnection         connection  = null;
            OracleTransaction        transaction = null;
            OracleCommand            comando     = null;
            FonteFeicaoOracleSpatial destino     = null;

            try
            {
                if (geoFeicao == null)
                {
                    throw new ApplicationException("Referência nula do objeto");
                }
                string schemaUsuario = ConfigurationManager.AppSettings["SchemaUsuarioGeo"].ToUpper();

                BancoDeDados bancoDeDados = BancoDeDadosFactory.CriarBancoDeDados("StringConexaoGeo");

                destino = GetConexao(bancoDeDados);
                destino.Abrir();

                connection = destino.Conexao;
                if (connection != null)
                {
                    transaction = connection.BeginTransaction();
                }

                comando = new OracleCommand("delete from " + tabelaRascunho + " t where t." + primaryKey + " = :objectid and t.feicao = :feicao ", connection);
                comando.Parameters.Add("objectid", OracleDbType.Int32);
                comando.Parameters["objectid"].Value = objectid;
                comando.Parameters.Add("feicao", OracleDbType.Int32);
                comando.Parameters["feicao"].Value = idLayerFeicao;
                comando.ExecuteNonQuery();

                ClasseFeicao  classeDestino          = destino.ObterClasseFeicao(tabelaRascunho);
                FeicaoAdapter adpt                   = new FeicaoAdapter(classeDestino);
                OperadorFeicaoOracleSpatial operador = (OperadorFeicaoOracleSpatial)destino.ObterOperadorFeicao(tabelaRascunho);
                TecnoGeo.Geografico.Feicao  feicao   = classeDestino.CriarFeicao();
                decimal          srid                = GetSrid();
                OperacaoEspacial operacao            = new OperacaoEspacialTransformacao(new CampoGeometrico(), srid, srid);

                feicao.Geometria = geoFeicao.RetornarGeometria();

                if (feicao.Geometria == null)
                {
                    throw new ApplicationException("Referência nula da geometria");
                }

                foreach (AtributoFeicao a in geoFeicao.Atributos)
                {
                    if (feicao.Atributos.IndiceDe(a.Nome.ToUpper()) < 0)
                    {
                        continue;
                    }
                    switch (a.Tipo)
                    {
                    case AtributoFeicao.TipoAtributo.Manual:
                        feicao.Atributos[a.Nome.ToUpper()].Valor = a.Valor;
                        break;

                    case AtributoFeicao.TipoAtributo.Sequencia:
                        adpt.Adaptadores[a.Nome.ToUpper()].Origem = TipoOrigem.Sequencia;
                        adpt.Adaptadores[a.Nome.ToUpper()].Valor  = a.Valor.ToString();
                        break;
                    }
                }

                feicao.Atributos["FEICAO"].Valor = idLayerFeicao;

                operador.Inserir(adpt.Transformar(feicao), operacao);
                transaction.Commit();
            }
            catch
            {
                if (transaction != null)
                {
                    transaction.Rollback();
                }
                throw;
            }
            finally
            {
                if (transaction != null)
                {
                    transaction.Dispose();
                }
                if (destino != null)
                {
                    destino.Fechar();
                }
                if (connection != null)
                {
                    connection.Close();
                    connection.Dispose();
                }
            }
            return(true);
        }
        public Dictionary <string, List <Feicao> > Relacao(List <string> feicoes, string wkt)
        {
            FonteFeicaoOracleSpatial            origem     = GetDatabaseFontFeicao();
            Dictionary <string, List <Feicao> > lstRetorno = new Dictionary <string, List <Feicao> >();

            int srid = Convert.ToInt32(ConfigurationManager.AppSettings["srid"]);

            origem.Abrir();

            LeitorFeicao leitor       = null;
            ClasseFeicao classeFeicao = null;

            Expressao geometria = new FuncaoOracle("addsrid(mdsys.sdo_util.from_wktgeometry({0}), {1})", wkt, srid);

            Expressao filtro;

            List <Feicao> lstGeoAtributos = null;

            for (int i = 0; i < feicoes.Count; i++)
            {
                lstGeoAtributos = new List <Feicao>();
                string feicao = feicoes[i];

                try
                {
                    classeFeicao = origem.ObterClasseFeicao(feicao);
                }
                catch
                {
                    classeFeicao = null;
                }

                if (classeFeicao == null)
                {
                    continue;
                }

                string campoGeo = classeFeicao.CampoGeometrico;

                filtro = new ExpressaoRelacionalOracleSpatial(new OperacaoEspacialRelacao(new Campo(campoGeo), geometria, TipoRelacaoEspacial.ANYINTERACT), TipoOperadorRelacional.Igual, new ConstanteOracleSpatial(DbType.String, "TRUE"));

                try
                {
                    leitor = origem.ObterLeitorFeicao(feicao, null, filtro);
                }
                catch (Exception)
                {
                    for (int k = 0; k < 5; k++)
                    {
                        try
                        {
                            ExpressaoRelacionalOracleSpatial termoAux = new ExpressaoRelacionalOracleSpatial(new Campo("1"), TipoOperadorRelacional.Igual, new Campo("1"));
                            filtro = new ExpressaoLogicaOracleSpatial(filtro, TipoOperadorLogico.E, termoAux);
                            leitor = origem.ObterLeitorFeicao(feicao, null, filtro);
                        }
                        catch (Exception)
                        {
                            if (k < 4)
                            {
                                continue;
                            }

                            throw;
                        }

                        break;
                    }
                }

                while (leitor.Ler())
                {
                    if (leitor.Atual.Geometria == null)
                    {
                        continue;
                    }

                    lstGeoAtributos.Add(leitor.Atual);
                }

                leitor.Fechar();

                if (lstGeoAtributos.Count > 0)
                {
                    lstRetorno.Add(feicao, lstGeoAtributos);
                }
            }

            origem.Fechar();

            return(lstRetorno);
        }
Exemple #3
0
        internal bool Cadastrar(FeicaoGeometria geoFeicao, string tabelaRascunho, int idLayerFeicao)
        {
            BancoDeDados bancoDeDados = null;

            if (geoFeicao == null)
            {
                throw new ApplicationException("Referência nula do objeto");
            }

            string schemaUsuario = ConfigurationManager.AppSettings["SchemaUsuarioGeo"].ToUpper();

            bancoDeDados = BancoDeDadosFactory.CriarBancoDeDados("StringConexaoGeo");
            FonteFeicaoOracleSpatial    destino  = GetConexao(bancoDeDados);
            OperadorFeicaoOracleSpatial operador = null;

            try
            {
                destino.Abrir();

                ClasseFeicao  classeDestino = destino.ObterClasseFeicao(tabelaRascunho);
                FeicaoAdapter adpt          = new FeicaoAdapter(classeDestino);

                operador = (OperadorFeicaoOracleSpatial)destino.ObterOperadorFeicao(schemaUsuario + "." + tabelaRascunho);
                Tecnomapas.TecnoGeo.Geografico.Feicao feicao = classeDestino.CriarFeicao();

                feicao.Geometria = geoFeicao.RetornarGeometria();

                if (feicao.Geometria == null)
                {
                    throw new ApplicationException("Referência nula da geometria");
                }

                foreach (AtributoFeicao a in geoFeicao.Atributos)
                {
                    if (feicao.Atributos.IndiceDe(a.Nome.ToUpper()) < 0)
                    {
                        continue;
                    }
                    switch (a.Tipo)
                    {
                    case AtributoFeicao.TipoAtributo.Manual:
                        feicao.Atributos[a.Nome.ToUpper()].Valor = a.Valor;
                        break;

                    case AtributoFeicao.TipoAtributo.Sequencia:
                        adpt.Adaptadores[a.Nome.ToUpper()].Origem = TipoOrigem.Sequencia;
                        adpt.Adaptadores[a.Nome.ToUpper()].Valor  = a.Valor.ToString();
                        break;
                    }
                }
                feicao.Atributos["FEICAO"].Valor = idLayerFeicao;

                decimal          srid     = GetSrid();
                OperacaoEspacial operacao = new OperacaoEspacialTransformacao(new CampoGeometrico(), srid, srid);

                operador.Inserir(adpt.Transformar(feicao), operacao);

                operador.Fechar();
            }
            finally
            {
                destino.Fechar();
            }
            return(true);
        }
        public LeitorFeicaoGeo(string classeFeicao, FonteFeicao fonte, OperacaoEspacial operacao, Expressao filtro)
            : base(classeFeicao, fonte)
        {
            if (fonte == null)
            {
                throw new Exception("Fonte Nula");
            }
            this._fonte     = fonte;
            this._tabela    = fonte.ObterClasseFeicao(classeFeicao);
            this._atributos = this._tabela.Atributos;
            string str1 = "";

            for (int index = 0; index < this._tabela.Atributos.Count; ++index)
            {
                if (this._tabela.Atributos[index].Tipo == DbType.DateTime)
                {
                    str1 = str1 + "to_char(" + this._tabela.Atributos[index].Nome + ",'dd/mm/yyyy HH24:mi:ss') " + this._tabela.Atributos[index].Nome + ", ";
                }
                else
                {
                    str1 = str1 + this._tabela.Atributos[index].Nome + ", ";
                }
            }
            if (operacao != null)
            {
                str1 = str1 + operacao.GerarComando("param") + " ";
            }
            string str2 = str1 + this._tabela.CampoGeometrico;
            string str3 = "";

            if (filtro != null)
            {
                str3 = " where " + filtro.GerarComando("fparam");
            }
            OracleCommand cmd1 = new OracleCommand("select count(*) from " + this._tabela.Nome + str3, (this.Fonte as FonteFeicaoOracleSpatial).Conexao);

            filtro?.CarregarParametros(cmd1, "fparam");
            int int32 = Convert.ToInt32(cmd1.ExecuteScalar());

            this._dr = (XmlTextReader)null;
            if (int32 <= 0)
            {
                return;
            }
            OracleCommand cmd2 = new OracleCommand("select " + str2 + " from " + this._tabela.Nome + str3, (this.Fonte as FonteFeicaoOracleSpatial).Conexao);

            cmd2.XmlCommandType = OracleXmlCommandType.Query;
            cmd2.FetchSize      = 5242880L;
            cmd2.CommandTimeout = 3600;
            operacao?.CarregarParametros(cmd2, "param");
            filtro?.CarregarParametros(cmd2, "fparam");
            if (cmd2.Parameters.Count > 0)
            {
                cmd2.BindByName = true;
                cmd2.AddRowid   = true;
            }
            else
            {
                cmd2.BindByName = false;
            }
            this.ComandoSQL             = cmd2.CommandText;
            this._dr                    = (XmlTextReader)cmd2.ExecuteXmlReader();
            this._dr.WhitespaceHandling = WhitespaceHandling.None;
            do
            {
                ;
            }while (this._dr.Read() && this._dr.Name != "ROWSET");
        }
        private byte[] GerarZipBaseRef()
        {
            string[] featureNameList;
            string[] featureTypeList;
            string[] featureAliasList;
            int      sridBase = 0;

            string connectionKey;

            Hashtable config = business.ObterConfiguracoesBaseRef();

            if (Project.Type == OPERACAO_BASEREF_GEOBASES)
            {
                featureNameList  = config["GEOBASES_FEATURE_NAMES"].ToString().Split(',');
                featureTypeList  = config["GEOBASES_FEATURE_TYPES"].ToString().Split(',');
                featureAliasList = config["GEOBASES_FEATURE_ALIASES"].ToString().Split(',');

                connectionKey = config["GEOBASES_CONNECTION_KEY"].ToString();

                sridBase = 31999;
            }
            else if (Project.Type == OPERACAO_BASEREF_INTERNA)
            {
                featureNameList  = config["INTERNO_FEATURE_NAMES"].ToString().Split(',');
                featureTypeList  = config["INTERNO_FEATURE_TYPES"].ToString().Split(',');
                featureAliasList = config["INTERNO_FEATURE_ALIASES"].ToString().Split(',');

                connectionKey = config["INTERNO_CONNECTION_KEY"].ToString();

                sridBase = Convert.ToInt32(config["SRID_BASE"]);
            }
            else
            {
                throw new Exception("Operacao Inválida ao gerar Base de Referência");
            }

            List <int> pnts_envelope = business.ObterEnvelope(Project.Id);

            if (pnts_envelope.Count != 4)
            {
                throw new Exception("Envelope da Caracterização " + Project.Id + " inválido");
            }

            FonteFeicaoOracleSpatial origem  = GetDatabaseFontFeicao(connectionKey);
            FonteFeicaoShapeStream   destino = new FonteFeicaoShapeStream();

            origem.Abrir();
            destino.Abrir();

            LeitorFeicao leitor       = null;
            ClasseFeicao classeFeicao = null;

            Expressao envelope = new Campo(String.Format("mdsys.sdo_geometry(2003,{0},null,sdo_elem_info_array(1,1003,3), sdo_ordinate_array({1},{2},{3},{4}))",
                                                         sridBase,
                                                         pnts_envelope[0],
                                                         pnts_envelope[1],
                                                         pnts_envelope[2],
                                                         pnts_envelope[3]));

            OperacaoEspacial operacao;
            Expressao        filtro;

            List <OperadorFeicaoShape> lstEscritores = new List <OperadorFeicaoShape>();
            List <string> srtNames = new List <string>();

            for (int i = 0; i < featureNameList.Length; i++)
            {
                string        alias    = featureAliasList[i];
                string        feicao   = featureNameList[i];
                TipoGeometria eTipoGeo = (TipoGeometria)Enum.Parse(typeof(TipoGeometria), featureTypeList[i], true);

                try
                {
                    classeFeicao = origem.ObterClasseFeicao(feicao);
                }
                catch
                {
                    classeFeicao = null;
                }

                if (classeFeicao == null)
                {
                    continue;
                }

                string campoGeo = classeFeicao.CampoGeometrico;
                operacao = new OperacaoEspacialInterseccao(new Campo(campoGeo), envelope);
                operacao = new OperacaoEspacialExtracao(operacao, eTipoGeo);
                operacao = new OperacaoEspacialDensificacao(operacao);

                filtro = new ExpressaoRelacionalOracleSpatial(new OperacaoEspacialRelacao(new Campo(campoGeo), envelope, TipoRelacaoEspacial.ANYINTERACT), TipoOperadorRelacional.Igual, new ConstanteOracleSpatial(DbType.String, "TRUE"));

                try
                {
                    leitor = origem.ObterLeitorFeicao(feicao, operacao, filtro);

                    OperadorFeicaoShape escritor = null;

                    while (leitor.Ler())
                    {
                        if (leitor.Atual.Geometria == null)
                        {
                            continue;
                        }

                        if (escritor == null)
                        {
                            escritor = (OperadorFeicaoShape)destino.CriarClasseFeicao(alias, eTipoGeo, leitor.Atual.Geometria.Dimensoes, leitor.Atual.Geometria.EhLrs, leitor.Atributos);

                            lstEscritores.Add(escritor);
                            srtNames.Add(alias);
                        }

                        escritor.Inserir(leitor.Atual);
                    }

                    leitor.Fechar();
                }
                catch (Exception exc)
                {
                    throw new Exception(String.Format("Feicao {0}", feicao), exc);
                }
            }

            byte[] byteReturn = null;

            if (lstEscritores.Count > 0)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    destino.ExportarParaZip(ms);
                    byteReturn = AdicionarArquivosPrj(ms, srtNames.ToArray());
                }

                foreach (OperadorFeicaoShape escritorShp in lstEscritores)
                {
                    escritorShp.Fechar();
                }
            }

            origem.Fechar();
            destino.Fechar();

            if (byteReturn == null)
            {
                string message = "Nenhuma Geometria nas Feições a seguir cruza com a Área de Abrangencia selecionada:";
                foreach (string featureName in featureAliasList)
                {
                    message += "\r\n   - " + featureName;
                }

                byteReturn = GerarZipComMensagem("Nenhuma Geometria Encontrada", message);
            }

            return(byteReturn);
        }
        private void GravarFeicoesShape(FonteFeicaoShapeStream fonte, FonteFeicaoOracleSpatial destino, string shapeName, StringCollection relatorio)
        {
            ClasseFeicao classeFonte = fonte.ObterClasseFeicao(shapeName);

            if (classeFonte == null)
            {
                return;
            }

            ClasseFeicao classeDestino = destino.ObterClasseFeicao("TMP_RASC_TRACKMAKER");

            if (classeDestino == null)
            {
                return;
            }

            FeicaoAdapter adpt = new FeicaoAdapter(classeDestino);

            if (!adpt.EhTransformavel(classeDestino, relatorio))
            {
                relatorio.Add("Arquivo " + shapeName + " desconsiderado por causa das observações acima");
                return;
            }

            LeitorFeicao leitorFeicao = fonte.ObterLeitorFeicao(shapeName);
            OperadorFeicaoOracleSpatial escritorFeicao = (OperadorFeicaoOracleSpatial)destino.ObterOperadorFeicao("TMP_RASC_TRACKMAKER");

            if (leitorFeicao == null)
            {
                return;
            }
            if (escritorFeicao == null)
            {
                return;
            }

            adpt.Adaptadores["PROJETO"].Origem = TipoOrigem.Manual;
            adpt.Adaptadores["PROJETO"].Valor  = Project.Id;

            int cont = 0;

            try
            {
                while (true)
                {
                    try
                    {
                        if (!leitorFeicao.Ler())
                        {
                            return;
                        }

                        cont++;

                        if (leitorFeicao.Atual.Atributos.IndiceDe("NOME") >= 0)
                        {
                            Atributo atributo = leitorFeicao.Atual.Atributos["NOME"];
                            leitorFeicao.Atual.Atributos.Clear();
                            leitorFeicao.Atual.Atributos.Adicionar(atributo);
                        }
                        else if (leitorFeicao.Atual.Atributos.IndiceDe("NAME") >= 0)
                        {
                            Atributo atributo = leitorFeicao.Atual.Atributos["NAME"];
                            atributo.Nome = "NOME";
                            leitorFeicao.Atual.Atributos.Clear();
                            leitorFeicao.Atual.Atributos.Adicionar(atributo);
                        }

                        Feicao otherFeicao = adpt.Transformar(leitorFeicao.Atual);

                        escritorFeicao.Inserir(otherFeicao);
                    }
                    catch
                    {
                        relatorio.Add(String.Format("A geometria {0} da feição {1} é inválida ou nula, deve ser redesenhada ou removida.", cont, shapeName));
                    }
                }
            }
            catch (TecnoGeoException exc)
            {
                throw new Exception(string.Format("Erro ao transportar geometria {0}/{1} da feição {2}. Erro subjacente era: {3}", cont, Project.Id, shapeName, exc.Message));
            }
            finally
            {
                escritorFeicao.Fechar();
                leitorFeicao.Fechar();
            }
        }
        private List <byte[]> GerarZipProcessado()
        {
            List <string> prjList = new List <string>();

            string[] featureList = null;
            string[] aliasList   = null;

            switch (Project.Type)
            {
            case OPERACAO_DOMINIALIDADE:
                featureList = "TMP_ATP,TMP_APMP,TMP_AFD,TMP_ROCHA,TMP_VERTICE,TMP_ARL,TMP_RPPN,TMP_AFS,TMP_AVN,TMP_AA,TMP_ACONSTRUIDA,TMP_DUTO,TMP_LTRANSMISSAO,TMP_ESTRADA,TMP_FERROVIA,TMP_NASCENTE,TMP_RIO_LINHA,TMP_RIO_AREA,TMP_LAGOA,TMP_REPRESA,TMP_DUNA,TMP_REST_DECLIVIDADE,TMP_ESCARPA,TMP_AREAS_CALCULADAS".Split(',');
                aliasList   = "ATP,APMP,AFD,ROCHA,VERTICE,ARL,RPPN,AFS,AVN,AA,ACONSTRUIDA,DUTO,LTRANSMISSAO,ESTRADA,FERROVIA,NASCENTE,RIO_LINHA,RIO_AREA,LAGOA,REPRESA,DUNA,REST_DECLIVIDADE,ESCARPA,AREAS_CALCULADAS".Split(',');
                break;

            case OPERACAO_ATIVIDADE:
                featureList = "TMP_PATIV,TMP_LATIV,TMP_AATIV,TMP_AIATIV".Split(',');
                aliasList   = "PATIV,LATIV,AATIV,AIATIV".Split(',');
                break;
            }

            FonteFeicaoOracleSpatial origem            = GetDatabaseFontFeicao();
            FonteFeicaoShapeStream   destino           = new FonteFeicaoShapeStream();
            FonteFeicaoShapeStream   destinoTrackmaker = new FonteFeicaoShapeStream();

            origem.Abrir();
            destino.Abrir();
            destinoTrackmaker.Abrir();

            LeitorFeicao leitor       = null;
            ClasseFeicao classeFeicao = null;

            List <OperadorFeicaoShape> lstEscritores           = new List <OperadorFeicaoShape>();
            List <OperadorFeicaoShape> lstEscritoresTrackmaker = new List <OperadorFeicaoShape>();

            int count = featureList.Length;

            for (int i = 0; i < count; i++)
            {
                string feicao = featureList[i];
                string alias  = aliasList[i];

                classeFeicao = origem.ObterClasseFeicao(feicao);
                if (classeFeicao == null)
                {
                    continue;
                }

                OperadorFeicaoShape escritor  = null;
                AtributoCollection  atributos = null;

                OperadorFeicaoShape escritorTrackmaker  = null;
                AtributoCollection  atributosTrackmaker = null;

                Expressao filtro = null;
                Atributo  atributo;
                Feicao    data;

                if (feicao == "TMP_AREAS_CALCULADAS")
                {
                    string[] tipos = "APP_APMP,APP_AA_USO,APP_AA_REC,APP_AVN,APP_ARL".Split(',');

                    foreach (string tipoArea in tipos)
                    {
                        ExpressaoRelacionalOracleSpatial termo1 = new ExpressaoRelacionalOracleSpatial(new Campo("PROJETO"), TipoOperadorRelacional.Igual, new ParametroOracleSpatial(DbType.Int32, Project.Id));
                        ExpressaoRelacionalOracleSpatial termo2 = new ExpressaoRelacionalOracleSpatial(new Campo("TIPO"), TipoOperadorRelacional.Igual, new ParametroOracleSpatial(DbType.String, tipoArea, 50));
                        filtro = new ExpressaoLogicaOracleSpatial(termo1, TipoOperadorLogico.E, termo2);

                        try
                        {
                            leitor = origem.ObterLeitorFeicao(feicao, null, filtro);
                        }
                        catch (Exception exc)
                        {
                            for (int k = 0; k < 5; k++)
                            {
                                try
                                {
                                    ExpressaoRelacionalOracleSpatial termoAux = new ExpressaoRelacionalOracleSpatial(new Campo("1"), TipoOperadorRelacional.Igual, new Campo("1"));
                                    filtro = new ExpressaoLogicaOracleSpatial(filtro, TipoOperadorLogico.E, termoAux);
                                    leitor = origem.ObterLeitorFeicao(feicao, null, filtro);
                                }
                                catch (Exception)
                                {
                                    if (k < 4)
                                    {
                                        continue;
                                    }

                                    throw new Exception(string.Format("Feicao: {0} / Project.Id: {1} / tipo {2} / where: {3}", feicao, Project.Id, tipoArea, filtro.GerarComando()), exc);
                                }

                                break;
                            }
                        }

                        escritor = null;

                        while (leitor.Ler())
                        {
                            if (escritor == null)
                            {
                                atributos = new AtributoCollection();
                                atributos.Adicionar(classeFeicao.Atributos["AREA_M2"]);

                                escritor = (OperadorFeicaoShape)destino.CriarClasseFeicao(tipoArea, leitor.Atual.Geometria.ObterTipo(), 2, false, atributos);
                                prjList.Add(tipoArea);

                                lstEscritores.Add(escritor);


                                //Trackmaker
                                atributo         = new Atributo();
                                atributo.Nome    = "NOME";
                                atributo.Tamanho = 200;
                                atributo.Tipo    = DbType.String;

                                atributosTrackmaker = new AtributoCollection();
                                atributosTrackmaker.Adicionar(atributo);
                                escritorTrackmaker = (OperadorFeicaoShape)destinoTrackmaker.CriarClasseFeicao(tipoArea, leitor.Atual.Geometria.ObterTipo(), 2, false, atributosTrackmaker);

                                lstEscritoresTrackmaker.Add(escritorTrackmaker);
                            }

                            //Normal information
                            data           = new Feicao();
                            data.ID        = leitor.Atual.ID;
                            data.Geometria = leitor.Atual.Geometria;

                            data.Atributos = new AtributoCollection();
                            foreach (Atributo attr in atributos)
                            {
                                atributo       = attr.Clonar();
                                atributo.Valor = leitor.Atual.Atributos[atributo.Nome].Valor;
                                data.Atributos.Adicionar(atributo);
                            }

                            escritor.Inserir(data);


                            //Trackmaker information
                            data           = new Feicao();
                            data.ID        = leitor.Atual.ID;
                            data.Geometria = leitor.Atual.Geometria;

                            data.Atributos = new AtributoCollection();
                            atributo       = atributosTrackmaker[0].Clonar();
                            atributo.Valor = GenerateTrackMakerNameValue("TMP_" + tipoArea, leitor.Atual.Atributos);
                            data.Atributos.Adicionar(atributo);

                            escritorTrackmaker.Inserir(data);
                        }
                    }
                }
                else
                {
                    filtro = new ExpressaoRelacionalOracleSpatial(new Campo("PROJETO"), TipoOperadorRelacional.Igual, new ParametroOracleSpatial(DbType.Int32, Project.Id));

                    try
                    {
                        leitor = origem.ObterLeitorFeicao(feicao, null, filtro);
                    }
                    catch (Exception)
                    {
                        for (int k = 0; k < 5; k++)
                        {
                            try
                            {
                                ExpressaoRelacionalOracleSpatial termoAux = new ExpressaoRelacionalOracleSpatial(new Campo("1"), TipoOperadorRelacional.Igual, new Campo("1"));
                                filtro = new ExpressaoLogicaOracleSpatial(filtro, TipoOperadorLogico.E, termoAux);
                                leitor = origem.ObterLeitorFeicao(feicao, null, filtro);
                            }
                            catch (Exception)
                            {
                                if (k < 4)
                                {
                                    continue;
                                }

                                throw;
                            }

                            break;
                        }
                    }

                    while (leitor.Ler())
                    {
                        if (escritor == null)
                        {
                            atributos = new AtributoCollection();

                            atributos.Adicionar(classeFeicao.Atributos["ID"]);

                            if (classeFeicao.Atributos.IndiceDe("LARGURA") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["LARGURA"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("NOME") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["NOME"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("AMORTECIMENTO") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["AMORTECIMENTO"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("COD_APMP") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["COD_APMP"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("COMPENSADA") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["COMPENSADA"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("ESTAGIO") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["ESTAGIO"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("PROJETO") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["PROJETO"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("SITUACAO") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["SITUACAO"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("TIPO") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["TIPO"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("ZONA") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["ZONA"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("AREA_M2") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["AREA_M2"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("CODIGO") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["CODIGO"]);
                            }

                            if (classeFeicao.Atributos.IndiceDe("VEGETACAO") >= 0)
                            {
                                atributos.Adicionar(classeFeicao.Atributos["VEGETACAO"]);
                            }

                            escritor = (OperadorFeicaoShape)destino.CriarClasseFeicao(alias, leitor.Atual.Geometria.ObterTipo(), 2, false, atributos);
                            prjList.Add(alias);

                            lstEscritores.Add(escritor);

                            //Trackmaker
                            atributo         = new Atributo();
                            atributo.Nome    = "NOME";
                            atributo.Tamanho = 200;
                            atributo.Tipo    = DbType.String;

                            atributosTrackmaker = new AtributoCollection();
                            atributosTrackmaker.Adicionar(atributo);
                            escritorTrackmaker = (OperadorFeicaoShape)destinoTrackmaker.CriarClasseFeicao(alias, leitor.Atual.Geometria.ObterTipo(), 2, false, atributosTrackmaker);

                            lstEscritoresTrackmaker.Add(escritorTrackmaker);
                        }

                        //Normal information
                        data           = new Feicao();
                        data.ID        = leitor.Atual.ID;
                        data.Geometria = leitor.Atual.Geometria;

                        data.Atributos = new AtributoCollection();
                        foreach (Atributo attr in atributos)
                        {
                            atributo       = attr.Clonar();
                            atributo.Valor = leitor.Atual.Atributos[atributo.Nome].Valor;
                            data.Atributos.Adicionar(atributo);
                        }

                        escritor.Inserir(data);

                        //Trackmaker information
                        data           = new Feicao();
                        data.ID        = leitor.Atual.ID;
                        data.Geometria = leitor.Atual.Geometria;

                        data.Atributos = new AtributoCollection();
                        atributo       = atributosTrackmaker[0].Clonar();
                        atributo.Valor = GenerateTrackMakerNameValue(feicao, leitor.Atual.Atributos);
                        data.Atributos.Adicionar(atributo);

                        escritorTrackmaker.Inserir(data);
                    }
                }

                leitor.Fechar();
            }

            byte[] byteReturn           = null;
            byte[] byteTrackmakerReturn = null;

            if (lstEscritores.Count > 0)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    destino.ExportarParaZip(ms);
                    byteReturn = AdicionarArquivosPrj(ms, prjList.ToArray());
                }

                using (MemoryStream ms = new MemoryStream())
                {
                    destinoTrackmaker.ExportarParaZip(ms);
                    byteTrackmakerReturn = AdicionarArquivosPrj(ms, prjList.ToArray());
                }

                foreach (OperadorFeicaoShape escritorShp in lstEscritores)
                {
                    escritorShp.Fechar();
                }

                foreach (OperadorFeicaoShape escritorShp in lstEscritoresTrackmaker)
                {
                    escritorShp.Fechar();
                }
            }

            origem.Fechar();
            destino.Fechar();
            destinoTrackmaker.Fechar();

            List <byte[]> result = new List <byte[]>();

            result.Add(byteReturn);
            result.Add(byteTrackmakerReturn);

            return(result);
        }
        internal ClasseFeicao ObterClasseFeicao(string classeFeicao)
        {
            ClasseFeicao classeFeicao1 = new ClasseFeicao(classeFeicao);

            try
            {
                int    length = classeFeicao1.Nome.IndexOf(".");
                string str1;
                string str2;
                if (length < 0)
                {
                    str1 = "IDAFGEO";
                    str2 = classeFeicao1.Nome;
                }
                else
                {
                    str1 = classeFeicao1.Nome.Substring(0, length);
                    str2 = classeFeicao1.Nome.Substring(length + 1);
                }

                string sql = "select count(*) from (select m.owner||'.'|| m.table_name tabela from " +
                             "all_sdo_geom_metadata m) x where x.tabela = upper(:tabela)";
                string result;

                using (Comando comando = this.banco.CriarComando(sql))
                {
                    comando.AdicionarParametroEntrada("tabela", (str1 + "." + str2), DbType.String);

                    result = this.banco.ExecutarScalar(comando).ToString();
                }

                if (result == "")
                {
                    throw new Exception("Tabela " + classeFeicao1.Nome + " não encontrada");
                }

                sql = "select a.column_name, a.data_type, a.char_length, a.data_precision, a.data_scale " +
                      "from all_tab_cols a where a.owner=UPPER(:owner) and a.table_name=UPPER(:tablename) " +
                      "and a.hidden_column='NO' order by a.column_id";

                Hashtable    list          = new Hashtable();
                ClasseFeicao classeFeicao2 = new ClasseFeicao(classeFeicao);
                using (Comando comando = this.banco.CriarComando(sql))
                {
                    comando.AdicionarParametroEntrada("owner", str1, DbType.String);
                    comando.AdicionarParametroEntrada("tablename", str2, DbType.String);

                    using (IDataReader reader = banco.ExecutarReader(comando))
                    {
                        while (reader.Read())
                        {
                            if (reader["data_type"].ToString() == "SDO_GEOMETRY")
                            {
                                classeFeicao2.CampoGeometrico = reader["column_name"].ToString();
                            }
                            else
                            {
                                Atributo campo = new Atributo();
                                campo.Nome = reader["column_name"].ToString();
                                switch (reader["data_type"].ToString())
                                {
                                case "DATE":
                                    campo.Tipo = DbType.DateTime;
                                    break;

                                case "NUMBER":
                                    campo.Tipo = DbType.Decimal;
                                    if (reader["data_precision"] is DBNull || reader["data_precision"] == null)
                                    {
                                        if (reader["data_scale"] is DBNull || reader["data_scale"] == null)
                                        {
                                            campo.Tamanho       = -1;
                                            campo.CasasDecimais = -1;
                                            break;
                                        }
                                        campo.Tamanho       = 38;
                                        campo.CasasDecimais = int.Parse(reader["data_scale"].ToString());
                                        break;
                                    }
                                    campo.Tamanho = int.Parse(reader["data_precision"].ToString());
                                    int num = reader["data_scale"] is DBNull || reader["data_scale"] == null ? 0 : (Convert.ToInt32(reader["data_scale"]) >= 0 ? 1 : 0);
                                    campo.CasasDecimais = num != 0 ? int.Parse(reader["data_scale"].ToString()) : 0;
                                    break;

                                case "REAL":
                                case "FLOAT":
                                    campo.Tipo          = DbType.Decimal;
                                    campo.Tamanho       = -1;
                                    campo.CasasDecimais = -1;
                                    break;

                                case "INT":
                                case "SMALLINT":
                                case "DECIMAL":
                                case "DEC":
                                case "NUMERIC":
                                case "INTEGER":
                                    campo.Tipo          = DbType.Decimal;
                                    campo.Tamanho       = 38;
                                    campo.CasasDecimais = 0;
                                    break;

                                case "CHAR":
                                case "NCHAR":
                                case "NVARCHAR2":
                                case "STRING":
                                case "VARCHAR2":
                                    campo.Tipo    = DbType.String;
                                    campo.Tamanho = int.Parse(reader["char_length"].ToString());
                                    break;

                                case "LONG":
                                    campo.Tipo    = DbType.String;
                                    campo.Tamanho = 32760;
                                    break;

                                case "BLOB":
                                    break;

                                default:
                                    throw new Exception("Tipo de campo não tratado \"" + reader["data_type"].ToString() + "\"");
                                }
                                classeFeicao2.Atributos.Adicionar(campo);
                            }
                        }
                        return(classeFeicao2);
                    }
                }
            }
            catch
            {
                return(null);
            }
        }