Haritada anten sembollerini gösterme: nokta sembolleri veya özellikleri (çokgenler)


12

Haritada hücresel bir ağ göstermek istiyorum. Girdi verileri, her dizenin bir hücresel sektör olduğu bir .csv dosyasıdır. Nitelikler: sektör kimliği, koordinatları, azimutu ve anten ışını genişliği açısıdır.

Anten ışını genişliği değerleri 30 ila 360 derece arasındadır. 360 anten ışını genişliği, haritada daire şeklinde gösterilmesi gerektiği anlamına gelir. Diğer ışın genişliklerine sahip antenler, uygun diyafram açılarına sahip sektörler olarak gösterilmelidir.

resim açıklamasını buraya girin

Antenleri sadece sembollerle göstermek mümkün mü? Kendi SVG sembolümü nasıl oluşturacağımı biliyorum ve azimut'a göre nasıl döndüreceğini bulmayı umuyorum. Ancak, özellik değerine göre 30 ila 360 derece arasında değişken anten ışını genişliği uygulamanın herhangi bir yolu var mı?

Sanırım QGIS'te bu şekilde mümkünse, harita üzerinde görüş ölçeğine göre dinamik görselleştirme nedeniyle antenleri çizmenin en iyi yolu olduğunu düşünüyorum.

Tabii ki, görev bir katman özelliği olarak uygun çokgenler çizilerek çözülebilir, ancak bu geçici bir çözüm olacaktır.


Yani yayı her alan için farklı olan doğru yönde çizmeniz mi gerekiyor?
Nathan W

Hiç doğru anlamazsam. Resimde gösterildiği gibi bir daire sektörü (veya ışın genişliği = 360 olması durumunda tüm daire) olmalıdır.
E Bobrov

Evet, demek istediğim bu.
Nathan W

Tamam anladım. Genel olarak konuşmak gerekirse ark sembolü kesinlikle gerekli değildir. Ana nitelikler azimut ve ışın genişliğidir. Antenleri sadece yay çizmek için herhangi bir sembol kullanabilirim.
E Bobrov

Muhtemelen yardımcı olabilecek bir örnek buldum: Özel Sembol Katman Türleri Oluşturma . Ama emin değilim. Yani herhangi biri kendi özelliğine (örneğin yukarıdaki resim kelimelerinde anten azimut) bağlı olarak her katman özellik yönünü çizen kendi sembol katman sınıfınızı yaratmaya çalıştı mı?
E Bobrov

Yanıtlar:


7

Birkaç gün önce QGIS'e Wedge Buffer Processing Algorithm adlı yeni bir eklenti eklendi . Bu ilgi çekici gibi görünüyor.

Adından da anlaşılacağı gibi, bir işleme algoritması olduğundan, işleme araç kutusundan çalıştırmanız gerekir. Henüz denemek için bir şansı olmadı.

Normal dairesel bir tampon gibi daire kesimleri oluşturur, ancak kama açısı ve yarıçapı alan değerleri kullanılarak ayarlanabilir.

Belgeler ve ekran görüntüleri github sayfasında görülebilir


10

Sadece semboloji kullanmak istiyorsanız, benzer bir soruya verdiğim yanıttan ilham alan bir çözüm öneriyorum: QGIS'de sektör ışıkları yaratmak? .


Benzer bir yaklaşımı izleyerek ve bir Öngörülen CRS üzerinde çalıştığınızı varsayarsak (bunun yerine bir Coğrafi Koordinat Sistemi kullanıyorsanız, cevabın sonundaki nota bakın), dikkati açıklamaya odaklayacağımı vurgulamak istiyorum. istenen sonucu yeniden üretmek için yapılacak en az şey: Bu, diğer küçük parametrelerin (boyutlar, genişlikler vb.) ihtiyaçlarınızı daha iyi karşılamak için sizin tarafınızdan kolayca ayarlanması gerektiği anlamına gelir.

Ayrıca, "AZIMUTH"bunun azimut değerlerini "BEAMWIDTH"depolayan alan ve anten ışını genişliklerini depolayan alan olduğunu varsayıyorum .

Çözüm

Noktaları Single symbolbir Simple Markerve iki Geometry generatorsembol katmanına yineleyerek ve ile işaretleyeceğiz:

resim açıklamasını buraya girin

Daha fazla açıklamada, yukarıdaki görüntüdeki sembollerin aynı sırasını takip edeceğim.

1) Basit İşaretleyici

3 mm büyüklüğünde ve 0.4 mm genişliğinde kırmızı bir dairenin varsayılan bir sembolünü seçtim (bu öğreticinin daha kolay kısmıdır).

2) Geometri Jeneratörü No. 1

Yeni bir sembol katmanı ekleyin Geometry generatorve ve LineString / MultiLineStringtürlerini seçin :

resim açıklamasını buraya girin

Bu ifadeyi Expressionalana ekleyin :

make_line(
 $geometry,
 make_point($x + 300*cos(radians(90 -  "AZIMUTH" )), $y + 300*sin(radians((90 - "AZIMUTH" ))))
)

Azimut kümesine işaret eden oku tanımladık (oku oluşturmak için, Menü ana sembolünden seçeneğin Arrowaltındaki sembol katmanı türünü seçmeyi unutmayın Line). Lütfen 300metre cinsinden bir mesafeyi temsil ettiğini ve keyfi bir değer olduğunu unutmayın, bu yüzden ihtiyaçlarınıza göre değiştirmekten çekinmeyin.

3) Geometri Jeneratörü No. 2

Yeni bir sembol katmanı ekleyin ve Geometry generatortürü ve Polygon / MultiPolygontürleri seçin:

resim açıklamasını buraya girin

Bu ifadeyi Expressionalana ekleyin :

CASE
WHEN ("BEAMWIDTH") <= 180
THEN
intersection(
  buffer(
   $geometry, 200),
  make_polygon(
   geom_from_wkt(
    geom_to_wkt(
     make_line(
      $geometry,
      make_point($x + 2000*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + 2000*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
      make_point($x + 2000*cos(radians(90 -  "AZIMUTH" )), $y + 2000*sin(radians((90 - "AZIMUTH" )))),
      make_point($x + 2000*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + 2000*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
      $geometry)
     )
    )
   )
  )

WHEN ("BEAMWIDTH") > 180
THEN
difference(
  buffer(
   $geometry, 200),
   make_polygon(
    geom_from_wkt(
     geom_to_wkt(
      make_line(
       $geometry,
       make_point($x + 2000*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + 2000*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
       make_point($x - 2000*cos(radians(90 -  "AZIMUTH" )), $y - 2000*sin(radians((90 - "AZIMUTH" )))),
       make_point($x + 2000*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + 2000*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
       $geometry)
      )
     )
    )
   )

END

Sektörü yeni tanımladık. Lütfen unutmayın 200ve 2000mesafeleri metre cinsinden temsil ederler ve bunlar keyfi değerlerdir, çünkü 200 m yarıçapa sahip daireyle kesişmek için bir çokgen oluşturmaya çalışıyorum, bu yüzden bunları ihtiyaçlarınıza göre değiştirmekten çekinmeyin.

Son sonuç

Önceki görevleri doğru bir şekilde gerçekleştirirseniz, bunun gibi sonuçlar elde edebilmeniz gerekir (etiketler bu çözümün dışında eklenir ve yalnızca bağlamı daha iyi açıklamalıdır):

resim açıklamasını buraya girin

Not

Eğer bir kullanıyorsanız Coğrafi Koordinat Sistemi Eğer derecelerde değil mesafeler ile ilgileniyor eğer, yani ben önceki formüllerde mesafe kullanıldığında uygun değerler kullanılarak yeterli olmalı. Kullandığım mesafeler:

  • 300 m (bkz. Geometri Üreteci No. 1);
  • 200 m (bkz. Geometri Jeneratörü No. 2);
  • 2000 m (bkz. Geometri Üreteci No. 2);

derecelerle ifade edilen diğer rasgele değerlerle değiştirebilir, böylece (örneğin, 0.0002, 0.002ve benzeri).

Bonus

Buraya tarzı ekledim : bu kodu herhangi bir metin düzenleyicisiyle açıp QGIS Katman Stili dosyası (yani bir .qmluzantı ile) olarak kaydedebilirsiniz .

Yukarıdaki stil QGIS 2.18.4 kullanılarak oluşturulmuştur (kullandığınız şekil dosyasının adı olmalıdır).


Bu çözümü mü arıyordunuz? Çalışıyor mu?
mgri

Çözümünüz, konuyla ilgili olarak açıklanan davayı tamamen çözüyor! Uyguladım ve kendi gerçek durumumun biraz farklı olduğunu anladım. Üzgünüm, bu benim hatam.
E Bobrov

1) Haritalarımdaki sektörlerin yoğunluğu farklı, yani sektörler arasındaki kısa mesafeler durumunda, kodda tanımlanan mesafe çakışan birçok sektör verecek, harita zumunu değiştirmek yardımcı olmayacak, bu yüzden oldukça zor olacak haritayı okumak için. Ancak sektörler arasındaki uzun mesafeler söz konusu olduğunda sektörlerin çok küçük ve haritayı okumak belki zor olabilir. Tek semboller kullanmak bu problemden bağımsızdır, ölçekleri harita yakınlaştırma ile değişir.
E Bobrov

2) Ve ışın genişliği bozulmaları vardır: ışın genişliği 360 derece elipslere, farklı azimutları olan sektörlere benzer, ancak aynı ışın genişliği eşdeğer ışın genişliğine sahip sektörlere benzemez. Coğrafi Koordinat Sistemini kullandığım için mi? Şimdi, farklı boylam / enlem açıları yeryüzündeki noktalar arasındaki farklı mesafeyi temsil ediyor. Bu nedenle çözümün sektörlerin bulunduğu Dünya bölgelerinde lokalize edilmesi gerekiyordu.
E Bobrov

Her neyse çözümünüz ve benzer cevap referansı "QGIS'de sektör ışıkları mı oluşturuluyor?" bazı yararlı işlevler görmeme yardımcı oldu. Tekrar teşekkürler.
E Bobrov

4

Büyük kudos - mgri.

Test katmanımızda her şey sorunsuz çalıştı. Bir üretim katmanında, iki / üç saat sonra, $ geometri ile ilgili bir sorunu izlemeyi başardım . Bir platformdan bir nokta katmanı dışa aktarmıştı , fark etmedi, ancak MultiPoint'ti . Bu sorunlara neden olmuş gibiydi: ok çizilmedi; ve garip bir şekilde sadece hesaplanan noktalar dairelerin poligonunu oluşturdu.

Başka bir şey, değişken bir yarıçap kullanıyorum . (bu durumda doğru kelime olduğundan emin değilsiniz, 'ışın uzunluğu' veya başka bir ad da verebilirsiniz).

İşte şimdi, MultiPoints geometri tipi katmanıyla (aslında tüm özellikler tek bir nokta olsa da) kullanıyorum ve QGis 2.18.3'te benim için çalışıyor

Ok ifadesi 360 ° ise ok yok.

CASE

WHEN ("BEAMWIDTH") = 360
THEN 
make_line(
 make_point($x, $y),
 make_point($x + "RADIUS"*cos(radians(90 -  "AZIMUTH" )), $y + "RADIUS"*sin(radians((90 - "AZIMUTH" ))))
)

END

Çokgen ifadesi

CASE

WHEN ("BEAMWIDTH") <= 180
THEN
intersection(
  buffer(
   make_point($x,$y), "RADIUS"),
  make_polygon(
   geom_from_wkt(
    geom_to_wkt(
     make_line(
      make_point($x,$y),
      make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
      make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" )))),
      make_point($x + "RADIUS"*2*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
      make_point($x,$y))
     )
    )
   )
  )

WHEN ("BEAMWIDTH") > 180
THEN
difference(
  buffer(
   make_point($x,$y), "RADIUS"),
   make_polygon(
    geom_from_wkt(
     geom_to_wkt(
      make_line(
       make_point($x,$y),
       make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
       make_point($x - "RADIUS"*2*cos(radians(90 -  "AZIMUTH" )), $y - "RADIUS"*2*sin(radians((90 - "AZIMUTH" )))),
       make_point($x + "RADIUS"*2*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
       make_point($x,$y))
      )
     )
    )
   )

END

Cevabım genel bir yaklaşım önerdi: konuyla ilgili çok sayıda değişken olduğu için, herhangi bir durumu çözmek için benzersiz bir prosedür oluşturmak imkansızdı. Bu nedenle, işaret ettiğiniz ve MultiPoint özellikleri ile bir yaklaşım önerdiğiniz için teşekkürler, gelecekte birisine kesinlikle yardımcı olacaktır.
mgri

1

Herhangi bir ek eklenti olmadan web'de kısmi çözüm ile yetenekli oldum, sadece kutunun dışında qgis. Anten ışın genişliğini göstermez, sadece basit işaretçiyi doğru yönde döndürün: basit işaretleyiciyi kullanın ve anten azimutu + 180 derece ile döndürün (Katman Özellikleri> Tek Erkek-> İşaretçi-> Basit işaretleyici-> üçgen-> üçgen-> düzenle -> ifade alanına <180 + "anten azimut"> yazın ve ayrıca işaretçinin Bağlantı noktası alanına Üst olarak ayarlayın). Gömülü basit üçgen işaretleyicinin uygunsuz yönü nedeniyle <180 + "anten azimut"> kullanılması gereklidir. Aksi takdirde yanlış anten yönü gösterecektir.

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.