Quem já trabalhou com o ArcGIS provavelmente já deve ter utilizado a extensão Spatial Adjustement que permite o ajuste de bases vetoriais distintas a partir de pontos de controle (conhecido como georreferenciamento de vetores). Neste tutorial irei apresentar uma solução semelhante utilizando a função ST_Affine do PostGIS e o software estatístico R.
Na Figura 1 temos duas camadas vetoriais, a de cor vermelha teve problemas no seu georreferenciamento e será ajustada a partir da base de cor verde. Para isso, primeiro é necessário importar os shapefiles para um banco de dados geográfico e depois visualizar as tabelas criadas no QGIS:
Figura 1 - Bases cadastrais levantadas por empresas diferentes |
Devem ser criadadas duas camadas vetoriais do tipo ponto no BDG onde foram importados os shapefiles. Observa-se na Figura 2 que a localização dos pontos vermelhos correspondem aos pontos verdes (origem -> destino).
Figura 2 - Pontos de controle criados |
#carregando a biblioteca e o driver do PostgreSQL library(RPostgreSQL) drv <- dbDriver("PostgreSQL") #conexão com o BD con <- dbConnect(drv, dbname="cadastro", user="marcello", pass="<minha_senha>") #query 1 - coordenadas x,y dos pontos de destino pts_ok <- data.matrix(dbGetQuery(con, "SELECT ST_X(geom) AS x, ST_Y(geom) AS y FROM pontos_ok")) #query 2 - coordenadas dos pontos de origem pts_err <- data.matrix(dbGetQuery(con, "SELECT ST_X(geom) AS x, ST_Y(geom) AS y FROM pontos_errados")) #regressão linear: modele pts_ok #como função estatística de pts_err parameters <- lm(pts_ok ~ pts_err) #visualizando a matriz transposta dos coeficientes t(coef(parameters))
Como resultado, teremos os coeficientes da equação que lineariza os pontos com as coordenadas erradas (pts_err) em função dos pontos de referência (pts_ok).
(Intercept) pts_errx pts_erry
x 1312943.9 1.0138267 -0.143060
y -163870.4 0.1389882 1.013313
Formato de saída no R: | xoff a b | | yoff d e | Formato de entrada no PostGIS: ST_Affine(geom, a, b, d, e, xoff, yoff)
Por último, são executadas as seguintes instruções no BDG:
--criação de uma cópia da tabela errada: CREATE TABLE lotes_corrigidos AS SELECT * FROM lotes_errados; --em seguida o georreferenciamento dos lotes: UPDATE lotes_corrigidos SET geom = ST_Affine(geom, 1.0138267, -0.143060, 0.1389882, 1.013313, 1312943.9, -163870.4);
Finalizando, a Figura 3 mostra o resultado da base corrigida, o resultado foi satisfatório considerando a quantidade de pontos utilizada:
Figura 3 - Resultado do georreferenciamento (lotes_corrigidos) |
Nenhum comentário:
Postar um comentário