Girando uma camada vetorial no QGIS com qgsAffine (ou outro método)?

10

Eu gostaria de girar um conjunto de pontos vetoriais no QGIS um número arbitrário de graus em torno de um ponto central (ou ponto arbitrário).

Isso é semelhante a uma pergunta recente sobre a criação de uma grade regular ; foi sugerido lá o uso da ferramenta "Affine Transformation" (que suponho que significou o plug-in) para girar ou mudar uma grade de pontos em um ângulo ou distância arbitrários. Suspeito que não esteja entendendo como funciona e não consegui fazê-lo funcionar.

Eu crio uma grade regular de pontos no QGIS e garanto que a zona UTM esteja definida corretamente para a camada e o projeto, ative a edição da camada e abra a caixa de diálogo do plug-in (qgsAffine): Caixa de diálogo Transformação Afim

Eu seleciono 'camada inteira' e, em seguida, desejando girar todo o campo de pontos em 15 °, coloco 15 nas duas caixas 'rotação' (que podem ser as coisas que estão dando errado). A operação resulta na rotação dos pontos em algum lugar fora do planeta!

Essa é a ferramenta certa para o trabalho? Eu gostaria de girar um conjunto de pontos sobre o centro comum, idealmente.

Atualização : qgsAffine é apenas um pensamento; se pudermos fazer isso em qualquer ferramenta QGIS, ficarei feliz!

Atualização 2 : qgsAffine é utilizável SE você souber os números certos para conectar (veja a resposta abaixo, obrigado Mike!). A planilha / calculadora funciona bem, ou aqui está a função R para obter os números diretamente:

## Compute correct affine numbers for qgsAffine plugin
affine <- function(originX, originY, rotAngle) {
  A <- rotAngle * pi / 180
  scaleX <- scaleY <- cos(A)
  rotX <- sin(A)
  rotY <- -sin(A)
  transX <- originX - cos(A) * originX + sin(A) * originY
  transY <- originY - sin(A) * originX - cos(A) * originY
  aff <- data.frame(scaleX, scaleY, rotX, rotY, transX, transY)
  return(aff)
}

Portanto, para girar uma grade de pontos no norte de Uganda (UTM 36N), affine(578988, 419210, 30)obtém:

     scaleX    scaleY rotX rotY   transX    transY
1 0.8660254 0.8660254  0.5 -0.5 287174.7 -233330.5

... que, inserido na caixa de diálogo qgsAffine, gira corretamente os pontos.

Simbamangu
fonte
boa adaptação R!
Mike T

Respostas:

10

Você pode fazer isso no PostGIS usando ST_Affine . A funcionalidade para girar em torno de um ponto arbitrário foi adicionada ao ST_Rotate for PostGIS 2.0.

Se você possui uma versão anterior (como PostGIS 1.5, ou mesmo anterior), você pode adicionar estas funções:

CREATE OR REPLACE FUNCTION st_rotate(geometry, double precision, geometry)
  RETURNS geometry AS
'SELECT ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1, ST_X($3) - cos($2) * ST_X($3) + sin($2) * ST_Y($3), ST_Y($3) - sin($2) * ST_X($3) - cos($2) * ST_Y($3), 0)'
  LANGUAGE sql IMMUTABLE STRICT
  COST 100;
COMMENT ON FUNCTION st_rotate(geometry, double precision, geometry) IS 'args: geomA, rotRadians, pointOrigin - Rotate a geometry rotRadians counter-clockwise about an origin.';

CREATE OR REPLACE FUNCTION st_rotate(geometry, double precision, double precision, double precision)
  RETURNS geometry AS
'SELECT ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1,    $3 - cos($2) * $3 + sin($2) * $4, $4 - sin($2) * $3 - cos($2) * $4, 0)'
  LANGUAGE sql IMMUTABLE STRICT
  COST 100;
COMMENT ON FUNCTION st_rotate(geometry, double precision, double precision, double precision) IS 'args: geomA, rotRadians, x0, y0 - Rotate a geometry rotRadians counter-clockwise about an origin.';

Veja exemplos em ST_Rotate para ter uma idéia de como usá-lo para girar uma geometria em torno de um ponto x , y , incluindo o centróide (centro comum).

Como todos gostamos de matemática, a matriz de transformação das funções acima é representada como:

[ cos(θ)  | -sin(θ)  ||  x0 - cos(θ) * x0 + sin(θ) * y0 ]
[ sin(θ)  |  cos(θ)  ||  y0 - sin(θ) * x0 - cos(θ) * y0 ]

Onde θ é a rotação no sentido anti-horário sobre uma origem, x0 é o Leste / Longitude do ponto de origem e y0 é o Norte / Latitude. Essa matemática pode ser adaptada a qualquer ferramenta de transformação afim.


Para usar a ferramenta qgsAffine, você precisa entender para onde os valores da matriz fluem. Também é necessário um bom modelo de planilha para fazer pré-cálculos. A caixa de diálogo qgsAffine é mais ou menos assim:

              X   Y
            +---+---+
      Scale | a | e |
            +---+---+
   Rotation | d | b |
            +---+---+
Translation | c | f |
            +---+---+

Onde:

  • a : cos (θ)
  • b : -sin (θ)
  • c : x0 - cos (θ) * x0 + sin (θ) * y0
  • d : sin (θ)
  • e : cos (θ)
  • f : y0 - sen (θ) * x0 - cos (θ) * y0

Por exemplo, se você deseja girar um polígono 30 ° no sentido horário em torno de 42 ° S, 174 ° E, aqui estão suas entradas para sua planilha:

  • x0 = 174
  • y0 = -42
  • θ = -30 graus ou -0,523598776 radianos

Em seguida, copie / cole os resultados de uma planilha para a caixa direita. Usando a ordem das guias na caixa de diálogo:

  • a: 0.866025404
  • d: -0,5
  • c: 44.31157974
  • e: 0.866025404
  • b: 0,5
  • f: 81.37306696

qgsAffine

O mesmo exemplo do PostGIS seria algo como:

SELECT ST_Rotate(geom, -30*pi()/180, 174.0, -42.0)
Mike T
fonte
Isso parece muito bom; se pudermos fazer isso no Spatialite, ele se qualificaria como 'fazendo isso no QGIS', pois podemos executar o SQL nos arquivos do Spatialite por meio de plug-ins do QGIS; O PostGIS seria outra etapa completa da instalação para usuários nos quais não quero entrar. Alguma idéia se alguma função do spatialite também pode girar em torno de um centróide?
Simbamangu 19/03/12
aha, eu desmistifiquei qgsAffine, funciona como esperado agora ... apenas muitas cópias / colagens de uma planilha embora
Mike T #
Mike, isso funciona perfeitamente! Também vou tentar fazer isso funcionar com o Spatialite (o PostGIS / spatialite parece facilitar muito essas operações), mas pelo menos agora posso fazer o qgsAffine funcionar e, pelo menos, é um plugin direto.
Simbamangu 19/03/12
Eu tentei adaptá-lo ao JavaScript: veja aqui também jsfiddle
flackend
1
Calculando a função javascript acima, eu consegui calcular meus parâmetros afins e girar alguns vetores com êxito, mas isso não é tão fácil de usar: você precisa usar o plug-in de captura do Coordinate para obter as coordenadas do centro de rotação, calcular os parâmetros de transformação e copiar e colar de volta para QGis! Seria muito mais simples se o próprio plugin fizesse os cálculos e os usuários apenas clicassem para inserir as coordenadas do centro de rotação e definir um ângulo de rotação.
Bradypus 09/09/12
2

Eu nunca cheguei a lugar nenhum tentando girar camadas vetoriais usando qgsAffine e acho que não estou sozinho. Esta questão surgiu recentemente no fórum QGIS e foi encontrada uma solução usando o OpenJump (gratuito). Dê uma olhada neste tópico (no final):

http://forum.qgis.org/viewtopic.php?f=2&t=10126&sid=28473d53d244a4cd2a6f91887811ef02

Claro que você também pode usar essa ferramenta apenas para fazer uma rotação simples dos seus dados.

Nhopton
fonte