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); }
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); }