private PoligonoCollection GerarPoligonos(Decimal[] elem_info, Decimal[] ordinates, int dimensoes, int eixoLrs, bool multiplo) { PoligonoCollection poligonoCollection = new PoligonoCollection(); int triplet = 0; bool ehLrs = eixoLrs != 0; while (triplet < elem_info.Length) { if (elem_info[triplet + 1] == new Decimal(1005) || elem_info[triplet + 1] == new Decimal(1003)) { try { Anel anel1 = this.GerarAnel(elem_info, ordinates, dimensoes, eixoLrs, ref triplet); Poligono poligono = new Poligono(ehLrs ? dimensoes - 1 : dimensoes, ehLrs); if (anel1 == null) { throw new Exception("Falha ao ler o anel externo"); } poligono.Aneis.Adicionar(anel1); triplet += 3; while (triplet < elem_info.Length && (elem_info[triplet + 1] == new Decimal(2005) || elem_info[triplet + 1] == new Decimal(2003))) { Anel anel2 = this.GerarAnel(elem_info, ordinates, dimensoes, eixoLrs, ref triplet); if (anel2 == null) { throw new Exception("Falha ao ler o anel interno"); } poligono.Aneis.Adicionar(anel2); triplet += 3; } triplet -= 3; poligonoCollection.Adicionar(poligono); } catch { } if (!multiplo) { return(poligonoCollection); } } triplet += 3; } return(poligonoCollection); }
private Tecnomapas.TecnoGeo.Geometria.Geometria InterpretaGeometria(int gtype, bool tem_srid, int srid, bool tem_ponto, Decimal pontox, Decimal pontoy, Decimal pontoz, Decimal[] elem_info, Decimal[] ordinates) { int int16_1 = (int)Convert.ToInt16(Math.Floor((Decimal)gtype / new Decimal(1000))); int int16_2 = (int)Convert.ToInt16(Math.Floor((Decimal)(gtype - int16_1 * 1000) / new Decimal(100))); int num = gtype - int16_1 * 1000 - int16_2 * 100; bool ehLrs = int16_2 != 0; if (int16_1 != 2 && (int16_1 != 3 || ehLrs) && ((int16_1 != 3 || int16_2 != 3) && (int16_1 != 4 || int16_2 != 3)) && (int16_1 != 4 || int16_2 != 4) || (tem_ponto == elem_info.Length > 0 || elem_info.Length > 0 != ordinates.Length > 0) || (tem_ponto && ehLrs || tem_ponto && num != 1 && num != 4 && num != 5)) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } switch (num) { case 0: return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); case 1: if (tem_ponto) { return((Tecnomapas.TecnoGeo.Geometria.Geometria) new Ponto(int16_1 == 2 ? new Posicao(pontox, pontoy) : new Posicao(pontox, pontoy, pontoz), int16_1, ehLrs)); } PontoCollection pontoCollection1 = this.GerarPontos(elem_info, ordinates, int16_1, int16_2, false); if (pontoCollection1 == null || pontoCollection1.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria)pontoCollection1[0]); case 2: LinhaCollection linhaCollection1 = this.GerarLinhas(elem_info, ordinates, int16_1, int16_2, false); if (linhaCollection1 == null || linhaCollection1.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria)linhaCollection1[0]); case 3: PoligonoCollection poligonoCollection1 = this.GerarPoligonos(elem_info, ordinates, int16_1, int16_2, false); if (poligonoCollection1 == null || poligonoCollection1.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria)poligonoCollection1[0]); case 4: if (tem_ponto) { Posicao posicao = int16_1 == 2 ? new Posicao(pontox, pontoy) : new Posicao(pontox, pontoy, pontoz); Tecnomapas.TecnoGeo.Geometria.Complexa.Complexa complexa = new Tecnomapas.TecnoGeo.Geometria.Complexa.Complexa(int16_1, ehLrs); complexa.Elementos.Adicionar((Tecnomapas.TecnoGeo.Geometria.Geometria) new Ponto(posicao, int16_1, ehLrs)); return((Tecnomapas.TecnoGeo.Geometria.Geometria)complexa); } PontoCollection pontoCollection2 = this.GerarPontos(elem_info, ordinates, int16_1, int16_2, true); if (pontoCollection2 == null) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } LinhaCollection linhaCollection2 = this.GerarLinhas(elem_info, ordinates, int16_1, int16_2, true); if (linhaCollection2 == null) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } PoligonoCollection poligonoCollection2 = this.GerarPoligonos(elem_info, ordinates, int16_1, int16_2, true); if (poligonoCollection2 == null) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } Tecnomapas.TecnoGeo.Geometria.Complexa.Complexa complexa1 = new Tecnomapas.TecnoGeo.Geometria.Complexa.Complexa(ehLrs ? int16_1 - 1 : int16_1, ehLrs); for (int index = 0; index < pontoCollection2.Count; ++index) { complexa1.Elementos.Adicionar((Tecnomapas.TecnoGeo.Geometria.Geometria)pontoCollection2[index]); } for (int index = 0; index < linhaCollection2.Count; ++index) { complexa1.Elementos.Adicionar((Tecnomapas.TecnoGeo.Geometria.Geometria)linhaCollection2[index]); } for (int index = 0; index < poligonoCollection2.Count; ++index) { complexa1.Elementos.Adicionar((Tecnomapas.TecnoGeo.Geometria.Geometria)poligonoCollection2[index]); } if (complexa1.Elementos.Count > 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)complexa1); } return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); case 5: if (tem_ponto) { return((Tecnomapas.TecnoGeo.Geometria.Geometria) new MultiPonto(new Ponto(int16_1 == 2 ? new Posicao(pontox, pontoy) : new Posicao(pontox, pontoy, pontoz), int16_1, ehLrs), int16_1, ehLrs)); } PontoCollection pontos = this.GerarPontos(elem_info, ordinates, int16_1, int16_2, true); if (pontos == null || pontos.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria) new MultiPonto(pontos, ehLrs ? int16_1 - 1 : int16_1, ehLrs)); case 6: LinhaCollection linhas = this.GerarLinhas(elem_info, ordinates, int16_1, int16_2, true); if (linhas == null || linhas.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria) new MultiLinha(linhas, ehLrs ? int16_1 - 1 : int16_1, ehLrs)); case 7: PoligonoCollection poligonos = this.GerarPoligonos(elem_info, ordinates, int16_1, int16_2, true); if (poligonos == null || poligonos.Count == 0) { return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } return((Tecnomapas.TecnoGeo.Geometria.Geometria) new MultiPoligono(poligonos, ehLrs ? int16_1 - 1 : int16_1, ehLrs)); default: return((Tecnomapas.TecnoGeo.Geometria.Geometria)null); } }