1.69k likes | 1.88k Views
Enviromental Modelling Introduction to TerraME. Tiago Garcia de Senna Carneiro (UFOP) Gilberto Câmara (INPE). Dynamic Spatial Models. f (I t ). f (I t+1 ). f (I t+2 ). f ( I t+n ). F. F.
E N D
Enviromental ModellingIntroduction to TerraME Tiago Garcia de Senna Carneiro (UFOP) Gilberto Câmara (INPE)
Dynamic Spatial Models f (It) f (It+1) f (It+2) f ( It+n ) F F . . “A dynamical spatial model is a computational representation of a real-world process where a location on the earth’s surface changes in response to variations on external and internal dynamics on the landscape” (Peter Burrough)
Forecast tp + 10 Calibration Calibration Dynamic Spatial Models tp - 20 tp - 10 tp Source: Cláudia Almeida
1980 1990 GIS t+1 load 2000 When? Where? t ≥ tf How? CLUE Model Spatial dynamical models have a common structure How much? idle play
What is a spatial dynamical model? • A closed microworld with • Spatial and temporal structure • Entities • Rules of behaviour What is changing? When? Where? Why?
Computational Modelling with Cell Spaces Cell Spaces • Hybridautomata Control Mode A Flow Condition Control Mode B Flow Condition Event Jump • GeneralizedProximityMatrix • Database support
2500 m 2.500 m e 500 m Cellular Data Base Resolution
Software: Open source GIS Visualization (TerraView) Modelling (TerraME) Spatio-temporal Database (TerraLib) Statistics (R interface) Data Mining(GeoDMA)
TerraLib EnviromentalModeling Framework C++ Signal Processing librarys C++ Mathematicallibrarys C++ Statisticallibrarys TerraME architecture RondôniaModel DinamicaModel TROLLModel CLUEModel TerraME Language TerraME Compiler TerraME Virtual Machine TerraLib
Enviromental ModellingIntroduction to LUA Tiago Garcia de Senna Carneiro (UFOP) Gilberto Câmara (INPE)
Por que Lua? • Pequena • Portátil • Eficiente • Fácil integração com C/C++ • Simples e flexível • Sintaxe simples • Facilidades para descrição de dados • Mecanismos de extensão • “Simple things simple, complex things possible”
Como é Lua? Sintaxe convencional Unidade básica de execução: chunk • Chunk = lista de comandos • Arquivo ou string do programa hospedeiro function fat (n) if n == 0 then return 1 else return n*fat(n-1) end end
Tipos • Tipos associados a valores • Variáveis armazenam qualquer tipo • Polimorfismo natural • Tipos existentes • nil • boolean • number • string • table • function • userdata • thread
Tipo nil • Propósito maior: ser diferente dos demais • Tipo do valor default das variáveis • Também significa o falso booleano • Qualquer valor de outro tipo significa verdadeiro • Com exceção de false
Tipo boolean • Valor booleano • Falso (false) ou verdadeiro (true) • if (choveu == true) then ....
Tipo number • Único tipo nativo para valores numéricos • double (por default) local a = 3 local b = 3.5 local c = 4.5e-8
Tipo userdata • Armazena um ponteiro void* de C • Tipo opaco para a linguagem • Somente atribuição e teste de igualdade • Linguagem extensível em C • “Esqueleto” para construção de linguagens de domínio específico
Tipo string • Valores imutáveis • Sem limite de tamanho • É comum ler arquivo completo em uma string • Strings não usam ‘\0’ para terminação • Podem armazenar dados binários quaisquer • Pattern-matching poderoso • Implementado via biblioteca padrão • meunome = “Silvana Amaral”;
Tipo table • Resultado da expressão {} • Arrays associativos • Qualquer valor como chave • Com exceção de nil • Único mecanismo de estruturação de dados • São para Lua o que listas são para Lisp
Tables • The only structured data type is table. • implements associative arrays, that is, arrays that can be indexed not only with integers, but with string, double, table, or function values. • For table indexing, both table.name and table[''name''] are acceptable. Tables can be used to implement records, arrays, and recursive data types.
Tipo Table loc = { cover = "forest", distRoad = 0.3, distUrban = 2 };
Tipo Table loc = { cover = "forest", distRoad = 0.3, distUrban = 2 }; loc.cover = “cerrado”; loc[“cover”] = “soja”; if (loc.distUrban > 1.5) then loc.desfPot = loc.distRoad + loc.distUrban;
Tables and functions in Lua loc = { cover = "forest", distRoad = 0.3, distUrban = 2 }; ... loc.reset = function( self ) self.cover = ""; self.distRoad = 0.0; self.distUrban = 0.0; end loc = { cover = "forest", distRoad = 0.3, distUrban = 2, reset };
Data structures with tables • Simple and efficient implementation • Records • Syntactic sugar t.x for t["x"]: t = {} t.x = 10 t.y = 20 print(t.x, t.y) print(t["x"], t["y"])
Data structures with tables (2) for i=1,n do print(a[i]) end • Arrays • Use integers as indexes • Sets • Use elements as indexes • “Bags" • Elements as indexes, counters as values t = {} t[x] = 1 -- t = t {x} if t[x] then... -- x t?
list = {value=v, next=list} value - v next - Data structures with tables (3) • Listas • Tables in Lua are “objects”, that is, dynamically allocated “things” manipulated through pointers to them. • Tables in Lua can directly represent dynamic structures such as trees and graphs, even cyclic structures. list old list ...
Library functions for tables • table.insert • Inserts a new element • table.remove • Removes an element • table.sort • Orders the elements
My first Lua program C = 2; -- rain/t -- defines a location with an absortion capacity and makes it rain solo = { acum = 0, k = 0.4; } for time = 0, 20, 1 do solo.acum = solo.acum + C – solo.k*solo.acum; end
function inc (x) return x+1 end inc = function (x) return x+1 end sugar Type function Funções are first-class values Functions can be assigned to table fields if w.pick(x,y) then w.redraw() end w = { redraw = function () ... end, pick = function (x,y) ... end, }
Type function (2) • Passagem por valor e retorno múltiplo • Suporte a atribuições múltiplas (x,y = y,x) a, b = f() print(f()) function f() return 1,2 end • Suporte a número variável de argumentos • Argumentos "empacotados" em uma tabela function f(...) print(arg[1], arg[2]) end
Lexical scope • Acesso a variáveis em escopos externos • Expressão cujo valor é calculado quando a função que a contém é criada • Quando o fecho é feito function add (x) return function (y) return y+x end end add1 = add(1) print(add1(10)) --> 11 upvalue
Constructors Data description+ imperative semantics article{ author="F.P.Brooks", title="The Mythical Man-Month", year=1975 } temp = {} temp["author"] = "F.P.Brooks" temp["title"] = "The Mythical Man-Month" temp["year"] = 1975 article(temp)
function a:foo (x) ... end a.foo = function (self,x) ... end sugar sugar a:foo(x) a.foo(a,x) Objects • Funções 1a classe + tabelas = quase OO • Tabelas podem ter funções como campos • Sugar para definição e chamada de métodos • Trata parâmetro implícito self • Ainda falta herança...
Exemplo: tipo Point -- Metatable de Point local Point_metatable = { __add = function (p1,p2) return Point(p1.x+p2.x,p1.y+p2.y,p1.z+p2.z} end } -- Construtor function Point (self) self.x = tonumber(self.x) or 0.0 self.y = tonumber(self.y) or 0.0 self.z = tonumber(self.z) or 0.0 setmetatable(self,Point_metatable) return self end ----------------------------------------------- local p = Point{x=3.0,y=1.3,z=3.2} local q = Point{x=4.2,y=1.0} local r = p+q -- {7.2, 2.3, 3.2}
Herança Simples: mecanismo de delegação -- Métodos local Point_methods = { Print = function (self) print(self.x, self.y, self.z) end, ... } -- Metatable local Point_metatable = { __index = Point_methods, __add = function (p1,p2) return Point(p1.x+p2.x,p1.y+p2.y,p1.z+p2.z} end } ------------------------------------------------ local p = Point{x=3.0,y=1.3,z=3.2} local q = Point{x=4.2,y=1.0} local r = p+q r:Print()
Bibliotecas padrão • Basic • String • Table • Math • IO • OS • Debug • Coroutine
Basic • Oferecem funções básicas • print • type • setmetatable • pairs
String • Funções para manipulação de strings • Casamento de padrões (pattern matching) • string.find • Permite buscar a ocorrência de um padrão numa string • string.gsub • Permite substituir ocorrâncias de um padrão por uma sequência de caracteres dentro de uma string
Meu segundo programa em Lua C = 2; -- rain/t K = 0.4; -- flow coefficient q = 0; -- function chuva (t) if (t < 10) then return 4 – 4*math.cos(math.pi*t/10); else return 4 – 4*math.cos(math.pi*(t-10)/10); end end -- for time = 0, 20, 1 do -- soil water q = q + chuva(time) - K*q; end -- report print(“q = "..q);
Cell Spaces • Components • Cell Spaces • Generalizes Proximity Matriz – GPM • Hybrid Automata model • Nested enviroment Computational Modelling with Cell Spaces fonte: Carneiro (2006)
is represented as a cell space environment… … where automatarules change the space properties in time. Several agents can share the same environment. Basic concepts A dynamical model…
GIS The TerraME spatial model The space local properties, constraints, and connectivity can be modeled by: A cell-space where each cell a unique neighborhood - Space is nether isomorphic nor structurally homogeneous.(Couclelis 1997) - Actions at a distance are considered.(Takeyana 1997), (O’Sullivan 1999) - a spatial structure: a lattice of cells - a set of geographic data: each cell has various attributes
TerraME extensions to Lua • To build spatial dynamic models,TerraME includes new value types in LUA usingthe constructor mechanism. • These values are: CellularSpace, Cell, Neighbourhood
Cellular Space • A CellularSpace is a multivalued set of Cells. • It consists of a geographical area of interest, divided into a regular grid. • Each cell in the grid has one or more attributes. • CellularSpaces are stored and retrieved from a TerraLib database, so the modeller should specify the properties of the CellularSpace
Constructors in Lua • LUA has a powerful syntactical tool, called constructor. • When the modeller writes name{…}, the LUA interpreter replacesit by name({… }), passing the table {…} as a parameter to the function name( ). • This function typically initializes, checks properties values and adds auxiliary data structure or methods.
GIS Loading Data -- Loads the TerraLib cellular space csQ = CellularSpace { dbType = "ADO", host = “localhost", database = "c:\\TerraME\\Database\\CabecaDeBoi.mdb", user = "", password = "", layer = "cellsLobo90x90", theme = "cells", select = { "altimetria", “soilWater", “infCap" } } csQ:load(); createMooreNeighborhood(csQ); csCabecaDeBoi:loadNeighborhood(“Moore_SerraDoLobo1985");
Database management -- loads a cellular space csAmazonia:load(); csAmazonia:createMooreNeighborhood(); -- csAmazonia:loadNeighborhood (“GPM”); … -- save (time, themeName, attrTableName) -- for time = 1, 10,1 do csAmazonia:save(time, “sim", {"water"}); end