QGIS'te bir vektör katmanını qgsAffine (veya başka bir yöntem) ile mi döndürüyorsunuz?


10

QGIS'deki vektör noktalarının bir kümesini merkezi bir nokta (veya keyfi nokta) etrafında rasgele sayıda derece döndürmek istiyorum.

Bu, düzenli bir ızgara oluşturma hakkında son zamanlarda sorulan soruya benzer ; orada bir nokta ızgarasını keyfi bir açı veya mesafe döndürmek veya kaydırmak için "Affine Transformation" aracını (eklenti anlamına geldiğini varsayıyorum) kullanılması önerildi. Nasıl çalıştığını anlamadığımı sanıyorum ve işe yaramadı.

QGIS'te düzenli bir nokta ızgarası oluşturuyorum ve UTM bölgesinin hem katman hem de proje için doğru ayarlandığından emin oluyor, katman için düzenlemeyi etkinleştiriyorum, ardından eklenti iletişim kutusunu açıyorum (qgsAffine): Afin Dönüşüm iletişim kutusu

'Tüm katmanı' seçiyorum ve sonra tüm nokta alanını 15 ° döndürmek isteyen her iki 'rotasyon' kutusuna 15 koyuyorum (işlerin yanlış gittiği yer olabilir). Operasyon, noktaları gezegen dışında bir yerde döndürmeyle sonuçlanır!

Bu iş için doğru araç mı? İdeal olarak onların ortak merkezleri hakkında bir dizi noktayı döndürmek istiyorum.

Güncelleme : qgsAffine sadece bir düşüncedir; bunu herhangi bir QGIS aracında yapabilirsek mutlu olurum!

Güncelleme 2 : qgsAffine, takmak için doğru numaraları biliyorsanız (aşağıdaki cevaba bakınız, teşekkürler Mike!) Kullanılabilir. E-tablo / hesap makinesi iyi çalışıyor veya sayıları doğrudan almak için R işlevi:

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

Böylece, kuzey Uganda'daki (UTM 36N) bir nokta ızgarasını döndürmek için affine(578988, 419210, 30)şunları verir:

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

... qgsAffine iletişim kutusuna girilen noktaları doğru şekilde döndürür.


güzel R adaptasyonu!
Mike T

Yanıtlar:


10

Bunu Post_IS'de ST_Affine kullanarak yapabilirsiniz . İsteğe bağlı bir nokta etrafında döndürülmesi işlevselliği ilave edildi ST_Rotate PostGIS 2.0.

Daha eski bir sürümünüz varsa (PostGIS 1.5 veya daha önceki gibi), aşağıdaki işlevleri ekleyebilirsiniz:

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.';

Centroid (ortak merkez) dahil olmak üzere bir x , y noktasının etrafında bir geometriyi döndürmek için nasıl kullanılacağı hakkında fikir edinmek için ST_Rotate'deki örneklere bakın .

Hepimiz matematiği sevdiğimiz için, yukarıdaki işlevlerden dönüşüm matrisi şu şekilde temsil edilir:

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

Burada θ , bir başlangıç etrafında saat yönünün aksine dönme olduğu, x 0 başlangıç noktasının easting / boylam ve Y0 Northing / Latitude. Bu matematik muhtemelen herhangi bir afin dönüşüm aracına uyarlanabilir .


QgsAffine aracını kullanmak için, matris değerlerinin nereye aktığını anlamanız gerekir. Ön hesaplamalar yapmak için iyi bir elektronik tablo şablonu da gereklidir. QgsAffine iletişim kutusu şuna benzer:

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

nerede:

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

Örneğin, bir çokgeni saat yönünde 42 ° S, 174 ° E saat yönünde 30 ° döndürmek istiyorsanız, e-tablonuza girdileriniz şunlardır:

  • x0 = 174
  • y0 = -42
  • θ = -30 derece veya -0.523598776 radyan

Ardından, sonuçları bir e-tablodan sağdaki kutuya kopyalayın / yapıştırın. İletişim kutusundaki sekme sırasını kullanarak:

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

qgsAffine

PostGIS'ten aynı örnek şuna benzer:

SELECT ST_Rotate(geom, -30*pi()/180, 174.0, -42.0)

Bu oldukça iyi görünüyor; eğer bunu Spatialite'de yapabilirsek, QGIS eklentileri aracılığıyla Spatialite dosyalarında SQL çalıştırabileceğimiz için 'QGIS'de yapmak' olarak nitelendirilir; PostGIS, içine girmek istemediğim kullanıcılar için kurulumda başka bir adım olacaktır. Spatialit için herhangi bir fonksiyonun bir sentroid etrafında da dönebileceği hakkında herhangi bir fikir var mı?
Simbamangu

aha, qgsAffine'i şimdi beklediğim gibi çalışıyorum ... bir e-tablodan çok fazla kopya / yapıştırma
Mike T

Mike, doğru çalışıyor! Ben de bu çalışmayı Spatialite ile yapmaya çalışacağım (PostGIS / spatialite bu işlemleri çok daha kolay yapıyor gibi görünüyor) ama en azından şimdi qgsAffine çalıştırabilir ve en azından basit bir eklentidir.
Simbamangu

JavaScript'e uyarlamaya çalıştım: burada da görün
flackend

1
Yukarıdaki javascript işlevini hesaplamak Afin parametrelerimi hesaplayabildim ve som vektörleri başarıyla döndürebildim, ancak bu çok kullanıcı dostu değil: Rotasyon merkezi koordinatlarını almak için Koordinat yakalama eklentisini kullanmanız, ardından dönüşüm parametrelerini hesaplayıp kopyalayıp yapıştırmanız gerekiyor QGIS! Eklentinin kendisi hesaplamaları yaptıysa ve kullanıcılar sadece rotasyon merkezi koordinatlarına girmek ve bir rotasyon açısı tanımlamak için tıklarsa çok daha basit olacaktır.
bradypus

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.