230 likes | 416 Views
Implementação do algoritmo da Máquina de Análise Geográfica (GAM). Paradigmas e Ferramentas de Desenvolvimento de Software Prof. Dr. Gilberto Câmara. Equipe: Karla Donato Fook Evaldinolia G. Moreira Pinto . Roteiro. GAM Descrição Interface Padrões implementados Strategy Singleton
E N D
Implementação do algoritmo da Máquina de Análise Geográfica (GAM) Paradigmas e Ferramentas de Desenvolvimento de Software Prof. Dr. Gilberto Câmara Equipe: Karla Donato Fook Evaldinolia G. Moreira Pinto
Roteiro • GAM • Descrição • Interface • Padrões implementados • Strategy • Singleton • Iterator • Contextualização GAM x Padrões • Diagramas • Codificação • Conclusões
GAM – Geographical Analysis Machine • Ferramenta para análise exploratória de dados espaciais aplicada a pontos ou pequenas áreas • Os setores de Saúde Pública e Criminal utilizam a Máquina de Análise Geográfica para indicar áreas com altas incidências de doenças ou crimes de naturezas diversas • Desenvolvida por Stan Openshaw e Ian Turton - University of Leeds, UK
GAM – Geographical Analysis Machine • A partir de dados de interesse, gera um grande número de círculos de vários tamanhos que cobrem completamente uma determinada região • Os círculos se sobrepõem permitindo o efeito de bordas e fornecendo um grau de análise sensitiva • Os dados de cada círculo são armazenados e uma avaliação estatística é feita para saber se a taxa de incidência do dado em cada círculo é alta • A análise estatística é realizada através do Teste de Significância
GAM – Interface • Mean Bootstrap • Monte Carlo Significance • Poisson Probability
GAM - Programa • Frmgam.ui.h • Interface desenvolvida no QT Designer • TeGam.h • Classe gam • TeSignificanceTest.h • Classes significanceTest e cDivisor
Padrões Implementados • Strategy • Singleton • Iterator
GAM significanceTest isSignificant( ) ... gridGenerate( ) sigTest( ) bootstrapTest monteCarloTest poissonTest sigTest( ) sigTest( ) sigTest( ) Strategy • Implementa o Teste de Significância no GAM • O algoritmo possui comportamento diferente, conforme seleção do usuário
Strategy // TeSignificanceTest.h class significanceTest { public: virtual double sigTest(const double & sumIncidence, const double & incidenceExpected, const vector<int> & idsInterestDataCircle ) = 0; protected: significanceTest(){} }; class poissonTest : public significanceTest{ public: poissonTest(){} virtual double sigTest(const double & sumIncidence, const double & incidenceExpected, const vector<int> & idsInterestDataCircle); };
Strategy class monteCarloTest : public significanceTest{ public: monteCarloTest(){} virtual double sigTest(const double & sumIncidence, const double & incidenceExpected, const vector<int> & idsInterestDataCircle); }; class bootstrapTest : public significanceTest{ public: bootstrapTest(){} virtual double sigTest(const double & sumIncidence, const double & incidenceExpected, const vector<int> & idsInterestDataCircle); };
Strategy // TeGam.h class gam{ public: gam(significanceTest* = NULL); virtual ~gam(); ... protected: significanceTest* sig; bool sCreated; };
Strategy gam::gam(significanceTest* p_sig) { if (p_sig == NULL) { sig = new bootstrapTest; sCreated = true; } else { sig = p_sig; sCreated = false; } } gam::~gam() { if (sCreated == true) delete sig; }
Strategy // call bool gam::isSignificant( const double & sumIncidence, const double & incidenceExpected, const vector<int> & idsInterestDataCircle ) { ASSERT(sig !=NULL); ... double prob = sig->sigTest(sumIncidence, incidenceExpected, idsInterestDataCircle ); ... }
cDivisor static int getDivisor( ) return divisor static int divisor Singleton • Implementa divisor que promove a geração do grid
Singleton // TeSignificanceTest.h class cDivisor { public : static int getDivisor(); protected : cDivisor(){} virtual ~cDivisor(){} static int divisor; // Static instance }; int cDivisor::divisor=100; int cDivisor::getDivisor() { return divisor; }
Singleton // TeGam.h void gam::gridGenerate( double & xmin, double & xmax, double & ymin, double & ymax ) { ... int div = cDivisor::getDivisor(); ... dx = (xmax - xmin) / div; dy = (ymax - ymin) / div; ... }
interestData it begin() end() ... first() second() currentItem() int id double incidence double popRisk Iterator • Utilizado no decorrer do programa para acesso a elementos pertencentes a diferentes tipos de conteiners
Iterator // TeGam.h void gam::computeIncidenceRate ( ) { map<int, gridIndex>::iterator it = interestData.begin(); ... while (it != interestData.end()) { p = it->second; sumIncidence += p.first; sumRiskPop += p.second; ++it; } }
Iterator // TeSignificanceTest.h double monteCarloTest::sigTest(const double & mean, const double & x, const vector<int> & idsInterestDataCircle ) { typedef vector<int>::const_iterator itVector; for( itVector itVec = idsInterestDataCircle.begin(); itVec != idsInterestDataCircle.end(); ++itVec) { ... idValue = * itVec; ... } }
Conclusões • Padrões de Projeto propiciam um alto nível de programação, tornando o código mais prático e elegante • A implementação dos padrões proporcionou maior robustez ao código da Máquina de Análise Geográfica • O trabalho sedimentou o que foi abordado na disciplina • A visualização da superfície de densidade encontra-se em fase de implementação
Referências • BAILEY, T.; GATRELL, A. “Interactive Spatial Data Analysis”. Longman Scientific and Technical, London, 1995. • DRUCK, S.; CARVALHO, M. S.; CÂMARA, G.; MONTEIRO, A.V.M. (eds) "Análise Espacial de Dados Geográficos". Brasília, EMBRAPA, 2004. • GAMA, E.; HELM, R.; JOHNSON, R.; VLISSIDES, J. “Design Patterns: Elements of Reusable Object-Oriented Software”. Addison Wesley, 1994. • G. Câmara, A.Monteiro, “Geocomputation Techniques for Spatial Analysis: Is it the Case for Health data Sets?” . Revista Nacional de Saúde Pública, 2001. • OPENSHAW, S.; TURTON I.; MaCGill, J.; DAVY, J. “Putting Geographical Analysis Machine on the Internet”. University of Leeds, Leeds. • STROUSTRUP, B. “A Linguagem de Programação C++” - 3. ed. Bookman, 2000. • http://www.ccg.leeds.ac.uk/smart/gam/gam1.html • http://www.codeproject.com/cpp/#Design+and+Strategy