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) |


