QGIS'de En Yakın Komşu Gruplandırılmış Seçim


14

Ben qgis içine ithal lat / uzun biçiminde 100.000'den fazla nokta içeren bir listem var.

Şimdi, burada yapmaya çalıştığım şey, tüm bu noktaları kutu gruplarına gruplamak ve esasen haritayı sınırlayıcı kutulara bölmek istediğimi kastediyorum.

Gereksinimlerim şunlardır:

  • kutulu hiçbir grup 100'den az olmamalı ve 200 puandan fazla olmamalıdır
  • birden fazla grupta hiçbir nokta bulunmamalıdır
  • tüm noktalar en yakın komşusuna dayanmalıdır.

Bunu qgis ile nasıl başarabilirim?

Ben bir bazı özel sorgu kodu geçmek ve sonuçları veya bir shapefile doğru oluşturulan kutuları kaydetmek varsayalım? Birisi bunun nasıl yapılabileceğini ve kodun nasıl görüneceğini açıklayabilir mi?

Belirtildiği gibi, amacım, her kutuda 100'den az ve 200'den fazla olmayan bir şekil dosyası katmanı olarak görüntülenen bir grup kare kutuya sahip olmaktır.


6
Bu soruyu "favori" olarak işaretleyen herkese: Neden de oy kullanmıyorsunuz? En sevdiğiniz sorunun iyi bir soru olması gerektiğini düşünebilirsiniz.
underdark

1
Neden boksa ihtiyacınız var? Saymaya dayalı kutular oluşturursanız, yine de farklı boyutlarda olurlar, böylece döşeme söz konusu olmaz. Çokgenlere (yani dışbükey gövde) gruplamak muhtemelen daha kolaydır.
diciu

@diciu yanıt için teşekkürler. Evet, daha sonra bunları kutulara çevirebileceğim için dışbükey bir gövde iyi olurdu sanırım. Dışbükey gövde yaklaşımını kullanarak bunu yapmak için hangi kodu kullanmam gerekir?
NetConstructor.com

2
Dışbükey gövdeler kullanırsanız sınırlama kutularınız (gövdeleri çevreleyen) üst üste binecektir ve bir noktanın tek bir BBOX'ta olması gerekliliğiniz artık karşılanmamaktadır. Dışbükey gövdeler BBOX için ara bir adım olarak değil, bir yedek olarak çalışır. Ve o zaman bile, jenerik bir çözüm oluşturmak oldukça dahil olacak.
diciu

Yanıtlar:


13

(A) bir takım noktaların en doğu yarısını ve (b) bir takım noktaların en kuzey yarısını nasıl talep edeceğinizi anladığınızı varsayarak, sizi o yolun bir parçası haline getirebilirim. Bunlardan, elbette, (c) en batıdaki yarıyı veya (d) en güney yarıyı kolayca elde edebilirsiniz. (QGIS bilmiyorum, ancak genel olarak (a) yapmanın bir yolu medyan x-koordinatını istemek ve ardından x-koordinatları bunu aşan tüm noktaları getirmektir. (B) - (d) için çözümler benzerdir .)

Bu özelliği kullanarak, çözelti kolay bir özyineleme ile elde edilir. Bunu tanımlamak için, Halfönceki işlemleri uygulayan ve iki argüman alan bir prosedür olduğunu varsayalım : birincisi bir nokta kümesi ve ikincisi truedoğu-batı bölümleme istendiğinde eşit ve falseaksi halde eşit bir kod . Girdiği, istendiği gibi bölümleyen iki alt kümesini döndürür.

Procedure Box(P: set of points, i: boolean, n: integer)
Begin
    If (Count(P) > 2*n) then
        {R,S} = Half(P,i)
        Q = Box(R,!i,n) + Box(S,!i,n)
    Else
        Q = {P}
    Endif
    Return Q
End

Bu sahte kodda, R ve S bölüm P; Kutu (R,! İ, n), R'nin dikey yönde bir bölümüdür , Kutu (S,! İ, n), S'nin dikey yönde bir bölümüdür, "+", set-teorik birleşmeyi oluşturur ve {} bir küme belirtir. (Bölme yönünün değiştirilmesi şeritler yerine kutular oluşturur.) N parametresi , bölümdeki bir grubun minimum boyutunu belirtir; maksimum boyut 2 n'dir .

Misal

Burada, bir örnek olarak, Box(P,true,100)100 ile 200 arasında gruplar halinde bölünmüş 12.891 rastgele noktadan oluşan bir P kümesi vardır . Algoritmanın 37'si 100, 91'i 101 puanı olmak üzere 128 kutu oluşturur.


2
Algoritma etkilidir. Tek bir çekirdek üzerinde çalışarak, 18 saniyede on kat (128.910) on kat daha fazla işledi. N noktası için O (n log (n) log (n)) olarak ölçeklenir. (Bu log (n) faktörlerinden birini kaldırmak için geliştirilebilir, ancak çabaya
değme

1
@ Nokta koordinatlarının bölünmesini kolaylaştırmak için sözlükbilimsel bir sıralama kullandınız mı?

2
@whuber bu harika
dassouki

1
@Dan Sözlü bir sıralama yardımcı olabilir ama gerekli değildir. N değerinin bir medyanının O (n) zamanında (O (n log (n)) zamanında değil) bulunabileceğini unutmayın, bu nedenle noktaların doğu-batı yarılarına veya kuzey-güney yarılarına bölünmesi asimptotik olarak bir O (n ) hesaplama.
whuber
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.