Przejdź do treści
AI Agent
QGIS
Samouczek

Kalkulator pól QGIS: 24 przetestowane wyrażenia i pułapki

Opublikowano

Aby obliczyć kolumnę w QGIS, otwórz tabelę atrybutów warstwy, kliknij ikonę Field Calculator (Kalkulator pól, Ctrl+I), wybierz nowe lub istniejące pole, wpisz wyrażenie i kliknij OK. Ta część jest szybka. Trudniej robi się wtedy, gdy wyrażenie działa bez błędu, a zapisuje wartości NULL, stopnie kwadratowe albo złą klasę.

7 listopada 2026 roku uruchomiłem 24 wyrażenia kalkulatora pól na prawdziwych warstwach OpenStreetMap dla Indiranagar i sąsiednich okręgów w Bengaluru w Indiach (8709 budynków, 854 drogi, 35 szkół, 37 przystanków autobusowych, 10 okręgów), a obok każdego uruchomiłem jego typową błędną wersję. Poniżej znajdziesz zbiór wyrażeń z dokładnymi wynikami, ciche pułapki zmierzone względem elipsoidalnego wzorca i to, co się stało, gdy trzy najtrudniejsze zadania przekazałem agentowi AI działającemu w QGIS.

Czym jest kalkulator pól QGIS?

Kalkulator pól QGIS (Field Calculator) to wbudowane narzędzie, które tworzy lub aktualizuje kolumny tabeli atrybutów za pomocą wyrażeń QGIS. Potrafi obliczać wartości geometrii, takie jak powierzchnia, długość i współrzędne, przerabiać tekst, klasyfikować wiersze przez CASE WHEN oraz pobierać liczebności lub odległości z innych warstw projektu.

QGIS daje w rzeczywistości cztery miejsca do uruchamiania tych samych wyrażeń, a wybór złego to pierwszy sposób na utratę pracy:

  • Okno Field Calculator (Ctrl+I): edytuje warstwę na miejscu. Możesz utworzyć nową kolumnę lub nadpisać istniejącą, dla wszystkich obiektów albo tylko zaznaczonych. Zmiany czekają w buforze edycji, dopóki ich nie zapiszesz.
  • Pole wirtualne (pole wyboru w oknie): oblicza wyrażenie na bieżąco przy każdym otwarciu tabeli lub rysowaniu mapy. Gdy podwoiłem obrys budynku fid 27 w warstwie testowej, jego zwykła kolumna powierzchni została na 197.355, a pole wirtualne zmieniło się na 789.418. Haczyk polega na tym, że pole wirtualne żyje w pliku projektu .qgs, a nie w pliku GeoPackage czy Shapefile. Otwórz plik w nowym projekcie, a kolumny nie będzie.
  • Narzędzie Processing „Field calculator” (native:fieldcalculator): zapisuje zupełnie nową warstwę wynikową i nie rusza oryginalnej warstwy. Używaj go w modelach albo wtedy, gdy nie chcesz edytować na miejscu. Uważaj na @row_number, który tutaj zaczyna się od 0, a w oknie od 1.
  • Pasek szybkich obliczeń u góry tabeli atrybutów: aktualizuje istniejącą kolumnę bez otwierania pełnego okna, dobry do szybkiego jednolinijkowca, gdy jesteś już w trybie edycji.

Jak obliczyć pole krok po kroku

Otwórz Field Calculator

Kliknij warstwę prawym przyciskiem i wybierz Open Attribute Table, a potem kliknij ikonę liczydła na pasku narzędzi tabeli atrybutów. Gdy warstwa jest zaznaczona w panelu Layers, Ctrl+I otwiera Field Calculator bezpośrednio.

Sprawdź zaznaczenie i ustawienia pola

Jeśli na mapie są zaznaczone jakiekolwiek obiekty, opcja Only update N selected feature(s) jest domyślnie zaznaczona. Odznacz ją, jeśli chcesz obliczyć całą warstwę. Wybierz Create a new field (lub Update existing field), ustaw Output field name i wybierz Output field type (Decimal number (real) dla powierzchni i długości z częścią dziesiętną, Integer dla liczebności, Text (string) dla etykiet i klas).

Napisz wyrażenie i sprawdź Preview

Wpisz wyrażenie w edytorze po lewej albo wyszukaj funkcję na liście pośrodku i kliknij ją dwukrotnie, aby ją wstawić. Zawsze sprawdź wiersz Preview pod edytorem przed kliknięciem OK. Jeśli pokazuje błąd, NULL albo liczbę w rodzaju 0.0000003, popraw wyrażenie, zanim zapiszesz je w 8000 wierszy.

Kliknij OK i zapisz zmiany

Kliknij OK. Jeśli warstwa nie była w trybie edycji, QGIS ostrzeże, że włączy go automatycznie. Po zakończeniu obliczeń kliknij ikonę dyskietki Save Edits na pasku narzędzi tabeli atrybutów, aby kolumna została zapisana na dysku.

Oto okno na warstwie dróg, gotowe do zapisania klasy drogi:

Okno Field Calculator w QGIS na warstwie dróg Bengaluru, z zaznaczoną opcją Only update 39 selected features, nowym polem tekstowym road_rank, wyrażeniem CASE WHEN klasyfikującym drogi primary i secondary jako arterial oraz Preview pokazującym arterial.
Okno Field Calculator w QGIS 3.44. Zwróć uwagę na pole wyboru w lewym górnym rogu: ponieważ na mapie zaznaczono 39 dróg, obliczonych zostanie tylko tych 39 wierszy.

Gdy nie znasz nazwy funkcji, użyj pola wyszukiwania nad środkową kolumną. Filtruje ono drzewo funkcji i otwiera dokumentację po prawej, łącznie z kolejnością parametrów i przykładami.

Konstruktor wyrażeń Field Calculator w QGIS na warstwie okręgów, z wyszukiwaniem overlay_contains na liście funkcji, prawym panelem pokazującym składnię i argumenty overlay_contains oraz podglądem zwracającym 18.
Wyszukiwanie overlay_contains na liście funkcji. Preview na dole pokazuje 18 szkół w zaznaczonym okręgu, zanim uruchomisz obliczenie.

Przetestowany zbiór wyrażeń

Każde wyrażenie poniżej uruchomiłem w QGIS 3.44.15 7 listopada 2026 roku na naszych warstwach OpenStreetMap z Bengaluru (zapisanych w EPSG:4326, elipsoida projektu WGS 84). Jeśli potrzebujesz danych testowych dla własnego obszaru, nasz poradnik jak pobrać dane OpenStreetMap w QGIS pokazuje, jak czysto pobrać budynki, drogi i punkty.

Przykładowe wyniki dla budynków pochodzą z budynków fid 27, 28, 30, 60 i 62 (które mają adresy i liczbę kondygnacji) oraz fid 1, 2 i 3 (które nie mają ani jednego, ani drugiego).

Powierzchnia, długość, obwód i współrzędne

Czego potrzebujeszWyrażenie do wklejeniaWynik testu na próbceTypowa błędna wersja (i co się dzieje)
Powierzchnia budynku w m² (elipsoidalna)$area197.35, 110.86, 141.11, 219.71, 318.83area($geometry) zwraca 0.0 (około 3e-7 stopnia kwadratowego), bez błędu
Powierzchnia budynku w m² (rzutowana w UTM 43N)area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))197.60, 110.99, 141.29, 219.98, 319.22Przekształcenie do 'EPSG:3857' (Web Mercator) zawyża tu powierzchnię o +5,95%
Długość drogi w metrach (elipsoidalna)$length616.34, 7.99, 1104.32, 9.14, 72.24length($geometry) zwraca 0.005681, 0.000074 (stopnie), bez błędu
Długość drogi w metrach (rzutowana w UTM 43N)length(transform($geometry, 'EPSG:4326', 'EPSG:32643'))616.72, 7.99, 1105.01, 9.14, 72.29Przekształcenie do 'EPSG:3857' zawyża długość dróg o +3,03% (mediana)
Obwód budynku w metrach$perimeter56.72, 44.97, 48.60, 61.54, 72.69perimeter($geometry) zwraca stopnie na warstwie EPSG:4326
X centroidu poligonu (Easting w metrach)x(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))786714.46, 786437.79, 786237.28$x na poligonie zwraca NULL bez błędu; x_at($geometry, 0) zwraca pierwszy wierzchołek (77.642744), a nie środek
Y centroidu poligonu (Northing w metrach)y(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))1435359.45, 1435116.32, 1436699.32y(centroid($geometry)) zwraca stopnie (12.97...), gdy warstwa jest w EPSG:4326
Numer wiersza lub ID obiektu@row_number lub $id1, 2, 3, 4 (okno) lub 27 dla $id na fid 27@row_number zaczyna się od 1 w oknie GUI, ale od 0 w Processing native:fieldcalculator

Jeśli zapiszesz $area do pola wynikowego Integer zamiast Decimal number (real) (testowane z narzędziem Processing Field calculator), QGIS zaokrągla do najbliższej liczby całkowitej (197.35 staje się 197, 110.86 staje się 111), zamiast obcinać część dziesiętną.

Klasy warunkowe (CASE WHEN i obsługa NULL)

Czego potrzebujeszWyrażenie do wklejeniaWynik testu na próbceTypowa błędna wersja (i co się dzieje)
Klasa wielkości z powierzchniCASE WHEN $area < 100 THEN 'small' WHEN $area < 250 THEN 'medium' ELSE 'large' ENDmedium, medium, medium, medium, largeNie testowano
Zastąpienie NULL w liczbie kondygnacji domyślną liczbą całkowitącoalesce(to_int("building:levels"), 1)4, 4, 2, 4, 3 (oraz 1 tam, gdzie kondygnacje są NULL)"building:levels" + 'a' zwraca '4a', bo tagi OSM są zapisane jako tekst
Klasa wysokości z osobną kategorią dla NULLCASE WHEN to_int("building:levels") IS NULL THEN 'unknown' WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' ENDmid, mid, low, mid, mid (oraz unknown dla fid 1)Pominięcie WHEN ... IS NULL wysyła każdy pusty wiersz do ELSE i oznacza 7636 budynków bez danych jako 'high'

Czyszczenie tekstu, formatowanie i daty

Czego potrzebujeszWyrażenie do wklejeniaWynik testu na próbceTypowa błędna wersja (i co się dzieje)
Bezpieczne połączenie numeru domu i ulicyconcat("addr:housenumber", ' ', "addr:street")'594 12th Main Road', '83/4 13th Main Road' (' ', gdy oba są NULL)"addr:housenumber" || ' ' || "addr:street" zwraca NULL, jeśli którakolwiek kolumna jest NULL
Usunięcie przyrostka (Road, Main, Cross) z nazwy drogiregexp_replace("name", '\\s+(Road|Main|Cross)$', '')'Chinmaya Mission Hospital', '13th Main', '12th Main'Pojedynczy ukośnik wsteczny \s+ kończy się błędem Invalid regular expression '?+(Road|Main|Cross)$'
Uzupełnienie ID zerami do 12 cyfrlpad(to_string("osm_id"), 12, '0')'000313829229', '000313835091'Nie testowano
Formatowanie liczby do wyświetleniaformat_number($area, 1)'197,4', '110,9' ('3 958,7' dla 3958.7 na Macu z przecinkiem dziesiętnym)Wynik to tekst zgodny z ustawieniami regionalnymi systemu (przecinek dziesiętny i wąska spacja nierozdzielająca), więc nie da się potem na nim liczyć
Liczba dni między dwiema datamiday(age(to_date('2026-11-07'), to_date('2019-03-15')))2794Samo age(...) zwraca obiekt QgsInterval; to_date('07/11/2026') kończy się błędem, jeśli nie podasz 'dd/MM/yyyy' jako drugiego argumentu

Pilnuj też długości pola wynikowego, gdy zapisujesz tekst do GeoPackage lub Shapefile. Gdy w Processing uruchomiłem concat("addr:housenumber", ' ', "addr:street") do pola tekstowego o długości 40, całe zadanie przerwało się bez wyniku, bo jedna droga (" 80 Feet Road(Sir C.V. Raman Hospital Road)") miała 43 znaki.

Zliczenia przestrzenne, sumy i najbliższa odległość między warstwami

Te wyrażenia pozwalają jednej warstwie odpytywać inną warstwę projektu bez osobnego złączenia przestrzennego w QGIS.

Czego potrzebujeszWyrażenie do wklejeniaWynik testu na próbceTypowa błędna wersja (i co się dzieje)
Liczba budynków stykających się z każdym okręgiemaggregate('buildings', 'count', "osm_id", filter:=intersects($geometry, geometry(@parent)))4, 1552, 336, 3141, 79, 402, 1179, 348, 1539, 139Bez filter:=... każdy okręg dostaje łączną liczbę z całej warstwy (8709), bez błędu
Łączna powierzchnia budynków w ha na okręground(aggregate('buildings', 'sum', $area, filter:=intersects($geometry, geometry(@parent))) / 10000, 3)0.565, 20.292, 5.605, 59.116, 1.037, 14.094, 16.646, 7.991, 21.39, 1.7Sumuje pełne obrysy stykające się z granicą okręgu, więc budynki graniczne liczą się w obu okręgach
Liczba szkół w każdym okręguarray_length(overlay_contains('schools', "osm_id"))0, 2, 3, 18, 0, 0, 7, 3, 2, 0 (suma: 35)overlay_contains('schools') bez drugiego argumentu zwraca true lub false, a nie liczbę
Odległość w metrach do najbliższego przystankudistance(transform($geometry, 'EPSG:4326', 'EPSG:32643'), transform(array_first(overlay_nearest('bus_stops', $geometry)), 'EPSG:4326', 'EPSG:32643'))125.17, 49.39, 199.59, 158.39, 187.97, 74.67, 123.00, 226.61distance($geometry, array_first(overlay_nearest('bus_stops', $geometry))) zwraca 0.001142 (stopnie)
Liczba przystanków w promieniu 300 m od budynkuaggregate('bus_stops', 'count', "osm_id", filter:=distance(transform($geometry, 'EPSG:4326', 'EPSG:32643'), transform(geometry(@parent), 'EPSG:4326', 'EPSG:32643')) <= 300)1, 1, 4, 2, 2, 6, 7, 7array_length(overlay_nearest('bus_stops', $id, max_distance:=300, limit:=-1)) zwraca 37 (każdy przystanek), bo 300 jest czytane jako 300 stopni

Pięć pułapek kalkulatora pól, które zawodzą bez błędu

Przeczytałem 70 komentarzy z prośbą o pomoc pod samouczkami QGIS na YouTube: 48 to były prawdziwe pytania o pisanie wyrażeń, a 8 z nich dotyczyło wyrażenia, które jest niepoprawne, zwraca NULL lub nic nie zaznacza. Gorszy jest przypadek, o który nikt nie pyta, bo wyrażenie działa i zapisuje wiarygodnie wyglądające liczby. Oto pięć pułapek zmierzonych na naszych danych z Bengaluru.

1. $area kontra area($geometry) i rola elipsoidy projektu

$area i area($geometry) nie wykonują tego samego obliczenia, a co najmniej jeden samouczek z 2026 roku twierdzi, że $area zwraca stopnie kwadratowe w geograficznym układzie odniesienia. Nie zwracało ich w żadnym z ustawień projektu, które przetestowaliśmy. 7 listopada 2026 roku zmierzyliśmy obie funkcje, a także transform(), na pierwszych 200 budynkach i 200 drogach w naszych warstwach EPSG:4326 z Bengaluru, względem elipsoidalnego wzorca WGS 84 (QgsDistanceArea).

  • $area i $length używają elipsoidy projektu (ustawianej w Project > Properties > General > Measurements). Gdy elipsoida to WGS 84, $area zwraca dokładne metry kwadratowe, nawet gdy warstwa i projekt są w stopniach (EPSG:4326).
  • Gdy elipsoida projektu jest ustawiona na None / Planimetric, $area na naszej warstwie EPSG:4326 nadal nie zwracało stopni kwadratowych. W QGIS 3.44.15 zwróciło metry kwadratowe zawyżone o +3,24% na 200 budynkach.
  • area($geometry) i length($geometry) są zawsze planimetryczne we własnym układzie warstwy. Na warstwie EPSG:4326 area($geometry) zwraca stopnie kwadratowe (około 0.0000003 dla domu), co w standardowej kolumnie dziesiętnej zaokrągla się do 0.0.
  • Przekształcenie do Web Mercator (EPSG:3857) przed area() zawyża każdy budynek o +5,95% nawet na szerokości Bengaluru (13° N), a długość dróg o +3,03%. Przekształcenie do lokalnej strefy UTM (EPSG:32643) mieści się w +0,12% od powierzchni elipsoidalnej.
Wyrażenie na warstwach EPSG:4326 (n = 200 budynków, 200 dróg)Mediana błędu względem elipsoidy WGS 84Błąd maksymalny
$area (elipsoida projektu WGS 84)0.00%0.00%
$area (elipsoida projektu None)+3.24%+3.25%
$perimeter (elipsoida projektu None)+1.72%+2.25%
$length na drogach (elipsoida projektu None)+1.31%+2.61%
area($geometry)-100.00% (stopnie kwadratowe)-100.00%
length($geometry) na drogach-100.00% (stopnie)-100.00%
area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))+0.12%+0.12%
length(transform($geometry, 'EPSG:4326', 'EPSG:32643')) na drogach+0.06%+0.06%
area(transform($geometry, 'EPSG:4326', 'EPSG:3857'))+5.95%+5.96%
length(transform($geometry, 'EPSG:4326', 'EPSG:3857')) na drogach+3.03%+3.26%

Jeśli nie wiesz, dlaczego EPSG:4326, EPSG:3857 i strefy UTM zachowują się tak różnie, przeczytaj nasze wyjaśnienie czym jest układ odniesienia (CRS) w QGIS.

2. overlay_nearest czyta max_distance w jednostkach warstwy, a nie w metrach

Funkcja overlay_nearest jest szybka, bo korzysta z indeksu przestrzennego, i ma wygodny parametr max_distance. Ale max_distance jest zawsze mierzony w jednostkach współrzędnych warstwy.

Gdy nasze budynki i przystanki są w EPSG:4326 (stopnie) i napiszesz array_length(overlay_nearest('bus_stops', $id, max_distance:=300, limit:=-1)), QGIS szuka przystanków w promieniu 300 stopni. To obejmuje całą Ziemię, więc każdy budynek dostaje 37 (wszystkie 37 przystanków w warstwie). Zgadywanie max_distance:=0.003 jako 300 metrów też nie działa czysto, bo stopień długości i stopień szerokości geograficznej nie mają tej samej długości w metrach: na budynku fid 62 0.003 zwróciło 8 przystanków zamiast prawdziwych 7. Albo najpierw przerzutuj obie warstwy do UTM, albo użyj wzorca aggregate(..., filter:=distance(transform(...))) z ostatniego wiersza tabeli przestrzennej powyżej.

3. Wiersze NULL wpadają prosto do gałęzi ELSE w CASE WHEN

W naszym zbiorze danych z Bengaluru tylko 1073 z 8709 budynków (12,3%) ma tag building:levels. Pozostałe 7636 to NULL.

Jeśli napiszesz CASE WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' END, oba porównania <= dają na wierszu NULL wynik nieokreślony i wiersz trafia do ELSE. W efekcie klasyfikujesz 7636 budynków bez danych jako wieżowce bez żadnego ostrzeżenia. Gdy dane mają luki, zawsze dawaj WHEN "field" IS NULL THEN 'unknown' jako pierwszą gałąź (albo pomiń ELSE, aby niedopasowane wiersze zostały NULL).

4. „Only update selected features” zostawia resztę kolumny jako NULL

Gdy na mapie jest zaznaczony choćby jeden obiekt, Field Calculator automatycznie zaznacza Only update N selected feature(s).

Gdy zaznaczyłem 39 dróg primary w Bengaluru i uruchomiłem CASE WHEN "highway" IN ('primary', 'secondary') THEN 'arterial' ELSE 'local' END do nowego pola road_rank, QGIS zapisał 'arterial' w tych 39 wierszach, a pozostałe 815 dróg (w tym wszystkie 28 dróg secondary, które moje wyrażenie wprost wymieniało) zostawił jako NULL.

Tabela atrybutów QGIS dla warstwy dróg po uruchomieniu Field Calculator z zaznaczonymi 39 drogami primary: wiersze primary mają road_rank równe arterial, wiersze secondary i residential pokazują NULL, a row_n pokazuje 1, 2, 3 z @row_number.
Ponieważ przy otwarciu okna zaznaczonych było 39 dróg primary, 28 dróg secondary i 787 dróg lokalnych wyszło jako NULL, choć wyrażenie CASE je obsługiwało.

5. Cudzysłów podwójny kontra pojedynczy (dlaczego "building" = "yes" zwraca NULL)

W wyrażeniach QGIS podwójny cudzysłów " " oznacza nazwę pola, a pojedynczy cudzysłów ' ' oznacza wartość tekstową.

Jeśli wpiszesz "building" = "yes", QGIS szuka kolumny o nazwie building i porównuje ją z inną kolumną o nazwie yes. Ponieważ kolumny yes nie ma, wyrażenie daje NULL (a parser QgsExpression zgłasza Field 'yes' not found). Podobnie, jeśli nazwa kolumny zawiera dwukropek, jak building:levels z OpenStreetMap, pominięcie podwójnego cudzysłowu kończy się błędem syntax error, unexpected Unknown_CHARACTER. Dwukrotne kliknięcie nazwy pola na liście Fields and Values za każdym razem wstawia właściwy cudzysłów.

Bez składni: te same obliczenia z agentem AI

Napisanie $area ręcznie jest szybkie. Napisanie zagnieżdżonego aggregate() z dwoma wywołaniami transform(), odwołaniem do geometrii @parent i filtrem odległości to moment, w którym ludzie lądują na Stack Exchange.

Tworzymy AI Agent, panel czatu dokowany w QGIS, więc ta sekcja dotyczy naszego własnego narzędzia. Ponieważ działa w otwartym projekcie QGIS, sprawdza nazwy warstw, typy pól, układ odniesienia i unikalne wartości, zanim uruchomi za ciebie Field Calculator lub narzędzia Processing.

7 listopada 2026 roku dałem AI Agent (v1.9.4, wysiłek Medium, uprawnienia Balanced) trzy wieloetapowe obliczenia z naszego planu testów, jedno zdanie na czat, na tych samych pięciu warstwach z Bengaluru w EPSG:4326.

ZadanieDokładny wysłany promptCzas agentaWynik względem naszej niezależnej kontroli
A. Zliczenie w pobliżu"Add a field called bus_stops_300m to the buildings layer with the number of bus stops within 300 metres of each building."39 sZaliczone. Utworzone pole całkowitoliczbowe, wszystkie 8709 budynków wypełnione, 0 rozbieżności względem naszego zliczenia od obrysu do przystanku w EPSG:32643 (zakres od 0 do 8).
B. Klasyfikacja i stylizacja"Class the buildings into low (1 or 2 levels), mid (3 or 4) and high (5 or more) from the building:levels field, store the class in a new field called height_class, and style the buildings by that class."18 sZaliczone. 563 low, 442 mid, 68 high (wszystkie 1073 zgodne z naszą regułą). 7636 wierszy bez kondygnacji zostało jako NULL i dostało styl czwartej, szarej kategorii "Unknown levels".
C. Liczba szkół i powierzchnia budynków na okręg"For each ward, add the number of schools and the total building area in hectares."37 sZaliczone (z inną metodą). school_count zgodne w 10/10 okręgów (łącznie 35). building_ha zgodne z przyciętymi powierzchniami obrysów w 10/10 okręgów (łącznie 148,25 ha).

W zadaniu A agent nie wpadł w pułapkę 300 stopni w overlay_nearest. Jego dziennik narzędzi pokazuje, że sprawdził obie warstwy, zweryfikował układ odniesienia, wykonał obliczenie w jednostkach metrycznych na podstawie obrysów budynków (a nie centroidów, co zmieniłoby wynik dla 667 budynków) i sprawdził wartości minimalne i maksymalne przed odpowiedzią.

Panel AI Agent w QGIS po dodaniu pola bus_stops_300m do 8709 budynków w Bengaluru, podający liczby od 0 do 8 bez brakujących wartości i zaznaczający odległości w linii prostej od obrysu każdego budynku do 37 przystanków.
Zadanie A w AI Agent: 39 sekund na obliczenie liczby przystanków w promieniu 300 m dla 8709 budynków w projekcie EPSG:4326, bez pułapki stopni.

W zadaniu B najpierw sprawdził unikalne wartości building:levels, zobaczył, że 7636 z 8709 budynków nie ma liczby kondygnacji, zostawił te wiersze jako NULL w height_class, zamiast pozwolić im wpaść do high, i zastosował na mapie styl kategoryzowany z 4 klasami.

Panel AI Agent i panel Layers w QGIS z polem height_class skategoryzowanym na low, mid, high i Unknown levels, z odpowiedzią podającą 563 budynki low, 442 mid, 68 high i 7636 nieznanych.
Zadanie B: agent najpierw sprawdził kolumnę, nie dopuścił, by 7636 budynków bez danych trafiło do gałęzi ELSE, i nadał styl wszystkim czterem grupom.

Wyrenderowana mapa od razu pokazuje, dlaczego sprawdzanie NULL ma znaczenie przy danych OpenStreetMap: szare budynki to 87,7%, które nie mają zapisanego tagu building:levels.

Wyrenderowana mapa QGIS centralnego Indiranagar w Bengaluru, z budynkami w kolorze jasnożółtym dla low, pomarańczowym dla mid, ciemnoczerwonym dla high i szarym dla nieznanej liczby kondygnacji, z nałożonymi drogami i czarnymi kropkami przystanków.
Centralne Indiranagar według height_class: 563 low (żółte), 442 mid (pomarańczowe), 68 high (czerwone) i 7636 bez tagu kondygnacji w OSM (szare).

W zadaniu C wartości building_ha agenta nieznacznie różniły się od wiersza z hektarami na okręg w naszym zbiorze wyrażeń: New Thippasandra wyszło 20.151 ha zamiast 20.292 ha (-0,69%), Jeevan Bhimanagar -0.14%, a Indiranagar -0.06%. Gdy sprawdziłem dlaczego, okazało się, że agent użył bardziej rygorystycznej metody geometrycznej niż mój filtr intersects(): przyciął poligony budynków do granic okręgów przed zsumowaniem ich powierzchni, więc budynki leżące na granicy nie były liczone podwójnie w dwóch okręgach, i zaznaczył to w odpowiedzi. Zostawił za to warstwę okręgów w trybie edycji z niezatwierdzonymi zmianami, informując mnie w odpowiedzi, że zmiany nie zostały jeszcze zapisane.

Panel AI Agent w QGIS podający school_count i building_ha dla każdego z 10 okręgów Bengaluru, z informacją, że obrysy przycięto do granic okręgów i że zmiany nie są jeszcze zapisane.
Zadanie C: agent przyciął budynki leżące na granicy do granic okręgów przed zsumowaniem hektarów i zaznaczył, że zmiany w warstwie nie są jeszcze zatwierdzone.

Oto wynikowa tabela atrybutów warstwy okręgów po zatwierdzeniu tych zmian:

Tabela atrybutów QGIS dla 10 okręgów Bengaluru z nową kolumną całkowitoliczbową school_count i kolumną dziesiętną building_ha obok nazw okręgów, takich jak Domlur, Indiranagar, New Thippasandra i Ulsoor.
10 okręgów z dodanymi polami school_count (łącznie 35) i building_ha (łącznie 148,25 ha).

Trzy zadania to mała próba (n = 3), a moje prompty były jasne i podawały nazwy pól oraz granice klas, więc traktuj to jako demonstrację, a nie benchmark. Przy prostych formułach, takich jak $area czy concat(), okno Field Calculator jest szybsze niż pisanie wiadomości na czacie. Agent pokazuje swoją wartość, gdy potrzebujesz agregatów między warstwami, przekształceń układu odniesienia lub wieloetapowych łańcuchów Processing, albo gdy w przeciwnym razie musiałbyś napisać skrypt PyQGIS. Innych asystentów możesz porównać w naszym centrum QGIS AI.

Jak to zmierzyliśmy. Wszystkie testy przeprowadzono 7 listopada 2026 roku w QGIS 3.44.15-Solothurn na macOS z danymi OpenStreetMap dla Indiranagar w Bengaluru (zasięg 12.968, 77.634, 12.986, 77.656, ODbL) w układzie projektu EPSG:4326. Każde wyrażenie ze zbioru sprawdzono względem niezależnego obliczenia w Pythonie lub QgsDistanceArea na tych samych ID obiektów. Błędy powierzchni i długości zmierzono na pierwszych 200 budynkach i 200 drogach według fid względem QgsDistanceArea z elipsoidą WGS 84 (EPSG:7030). AI Agent 1.9.4 działał z wysiłkiem Medium i uprawnieniami Balanced, w nowym czacie dla każdego zadania. Liczby pytań z YouTube pochodzą z 70 komentarzy z prośbą o pomoc pod 59 filmami, wyfiltrowanych z korpusu 25 276 komentarzy.

Najczęściej zadawane pytania

Dlaczego obliczenie $area w QGIS jest błędne lub zwraca 0?

Najpierw sprawdź, czy nie wpisałeś area($geometry) zamiast $area. Na warstwie zapisanej w stopniach (EPSG:4326) area($geometry) zwraca stopnie kwadratowe (około 0.0000003 dla domu), co w polu dziesiętnym zaokrągla się do 0.0. Użyj $area z elipsoidą projektu ustawioną na WGS 84 w Project > Properties > General > Measurements albo przerzutuj geometrię w wyrażeniu przez area(transform($geometry, 'EPSG:4326', 'EPSG:32643')) z własną lokalną strefą UTM. Unikaj EPSG:3857 (Web Mercator), który w naszym teście zawyżył powierzchnię budynków o +5,95% nawet na 13° N.

Jak napisać instrukcję IF lub CASE w kalkulatorze pól QGIS?

Dla dwóch wyników użyj if(condition, value_if_true, value_if_false), na przykład if($area < 100, 'small', 'large'). Dla trzech lub więcej klas użyj CASE WHEN ... THEN ... ELSE ... END:

CASE WHEN to_int("building:levels") IS NULL THEN 'unknown' WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' END

Sprawdzenie IS NULL umieść na początku. W przeciwnym razie każdy wiersz z pustą wartością trafi do ELSE.

Dlaczego Field Calculator zwrócił NULL dla wszystkich lub większości wierszy?

Cztery typowe przyczyny:

  1. Na mapie był zaznaczony obiekt, więc opcja Only update N selected feature(s) była zaznaczona i zostawiła każdy niezaznaczony wiersz jako NULL.
  2. Połączyłeś tekst przez || (na przykład "addr:housenumber" || ' ' || "addr:street"), gdzie jedna wartość NULL zamienia cały wynik w NULL. Użyj zamiast tego concat().
  3. Ująłeś wartość tekstową w podwójny cudzysłów ("building" = "yes"), co każe QGIS szukać kolumny o nazwie yes. Dla wartości używaj pojedynczego cudzysłowu ("building" = 'yes').
  4. Użyłeś $x lub $y na warstwie poligonowej lub liniowej. $x działa tylko na punktach; dla poligonów użyj x(centroid($geometry)).

Jak obliczyć powierzchnię w hektarach w kalkulatorze pól QGIS?

Ustaw Output field type na Decimal number (real), ustaw Precision na 2 lub 3 i wpisz $area / 10000 (zakładając, że jednostki powierzchni projektu to metry kwadratowe, a elipsoida projektu jest ustawiona w Project > Properties > General). Aby zaokrąglić samą zapisaną wartość do 3 miejsc po przecinku, użyj round($area / 10000, 3).

Jak zaktualizować tylko zaznaczone obiekty w kalkulatorze pól?

Najpierw zaznacz obiekty na mapie lub w tabeli atrybutów, a potem otwórz Field Calculator (Ctrl+I). Pole wyboru Only update N selected feature(s) w lewym górnym rogu zostanie zaznaczone automatycznie. Wybierz Update existing field, wybierz kolumnę z listy rozwijanej, wpisz wyrażenie i kliknij OK.

Wypróbuj AI Agent za darmo

Zrób to w QGIS, po prostu o to prosząc

AI Agent wykonuje zadanie, które opiszesz, w Twoim własnym projekcie QGIS. Za darmo, bez karty.

Wypróbuj AI Agent za darmo
Napisane przezYvann Barbot
·20 min read