private bool IsGeometriaValida(Feicao feicao)
        {
            IList elementos = null;

            switch (feicao.Geometria.ObterTipo())
            {
            case TipoGeometria.Complexa:
                elementos = (feicao.Geometria as Tecnomapas.TecnoGeo.Geometria.Complexa.Complexa).Elementos;
                break;

            case TipoGeometria.Linha:
                elementos = (feicao.Geometria as Tecnomapas.TecnoGeo.Geometria.Primitiva.Linha).Segmentos;
                break;

            case TipoGeometria.MultiLinha:
                elementos = (feicao.Geometria as Tecnomapas.TecnoGeo.Geometria.Agregada.MultiLinha).Elementos;
                break;

            case TipoGeometria.MultiPoligono:
                elementos = (feicao.Geometria as Tecnomapas.TecnoGeo.Geometria.Agregada.MultiPoligono).Elementos;
                break;

            case TipoGeometria.MultiPonto:
                elementos = (feicao.Geometria as Tecnomapas.TecnoGeo.Geometria.Agregada.MultiPonto).Elementos;
                break;

            case TipoGeometria.Poligono:
                elementos = (feicao.Geometria as Tecnomapas.TecnoGeo.Geometria.Primitiva.Poligono).Aneis;
                break;

            case TipoGeometria.Ponto:
                Posicao pos = (feicao.Geometria as Tecnomapas.TecnoGeo.Geometria.Primitiva.Ponto).Posicao;

                if (pos != null)
                {
                    elementos = pos.ToArray();
                    decimal tt = Convert.ToDecimal(pos.X.ToString());
                    tt = Convert.ToDecimal(pos.Y.ToString());
                }
                break;
            }

            return(elementos == null || elementos.Count == 0);
        }
Ejemplo n.º 2
0
        public override bool Ler()
        {
            string str    = "";
            Feicao feicao = this._tabela.CriarFeicao();

            try
            {
                if (this._dr != null && this._dr.Read() && this._dr.Name == "ROW" && this._dr.NodeType == XmlNodeType.Element)
                {
                    this._atual = this._tabela.CriarFeicao();
                    while (this._dr.Read() && this._dr.Name != "ROW" && this._dr.NodeType != XmlNodeType.EndElement)
                    {
                        string name = this._dr.Name;
                        if (this._tabela.CampoGeometrico == name)
                        {
                            bool      tem_srid   = false;
                            int       srid       = 0;
                            bool      tem_ponto  = false;
                            Decimal   pontox     = new Decimal(0);
                            Decimal   pontoy     = new Decimal(0);
                            Decimal   pontoz     = new Decimal(0);
                            ArrayList arrayList1 = new ArrayList();
                            ArrayList arrayList2 = new ArrayList();
                            this._dr.Read();
                            if (this._dr.Name == "SDO_GTYPE" && this._dr.NodeType == XmlNodeType.Element)
                            {
                                this._dr.Read();
                                int int32 = Convert.ToInt32(this._dr.Value);
                                while (this._dr.Read() && this._dr.Name != name)
                                {
                                    if (this._dr.NodeType == XmlNodeType.Element)
                                    {
                                        switch (this._dr.Name.ToString())
                                        {
                                        case "SDO_SRID":
                                            this._dr.Read();
                                            srid     = Convert.ToInt32(this._dr.Value);
                                            tem_srid = true;
                                            this._dr.Read();
                                            break;

                                        case "SDO_POINT":
                                            while (this._dr.Read() && this._dr.Name != "SDO_POINT")
                                            {
                                                if (this._dr.NodeType == XmlNodeType.Element)
                                                {
                                                    switch (this._dr.Name.ToString())
                                                    {
                                                    case "X":
                                                        this._dr.Read();
                                                        pontox = (Decimal)Convert.ToInt32(this._dr.Value);
                                                        break;

                                                    case "Y":
                                                        this._dr.Read();
                                                        pontoy = (Decimal)Convert.ToInt32(this._dr.Value);
                                                        break;

                                                    case "Z":
                                                        this._dr.Read();
                                                        pontoz = (Decimal)Convert.ToInt32(this._dr.Value);
                                                        break;
                                                    }
                                                    tem_ponto = true;
                                                }
                                            }
                                            break;

                                        case "SDO_ELEM_INFO":
                                            while (this._dr.Read() && this._dr.Name != "SDO_ELEM_INFO")
                                            {
                                                if (this._dr.Name == "NUMBER" && this._dr.NodeType == XmlNodeType.Element)
                                                {
                                                    this._dr.Read();
                                                    arrayList1.Add((object)Decimal.Parse(this._dr.Value, NumberStyles.Any));
                                                    this._dr.Read();
                                                }
                                            }
                                            break;

                                        case "SDO_ORDINATES":
                                            arrayList2.Add((object)new Decimal(0));
                                            while (this._dr.Read() && this._dr.Name != "SDO_ORDINATES")
                                            {
                                                if (this._dr.Name == "NUMBER" && this._dr.NodeType == XmlNodeType.Element)
                                                {
                                                    this._dr.Read();
                                                    arrayList2.Add((object)Decimal.Parse(this._dr.Value, NumberStyles.Any));
                                                    this._dr.Read();
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }
                                feicao.Geometria = this.InterpretaGeometria(int32, tem_srid, srid, tem_ponto, pontox, pontoy, pontoz, (Decimal[])arrayList1.ToArray(typeof(Decimal)), (Decimal[])arrayList2.ToArray(typeof(Decimal)));
                            }
                            else
                            {
                                feicao.Geometria = (Tecnomapas.TecnoGeo.Geometria.Geometria)null;
                                while (this._dr.Read() && this._dr.Name != name)
                                {
                                    ;
                                }
                            }
                        }
                        else
                        {
                            switch (feicao.Atributos[this._dr.Name].Tipo)
                            {
                            case DbType.DateTime:
                                feicao.Atributos[this._dr.Name].Valor = (object)DateTime.Parse(this.PegaValor(name));
                                break;

                            case DbType.Decimal:
                                feicao.Atributos[this._dr.Name].Valor = (object)Decimal.Parse(this.PegaValor(name), NumberStyles.Any);
                                break;

                            case DbType.String:
                                feicao.Atributos[this._dr.Name].Valor = (object)Convert.ToString(this.PegaValor(name));
                                break;

                            default:
                                throw new Exception("Tipo de campo não tratado \"" + feicao.Atributos[this._dr.Name].Tipo.ToString() + "\"");
                            }
                            if (feicao.Atributos[this._dr.Name].Nome.StartsWith("ID"))
                            {
                                str = feicao.Atributos[this._dr.Name].Valor.ToString();
                            }
                        }
                    }
                    this._atual = feicao;
                }
                else
                {
                    this._atual = (Feicao)null;
                    return(false);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erro em InterpretaGeometria - campo_unico : " + str, ex);
            }
            return(true);
        }
        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);
        }