Co to jest shapefile i jakich plików potrzebuje?

Shapefile to wektorowy format GIS stworzony przez Esri na początku lat 90. To grupa plików o jednej nazwie: .shp przechowuje geometrię, .shx indeks, a .dbf atrybuty. Plik .prj podaje układ współrzędnych, a .cpg kodowanie tekstu. FileReshape pozwala obejrzeć shapefile albo przekonwertować go do GeoJSON, KML lub GeoPackage w Twojej przeglądarce, bez wysyłania go na serwer.

Skąd wziął się shapefile

Esri wprowadziło shapefile na początku lat 90. wraz ze swoim programem ArcView jako prosty sposób na przechowywanie punktów, linii i poligonów razem z tabelą atrybutów. W 1998 roku Esri opublikowało ESRI Shapefile Technical Description, dokument techniczny opisujący budowę plików geometrii i indeksu. Ponieważ opis był publiczny, a format prosty, inne programy mogły go odczytywać i zapisywać bez licencji, a shapefile stał się wspólnym formatem wymiany danych w programach GIS.

To nadal jego główna zaleta. Rządowe portale otwartych danych, geodeci, biura planowania i firmy infrastrukturalne publikują pliki shapefile, bo odczyta je niemal każdy program GIS, od QGIS i ArcGIS Pro po GDAL, narzędzia do wczytywania danych do PostGIS i wiele programów CAD. Format zdradza jednak swój wiek, a opisane niżej ograniczenia są powodem, dla którego powstały nowsze formaty.

Pliki, z których składa się shapefile

Shapefile to zestaw plików o wspólnej nazwie bazowej, np. parcels.shp, parcels.shx i parcels.dbf. Trzy z nich są obowiązkowe. Plik .shp przechowuje geometrię każdego obiektu jako listę współrzędnych. Plik .shx to indeks z położeniem każdego rekordu w pliku .shp, dzięki któremu programy mogą przejść od razu do obiektu numer 5000, zamiast czytać wszystko, co jest przed nim. Plik .dbf to tabela atrybutów w formacie dBASE, z jednym wierszem na obiekt, w tej samej kolejności co kształty. Powiązanie kształtu z jego wierszem to nic innego jak właśnie ta kolejność.

Pozostałe pliki są opcjonalne. Plik .prj zawiera układ współrzędnych jako wiersz tekstu WKT (well-known text) w dialekcie używanym przez Esri. Plik .cpg to malutki plik tekstowy z nazwą kodowania znaków w pliku .dbf, np. UTF-8 lub 1252. Pliki .sbn i .sbx to indeks przestrzenny używany przez oprogramowanie Esri, a .qix to inny indeks przestrzenny, zapisywany przez GDAL i MapServer; oba jedynie przyspieszają rysowanie i wyszukiwanie w dużych plikach. Plik .shp.xml zawiera metadane, takie jak opis, autor i data. Możesz też spotkać pliki .atx z indeksami atrybutów. Gdy brakuje pliku opcjonalnego, programy nadal odczytają dane, ale bez .prj położenie jest zgadywaniem, a bez .cpg mogą się zepsuć znaki specjalne.

Nazwy bazowe muszą się dokładnie zgadzać, łącznie z wielkością liter w systemach, które ją rozróżniają. Zmiana nazwy samego roads.shp na streets.shp rozbija zestaw. Zmieniaj nazwy, kopiuj i wysyłaj wszystkie części razem, a najprostszy sposób na trzymanie ich razem to .zip z całym zestawem.

Jeden typ geometrii na shapefile

Każdy shapefile deklaruje w nagłówku jeden typ kształtu, a każdy obiekt musi być tego typu lub pusty. Główne typy to Point, MultiPoint, PolyLine (linie) i Polygon, każdy w zwykłej wersji 2D, w wersji z wartościami Z dla wysokości i w wersji z wartościami M dla miar, np. odległości wzdłuż trasy. Rzadko używany typ MultiPatch opisuje powierzchnie 3D. Plik nie może mieszać punktów z poligonami, więc zbiór danych z budynkami i ich wejściami trzeba zapisać jako dwa pliki shapefile.

Poligony są zapisywane jako pierścienie. Według opublikowanego opisu zewnętrzna granica biegnie zgodnie z ruchem wskazówek zegara, a otwory przeciwnie, natomiast poligon z kilkoma oddzielnymi częściami, np. kraj z wyspami, to jeden obiekt z kilkoma pierścieniami. Format nie przechowuje topologii: dwie sąsiednie działki zapisują wspólną granicę każda osobno i nic w pliku nie gwarantuje, że linie się pokrywają.

Ograniczenia tabeli atrybutów .dbf

Wiele dziwactw formatu shapefile wynika z formatu tabel dBASE, który pochodzi z lat 80. Nazwy pól mogą mieć najwyżej 10 znaków, więc Population_2020 musi stać się czymś w rodzaju POP_2020, a niektóre programy dodatkowo zamieniają je na wielkie litery. Pola tekstowe mieszczą najwyżej 254 znaki. Ograniczona jest też liczba pól; zwykle podaje się 255.

Typów danych jest niewiele. Tekst jest przechowywany w polach znakowych o stałej szerokości, liczby w polach liczbowych lub zmiennoprzecinkowych o stałej szerokości i liczbie miejsc po przecinku, prawda i fałsz w polach logicznych, a daty w polach dat w postaci rok, miesiąc, dzień. Nie ma godziny ani strefy czasowej, więc znacznik czasu trzeba zapisać jako tekst albo rozbić na kilka pól. Nie ma też prawdziwej wartości pustej (null): pusta liczba jest zwykle zapisywana jako spacje lub zero, zależnie od programu, a niektóre programy pokazują wtedy 0 tam, gdzie wartość była w rzeczywistości nieznana. Nie ma list, wartości zagnieżdżonych ani pól binarnych.

Limity rozmiaru pliku

Nagłówki plików .shp i .shx zapisują przesunięcia i długości jako liczby 32-bitowe, stąd typowa zasada, że każda część pliku shapefile, zwłaszcza .shp i .dbf, musi mieć mniej niż 2 GB. Niektóre programy, w tym GDAL, potrafią na żądanie odczytywać i zapisywać pliki do około 4 GB, ale inne oprogramowanie może je odrzucić. Większy zbiór danych trzeba podzielić na kilka plików shapefile albo zapisać w innym formacie. W praktyce to plik .dbf często pierwszy dochodzi do limitu, bo każde pole tekstowe zajmuje w każdym wierszu pełną szerokość, nawet gdy większość wartości jest krótka.

Kodowanie tekstu i plik .cpg

Format .dbf jest starszy niż Unicode. Tekst jest przechowywany jako bajty, a nagłówek ma jeden bajt, często nazywany identyfikatorem sterownika języka (language driver ID), który może wskazywać stronę kodową, np. Windows-1252 lub stronę kodową DOS. Wiele programów zostawia go pustym albo ustawia błędnie. Plik .cpg dodano później, aby jasno podawać kodowanie, a nowoczesne oprogramowanie zapisuje UTF-8 razem z plikiem .cpg, który to określa.

Gdy ani plik .cpg, ani bajt w nagłówku nie są prawidłowe, program musi zgadywać, a nazwy takie jak Malmö, Ærø czy São Paulo zamieniają się w ciągi dziwnych symboli. Jeśli to widzisz, dane są zwykle nienaruszone. Wskaż programowi GIS, jakiego kodowania ma użyć przy otwieraniu warstwy, np. we właściwościach warstwy w QGIS, albo dodaj plik .cpg z prawidłową nazwą kodowania. Gdy sam zapisujesz pliki shapefile, wybieraj UTF-8 i trzymaj plik .cpg razem z pozostałymi częściami.

Układy współrzędnych i plik .prj

Plik .shp przechowuje same liczby, nie mówiąc, co oznaczają. Mogą to być długość i szerokość geograficzna w stopniach, metry w strefie UTM albo stopy w amerykańskim układzie State Plane. Dopiero plik .prj mówi programom, jaki układ współrzędnych obowiązuje, i robi to w postaci tekstu WKT, a nie kodu EPSG. Większość programów potrafi dopasować typowe definicje do kodu EPSG, ale nietypowe lub ręcznie edytowane pliki .prj czasem prowadzą do nieco innej interpretacji.

Bez pliku .prj program może przyjąć WGS84 albo zapytać Cię o układ. Wartości między -180 a 180 oraz między -90 a 90 to prawdopodobnie stopnie; duże wartości rzędu setek tysięcy lub milionów to rzutowane metry lub stopy. Nadanie układu współrzędnych jedynie opisuje dane. Przeliczenie do innego układu (reprojekcja) faktycznie zmienia współrzędne i nie należy mylić tych dwóch operacji.

Alternatywy dla formatu shapefile

GeoPackage to otwarty standard Open Geospatial Consortium, oparty na bazie danych SQLite w jednym pliku .gpkg. Mieści kilka warstw, długie nazwy pól, prawdziwe daty i godziny, wartości null oraz duże zbiory danych, a do tego jest domyślnym formatem QGIS. To dobry wybór do przekazania całego projektu. GeoJSON to tekstowy format JSON ustandaryzowany jako RFC 7946. Łatwo go przeczytać w edytorze tekstu i jest naturalnym formatem dla map internetowych i API, ale standard zakłada współrzędne WGS84, a pliki robią się duże. FlatGeobuf to nowszy, jednoplikowy format binarny z wbudowanym indeksem przestrzennym, zaprojektowany do szybkiego odczytu i strumieniowania przez sieć; jego obsługa rośnie, ale nie jest jeszcze tak powszechna jak w przypadku pozostałych.

Żaden z nich nie pasuje do każdego przypadku. Shapefile pozostaje najbezpieczniejszym wyborem, gdy nie wiesz, jakiego oprogramowania używa odbiorca, albo gdy system lub klient wprost go wymaga. Gdy jego ograniczenia zaczynają przeszkadzać, np. ucięte nazwy pól, utracone znaczniki czasu lub pliki bliskie 2 GB, konwersja do GeoPackage jest zwykle najmniej bolesnym rozwiązaniem.

Pracuj z plikami shapefile w przeglądarce dzięki FileReshape

Narzędzia FileReshape do plików shapefile odczytują części za pomocą GDAL skompilowanego dla sieci, więc pliki są przetwarzane na Twoim własnym urządzeniu i nie są wysyłane na serwer. „Przeglądarka shapefile” pokazuje obiekty na mapie i tabelę atrybutów z typem każdego pola. Konwertery „SHP na GeoJSON”, „SHP na KML” i „SHP na GeoPackage” zapisują te same dane w tych formatach; GeoJSON i KML są zapisywane w WGS84, a GeoPackage zachowuje układ współrzędnych. „KML na SHP” działa w drugą stronę i zapisuje plik .zip z plikami .shp, .shx, .dbf, .prj i .cpg, po jednym pliku shapefile na typ geometrii. Możesz upuścić plik .zip albo zaznaczyć razem wszystkie części, a nazw już skróconych do 10 znaków nie przywróci żadna konwersja.

Najczęściej zadawane pytania

Które pliki shapefile są wymagane?

Wymagane są pliki .shp, .shx i .dbf. Pliki .prj i .cpg są opcjonalne, ale zalecane, a .sbn, .sbx, .qix i .shp.xml to indeksy i metadane, które można pominąć.

Czy shapefile może zawierać jednocześnie punkty, linie i poligony?

Nie. Każdy shapefile ma w nagłówku jeden typ kształtu. Mieszane dane trzeba rozdzielić na osobne pliki shapefile dla każdego typu albo zapisać w formacie takim jak GeoPackage lub GeoJSON.

Dlaczego mój shapefile pokazuje dziwne znaki zamiast liter z akcentami?

Program odczytał plik .dbf w złym kodowaniu. Wybierz właściwe kodowanie przy otwieraniu warstwy albo dodaj plik .cpg z prawidłową nazwą, np. UTF-8 lub 1252.

Czy shapefile może przechowywać datę i godzinę?

Może przechowywać datę, ale nie godzinę. Znaczniki czasu zwykle zapisuje się zamiast tego w polach tekstowych albo przenosi dane do GeoPackage, który ma prawdziwy typ daty i czasu.

Czy shapefile to otwarty format?

Jego pliki geometrii i indeksu są udokumentowane w opisie technicznym, który Esri opublikowało w 1998 roku, a tabela atrybutów korzysta z powszechnie znanego formatu dBASE, dlatego wiele darmowych i komercyjnych programów odczytuje i zapisuje pliki shapefile.