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
fid27 w warstwie testowej, jego zwykła kolumna powierzchni została na197.355, a pole wirtualne zmieniło się na789.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ę od0, a w oknie od1. - 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:

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.

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 potrzebujesz | Wyrażenie do wklejenia | Wynik testu na próbce | Typowa błędna wersja (i co się dzieje) |
|---|---|---|---|
| Powierzchnia budynku w m² (elipsoidalna) | $area | 197.35, 110.86, 141.11, 219.71, 318.83 | area($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.22 | Przekształcenie do 'EPSG:3857' (Web Mercator) zawyża tu powierzchnię o +5,95% |
| Długość drogi w metrach (elipsoidalna) | $length | 616.34, 7.99, 1104.32, 9.14, 72.24 | length($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.29 | Przekształcenie do 'EPSG:3857' zawyża długość dróg o +3,03% (mediana) |
| Obwód budynku w metrach | $perimeter | 56.72, 44.97, 48.60, 61.54, 72.69 | perimeter($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.32 | y(centroid($geometry)) zwraca stopnie (12.97...), gdy warstwa jest w EPSG:4326 |
| Numer wiersza lub ID obiektu | @row_number lub $id | 1, 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 potrzebujesz | Wyrażenie do wklejenia | Wynik testu na próbce | Typowa błędna wersja (i co się dzieje) |
|---|---|---|---|
| Klasa wielkości z powierzchni | CASE WHEN $area < 100 THEN 'small' WHEN $area < 250 THEN 'medium' ELSE 'large' END | medium, medium, medium, medium, large | Nie 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 NULL | 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 | mid, 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 potrzebujesz | Wyrażenie do wklejenia | Wynik testu na próbce | Typowa błędna wersja (i co się dzieje) |
|---|---|---|---|
| Bezpieczne połączenie numeru domu i ulicy | concat("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 drogi | regexp_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 cyfr | lpad(to_string("osm_id"), 12, '0') | '000313829229', '000313835091' | Nie testowano |
| Formatowanie liczby do wyświetlenia | format_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 datami | day(age(to_date('2026-11-07'), to_date('2019-03-15'))) | 2794 | Samo 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 potrzebujesz | Wyrażenie do wklejenia | Wynik testu na próbce | Typowa błędna wersja (i co się dzieje) |
|---|---|---|---|
| Liczba budynków stykających się z każdym okręgiem | aggregate('buildings', 'count', "osm_id", filter:=intersects($geometry, geometry(@parent))) | 4, 1552, 336, 3141, 79, 402, 1179, 348, 1539, 139 | Bez filter:=... każdy okręg dostaje łączną liczbę z całej warstwy (8709), bez błędu |
| Łączna powierzchnia budynków w ha na okręg | round(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.7 | Sumuje 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ęgu | array_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 przystanku | distance(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.61 | distance($geometry, array_first(overlay_nearest('bus_stops', $geometry))) zwraca 0.001142 (stopnie) |
| Liczba przystanków w promieniu 300 m od budynku | aggregate('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, 7 | array_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).
$areai$lengthużywają elipsoidy projektu (ustawianej wProject > Properties > General > Measurements). Gdy elipsoida toWGS 84,$areazwraca dokładne metry kwadratowe, nawet gdy warstwa i projekt są w stopniach (EPSG:4326).- Gdy elipsoida projektu jest ustawiona na
None / Planimetric,$areana naszej warstwieEPSG:4326nadal 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)ilength($geometry)są zawsze planimetryczne we własnym układzie warstwy. Na warstwieEPSG:4326area($geometry)zwraca stopnie kwadratowe (około0.0000003dla domu), co w standardowej kolumnie dziesiętnej zaokrągla się do0.0.- Przekształcenie do Web Mercator (
EPSG:3857) przedarea()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 84 | Błą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.

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.
| Zadanie | Dokładny wysłany prompt | Czas agenta | Wynik 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 s | Zaliczone. 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 s | Zaliczone. 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 s | Zaliczone (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ą.

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.

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.

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.

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

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:
- 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. - Połączyłeś tekst przez
||(na przykład"addr:housenumber" || ' ' || "addr:street"), gdzie jedna wartośćNULLzamienia cały wynik wNULL. Użyj zamiast tegoconcat(). - Ująłeś wartość tekstową w podwójny cudzysłów (
"building" = "yes"), co każe QGIS szukać kolumny o nazwieyes. Dla wartości używaj pojedynczego cudzysłowu ("building" = 'yes'). - Użyłeś
$xlub$yna warstwie poligonowej lub liniowej.$xdziała tylko na punktach; dla poligonów użyjx(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.
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.
, otwórz tabelę atrybutów warstwy, kliknij ikonę Field Calculator (Kalkulator pól, 

