Post on 17-Apr-2015
Implementação do algoritmo da Máquina de Análise Geográfica (GAM)
Equipe: Karla Donato Fook
Evaldinolia G. Moreira Pinto
Paradigmas e Ferramentas de Desenvolvimento de Software
Prof. Dr. Gilberto Câmara
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 – Interface
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
Strategy
GAM
isSignificant( )...
gridGenerate( )
significanceTest
sigTest( )
bootstrapTest
sigTest( )
monteCarloTestsigTest( )
poissonTest
sigTest( )
Implementa o Teste de Significância no GAM O algoritmo possui comportamento diferente, conforme seleção
do usuário
Strategy// TeSignificanceTest.hclass 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);};
Strategyclass 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.hclass gam{ public:
gam(significanceTest* = NULL);virtual ~gam();...
protected:significanceTest* sig;bool sCreated;
};
Strategygam::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// callbool gam::isSignificant( const double & sumIncidence,
const double & incidenceExpected, const vector<int> &
idsInterestDataCircle ){
ASSERT(sig !=NULL);...double prob = sig->sigTest(sumIncidence, incidenceExpected,
idsInterestDataCircle );...
}
Implementa divisor que promove a geração do grid
Singleton
cDivisor
static int getDivisor( )
static int divisor
return divisor
// TeSignificanceTest.hclass 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;...
}
Singleton
Iterator Utilizado no decorrer do programa para acesso a
elementos pertencentes a diferentes tipos de conteiners
interestData
begin()end()
...
int iddouble incidencedouble popRisk
it
first()second()
currentItem()
Iterator// TeGam.hvoid 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.hdouble 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
Obrigada pela Atenção !!!