Czy tworzysz regularnie rozmieszczone punkty wewnątrz wielokąta na podstawie wartości atrybutu za pomocą QGIS?

11

Mam warstwę wielokąta z dołączoną wartością atrybutu reprezentującą liczbę osób wewnątrz wielokąta. Używam QGIS 3.0.

Muszę wizualizować liczby jako siatkę punktów wewnątrz wielokąta (tj. 1 punkt = 100 żab, pokolorowanych według gatunku). Punkty niekoniecznie muszą zajmować cały wielokąt, a najlepiej są narysowane wokół środka ciężkości z wcześniej zdefiniowanym odstępem (tj. 300 m), aby mogły reprezentować czystą siatkę przy określonej rozdzielczości.

Obecne obejście, które znalazłem, to użycie „Punktów regularnych” z parametrem counts, aby utworzyć siatki wewnątrz zasięgu narysowanego na mapie, a następnie usunąć dodatkowe punkty utworzone przez algorytm (algorytm zaokrągla do siatki i możesz otrzymać 20 punktów zamiast 17 w Wejście). Daje to pożądany wynik, ale wymaga narysowania obszaru dla regularnych punktów dla każdego wielokąta, a także ręcznego wprowadzania atrybutów i czyszczenia utworzonych punktów. Ponadto, ponieważ uruchamiam „Punkty regularne” z określoną liczbą, zamiast odstępów, każdy wielokąt otrzymuje punkty o różnych odstępach.

W skrócie: Regularne punkty (zdefiniowana liczba punktów, wyciągnięty zasięg) dla każdego wielokąta (partia)> Usuń dodatkowe punkty> przypisz wartości atrybutów do # punktów

Alternatywne (pozwala uniknąć nieregularnych odstępów, ale wymaga jeszcze więcej manipulacji):

Regularne punkty (zdefiniowane odstępy, tj. 300 m) w zasięgu całej warstwy> Przytnij do zasięgu wielokątów> Usuń dodatkowe punkty w każdym wielokącie, aż uzyskasz pożądaną liczbę punktów> przypisz wartości atrybutów do punktów.

Głównym problemem z moimi obejściami jest przetwarzanie wielokąta po wielokącie, co utrudnia aktualizację danych i pracę z większą liczbą wielokątów.

Analogiczne pytanie zostało zadane jako Tworzenie regularnie rozmieszczonych, zdefiniowanych # punktów w wielokącie w QGIS , ale specyfika jest inna.

Zrzut ekranu pożądanego wyniku:

Tabela atrybutówL:

Ruslan
źródło
1
Czy obraz w twoim pytaniu reprezentuje to, czego oczekujesz w rezultacie? Skąd się biorą kolorowe punkty? Czy możesz dodać tabelę atrybutów warstwy? Zwłaszcza atrybuty wielokątów, w tym Edmonton i Sherwood Park, dla lepszego zrozumienia kolorów i liczenia.
Kadir Şahbaz
1. To tylko zamaskowane dane, które nie mają wiele wspólnego z rzeczywistymi wielokątami, ale tak, spodziewam się tego rodzaju wyniku, ale z kropkami wokół środka wielokąta. 2. Liczby pochodzą z kolumn tabeli atrybutów, ponieważ istnieją trzy kolumny / typy punktów, które agregowałem w jedną kolumnę, aby najpierw uzyskać odpowiednią liczbę punktów na wielokąt, a następnie przypisać atrybut / kolory za pomocą wyrażeń. edytuj: dodana tabela excel do pytania, nie reprezentuje wartości, ale reprezentuje strukturę moich danych.
Ruslan

Odpowiedzi:

5

QGIS 3 jest wyposażony w nową metodę przemieszczania w module renderującym klastra o nazwie grid. Wygląda na to, że to właściwie to, czego potrzebujesz. Po prostu stwórz liczbę pożądanych punktów na środku twojego wielokąta.

wprowadź opis zdjęcia tutaj

Nie znam metody generowania punktów tylko za pomocą narzędzia GUI, ale powinien to zrobić stosunkowo prosty skrypt w języku Python.

with edit(point_layer):
    for polygon_feature in polygon_layer.getFeatures():
        point_feature = QgsFeature(point_layer.fields())
        point_feature.setGeometry(polygon_feature.geometry().centroid())

        point_feature['type'] = 'Frog'
        for i in range(polygon_feature['Frogs']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Cat'
        for i in range(polygon_feature['Cats']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Diplodoc'
        for i in range(polygon_feature['Diplodocs']):
            point_layer.addFeature(point_feature)

Jeśli chcesz oszaleć, zawiń to w niestandardowym algorytmie przetwarzania.

Matthias Kuhn
źródło
Dzięki Matthias, wydaje się to nawet lepsze niż inne rozwiązania. Czy możesz zasugerować sposób szybkiego utworzenia wymaganej liczby punktów na podstawie tabeli atrybutów, aby to osiągnąć?
Ruslan
Nie znam prostej metody poza pisaniem małego skryptu python. Kod jest całkowicie nieprzetestowany, więc mogą mieć literówki;)
Matthias Kuhn
Dzięki jeszcze raz. Prawdopodobnie będę musiał wykonać podobną wizualizację dla wielu warstw / zakresów itp., Więc spróbuję zbudować przynajmniej model przetwarzania w tym celu.
Ruslan
5

Odpowiedź może być inna inspirująca odpowiedzią Saratha SRK:

  1. Środek ciężkości wielokątów
  2. Bufor wykorzystujący wyrażenie z kwadratem i dostosowujący się do twojej skali: tj. (1000 * (sqrt („Żaby” + „Koty” + „Diplodocs”) / 2)) + 1 i segment = 1, styl zakończenia = kwadrat
  3. Nowy punkt siatki z odstępem spójnym ze skalą bufora.
  4. Usuń punkt, który nie przecina się z warstwą bufora (wybierz według lokalizacji)
  5. dołącz atrybut przez lokalizację (atrybut bufora lub oryginalnych wielokątów)

Będziesz jednak miał coś takiego wprowadź opis zdjęcia tutaj

  1. Za pomocą modelera graficznego utwórz nowe pole za pomocą polecenia „@row_number” wprowadź opis zdjęcia tutaj

  2. Wykonaj model z iteracją na warstwie buforowej wprowadź opis zdjęcia tutaj

  3. Scal całą nową warstwę

  4. Usuń cały punkt z polem ID_pt większym niż suma twojego pola („Żaby” + „Koty” + „Diplodocs”)

  5. Kategoryzuj według reguł (tj
    • „ID_pt” <= „Żaby”
    • „ID_pt”> „Żaby” i „ID_pt” <= („Koty” + „Żaby”)
    • „ID_pt”> („Koty” + „Żaby”) i „ID_pt” <= („Koty” + „Żaby” + „Diplodocs”) wprowadź opis zdjęcia tutaj
Christophe
źródło
Dzięki za to! Nie miałbym dzisiaj czasu na wypróbowanie tego, ale wydaje się, że jest to realne rozwiązanie, biorąc pod uwagę, że otrzymałeś pożądaną wydajność.
Ruslan
1

Możesz do tego użyć generatorów geometrii.

  1. Dodaj 3 podwarstwy do symbolu, po jednym dla każdego koloru / atrybutu.
  2. Utwórz wyrażenie, które generuje wielobok dla każdej podwarstwy.
  3. Teraz część trudną, wygeneruj kwadratowe części dla wieloboku na podstawie atrybutu. Myślę, że będzie to wymagało niestandardowej funkcji wyrażenia w języku Python.
  4. Opcjonalnie użyj zmiennych renderowania dla skali mapy, aby określić skalowanie wielokątów i odstępy.
Matthias Kuhn
źródło
Przepraszam, jestem teraz zbyt zajęty, aby uzyskać pełną odpowiedź, ale będzie to bardzo interesujące wyzwanie, aby spróbować ugotować coś z tego przepisu tutaj. Być może ktoś próbuje dostarczyć nam dobre rozwiązanie oparte na tym.
Matthias Kuhn
1

Jednym z rozwiązań może być utworzenie warstwy punktowej z punktami w środku każdego wielokąta. Na przykład masz centroid Edmonton 25 nałożonego punktu: 5 z atrybutem żaby, 20 punktów z kotem i 0 z dyplomem.

Następnie za pomocą renderera przesunięcia punktowego z metodą umieszczania ustawioną jako siatka powinieneś być w stanie uzyskać efekt.

Trudność polega na utworzeniu warstwy punktowej ....

JR
źródło
0

Bardzo prostą alternatywą może być użycie wykresu kołowego dostępnego we właściwościach warstwy? Atrybuty i rozmiary mogą być podyktowane wyrażeniem.

wprowadź opis zdjęcia tutaj

Christophe
źródło
2
Cóż, wiem o alternatywnych sposobach mapowania danych. Chodzi o to, aby umożliwić przepływ pracy wizualizacji. Wykresy kołowe naprawdę nie działają, ponieważ patrząc na siatkę, masz bardzo dobre wyczucie liczby osób. Próba oszacowania dokładnych indywidualnych liczb każdego wielokąta na podstawie wykresów kołowych jest prawie niemożliwa.
Ruslan
0

Możesz wygenerować punkty na ścieżce spiralnej, zaczynając od środka ciężkości wielokąta. Poniższy wpis Przepełnienie stosu zawiera kod w języku Python do tworzenia punktów w równej odległości, ale nie mogę go obecnie przetestować, biorąc pod uwagę mój brak wolnego czasu.

Techie_Gus
źródło
Wydaje się, że jest wystarczająco blisko, ale jak wspomniano w pytaniu, nie jestem wystarczająco biegły, aby kodować / zmieniać kod tam sugerowany.
Ruslan
Mam nadzieję, że ktoś z wystarczającą wiedzą i czasem się
wtrąci
0

W Twoim przypadku,

  1. Twórz regularnie rozmieszczone punkty, korzystając z podanej odległości dla całego AOI
  2. Utwórz punkty środka ciężkości dla wszystkich wielokątów (dane wejściowe).
  3. Utwórz bufor dla tych punktów środka ciężkości za pomocą bufora o stałej odległości z segmentami o wartości „1”. Utworzy bufor kwadratowy zamiast koła (użyj narzędzia obracania w Qgis, jeśli chcesz obrócić wielokąty buforowe).
  4. Utwórz zaznaczenie punktów znajdujących się wewnątrz wielokątów buforowych za pomocą wektora -> Narzędzia badawcze -> Wybierz według lokalizacji (punkty w regule wielokątów).
  5. Przełącz wybór i usuń punkty poza wielokątami bufora. Teraz masz regularnie rozmieszczone punkty wokół środka ciężkości wielokątów.
  6. Podaj atrybut Większość dla całych punktów, a resztę punktów należy sklasyfikować ręcznie. Użyj narzędzia QuickMultiAttributeEdit , aby łatwo aktualizować atrybuty.
Sarath SRK
źródło
Dzięki, wydaje się, że to ogranicza etapy przetwarzania, ale to nie rozwiązuje problemu z koniecznością ręcznego wyboru (bufory wewnątrz wielokątów będą miały identyczny rozmiar = taka sama liczba punktów na wielokąt), usuwania i przypisywania utworzonych punktów dla każdego z wielokąty, co jest głównym problemem w tym i moim przepływie pracy.
Ruslan