Jaki jest cel PostGIS na PostgreSQL?

49

PostgreSQL obsługuje już typy danych przestrzennych, operatorów i indeksowanie.

Co dokładnie zapewnia PostGIS, co wymagało istnienia jako rozszerzenie PostgreSQL?

Dlaczego nie wszyscy po prostu używamy przestrzennej funkcjonalności PostgreSQL?

Zeruno
źródło
2
To PostGIS zapewnia te typy danych przestrzennych, operatorów i indeksowanie ...
DPSSpatial
5
Nie, on mówi o rodzimych typach geometrii PostgreSQL.
Evan Carroll,
4
Krótka odpowiedź jest taka, że ​​PostGIS jest (teraz) 10 razy bardziej funkcjonalny niż typy PgSQL. Długa odpowiedź, która obejmuje pytanie „po co opracowywać nowe typy, a nie tylko ulepszać te, które już istnieją”, omówiono poniżej.
Paul Ramsey
1
To samo stało się z frameworkiem Java Spring. Java miała wady / brakujące funkcje. Spring naprawił wiele wad Java i dodał przydatne funkcje. Java skopiowała poprawki + funkcje Springa. Ludzie pytają, dlaczego wiosna istnieje ...
Neil McGuigan

Odpowiedzi:

86

Jeśli ponownie zranisz wszechświat do początku 2001 roku i nie tylko pozwolisz wynalazcom PostGIS zobaczyć przyszłość, ale także pozwolisz PSC PgSQL zobaczyć przyszłość, być może PostGIS będzie serią łat na PgSQL. Ale przynajmniej, gdybyśmy zaczęli jako łatki do rdzenia, pierwszą rzeczą, na którą byśmy się natknęli, było:

  • podstawowe obszary PgSQL nie obsługują dziur, ale model GIS naprawdę chce dziur, czy możemy to zmienić?

A rdzeń PgSQL powiedziałby: „nie, oczywiście nie, obszary mają istniejący dobrze rozumiany semantyczny i nie możemy robić wstecz takich niezgodnych zmian”.

Jako programiści niebędący rdzeniami PostGIS był w stanie nokautować miesięczne i 6-miesięczne wydania na wiele lat, podczas gdy rdzeń PgSQL rozwijał się wraz z wydaniami rocznymi i dłuższymi. Mogliśmy również dodawać dowolne funkcje, kiedy tylko chcieliśmy, ponieważ mieliśmy uprawnienia do zatwierdzania w naszym projekcie, ale uzyskanie praw do zatwierdzania w PgSQL zajmuje bardzo dużo czasu.

Do czasu, gdy PostGIS wykazywał wystarczającą wartość zewnętrzną, że rdzeń PgSQL przejrzał i powiedział do siebie „hmm, byłoby miło mieć w jądrze jako dodatkową funkcję”, było już tyle kodu o innym standardzie i stylu niż PgSQL (nie wspominając o niekompatybilnej licencji), że pomysł połączenia nie był tak naprawdę możliwy.

Zamiast tego PostGIS stał się kanonicznym przykładem naprawdę dużego złożonego rozszerzenia, które pomaga PgSQL pozostać modułowym i rozszerzalnym. „Jak to wpłynie na coś takiego jak PostGIS” to pytanie często zadawane, gdy rdzeń PgSQL ocenia pewne zmiany. Jest to również dobra rzecz, może nie tak ładna jak PostGIS będąca częścią rdzenia, ale wystarczająco dobra.

Istnieją inne powody, takie jak długa lista zależności, których rdzeń PgSQL nie chciałby widzieć, ogólnie niższa spójność kodu i czystość interfejsu API, które chcieliby ulepszyć, i tak dalej. Nawet w chwili poczęcia PostGIS był zbyt duży, aby PgSQL mógł go przełknąć w jednym kęsie.

Paul Ramsey
źródło
Także ... PostGIS to C ++. Byłby to showstopper dla scalenia PostgreSQL. Niezależnie od tego, czy tak powinno być. Zależności też by to całkowicie zatrzymały - GDAL? Ha! Nie mogę nawet zmusić rdzenia do wyrażenia zgody na zależność od Perla> 5.8.0. Tempo rozwoju jest wolne, nawet jeśli masz uprawnienia do zatwierdzania; osoby odpowiedzialne nie tylko dostają za darmo wszystkie rzeczy w drzewie, muszą przejść przegląd kodu, a uzyskanie dużych zmian zajmuje miesiące lub lata. Istnieją zalety jakości kodu, ale z pewnością nie jest on szybki.
Craig Ringer
Jest to szczególny problem polegający na tym, że rdzeń Pg ciągle wymyśla nowe rzeczy, których należy unikać w zależności od większej liczby bibliotek zewnętrznych. Ponieważ oznaczałoby to $ ancient_unix_42 z $ weird_vendor_compiler na $ dead_architecture musiałby go obsługiwać, wszyscy członkowie buildfarm musieliby aktualizować itp. To chyba jeden z problemów z dojrzałością i stabilnością.
Craig Ringer
@CraigRinger Dlaczego według ciebie PostGIS to C ++? To zniewaga :-)
Nicklas Avén
To ... nie jest? Mógłbym przysiąc. Ale na pewno tak nie wygląda. Mój błąd. W każdym razie lubię (umiarkowane i powściągliwe) używanie C ++.
Craig Ringer
4
Przez pewien czas PostGIS miał kilka elementów C ++, aby utworzyć powiązanie z GEOS. Po dodaniu własnego interfejsu API C przez GEOS elementy te zostały usunięte, a PostGIS stał się „czysty” C.
Paul Ramsey
34

To po prostu nieprawda, PostgreSQL nie obsługuje typów danych przestrzennych. Obsługuje typy geometryczne. Są one w zupełności w porządku dla niektórych rzeczy, ale są całkowicie oddzielone od rzeczywistych układów współrzędnych. Rodzime typy

Aktualizacja

Jeśli chodzi o pytanie indeksowe, to w FAQ

Dlaczego indeksy R-drzewa PostgreSQL nie są obsługiwane?

Wczesne wersje PostGIS korzystały z indeksów PostgreSQL R-Tree. Jednak R-drzewa PostgreSQL zostały całkowicie odrzucone od wersji 0.6, a indeksowanie przestrzenne zapewnia schemat R-Tree-over-GiST.

Nasze testy wykazały, że szybkość wyszukiwania natywnych R-Tree i GiST jest porównywalna. Natywne R-drzewa PostgreSQL mają dwa ograniczenia, które sprawiają, że nie są one pożądane do korzystania z funkcji GIS (należy pamiętać, że ograniczenia te są spowodowane obecną implementacją R-Tree PostgreSQL, a nie ogólną koncepcją R-Tree):

  • Indeksy R-drzewa w PostgreSQL nie obsługują funkcji większych niż 8 KB. Indeksy GiST mogą, używając „stratnej” sztuczki polegającej na podstawieniu ramki granicznej samą funkcją.

  • Indeksy R-drzewa w PostgreSQL nie są „zerowo bezpieczne”, więc budowanie indeksu na kolumnie geometrii zawierającej geometrie null zakończy się niepowodzeniem. [Indeksy GiST są zerowo bezpieczne]

Evan Carroll
źródło
Czy możesz rozwinąć swój ostatni punkt - ten dotyczący indeksów GiST? PostgreSQL zapewniał R-Tree, a teraz zapewnia to poprzez indeks GiST, więc jestem zdezorientowany co do tego punktu.
Zeruno,
zaktualizowany o bezpośredni tekst z najczęściej zadawanych pytań.
Evan Carroll,
1
Istotą API jest rzeczą PostgreSQL dostarczone przez dostępowego / gist.h . Możesz zobaczyć go w użyciu w PostGIS tutaj
Evan Carroll
3
Chociaż PostGIS ma własną implementację rtree-on-gist, jest bardzo podobna do tej używanej przez PgSQL do obsługi podstawowych obiektów graficznych z tego prostego powodu, że pierwotnie je skopiowaliśmy.
Paul Ramsey,
1
@Zeruno, Nie, modyfikacja rozdzielacza rtree w PgSQL nie zmieni zachowania PostGIS, ponieważ mamy własne, w gserialized_gist_picksplit_2d (). Nie będzie to wcale takie różne od PgSQL, jeśli w ogóle.
Paul Ramsey,
8

PostGIS to przestrzenny przedłużacz bazy danych dla obiektowo-relacyjnej bazy danych PostgreSQL . Dodaje obsługę obiektów geograficznych, umożliwiając uruchamianie zapytań lokalizacyjnych w SQL.

SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';

Oprócz podstawowej świadomości lokalizacji, PostGIS oferuje wiele funkcji rzadko spotykanych w innych konkurencyjnych bazach danych przestrzennych, takich jak Oracle Locator / Spatial i SQL Server. Więcej informacji znajduje się na liście funkcji PostGIS .

Lista funkcji PostGIS rozszerza również te możliwości:

PostGIS dodaje dodatkowe typy (geometria, geografia, raster i inne) do bazy danych PostgreSQL . Dodaje także funkcje, operatory i rozszerzenia indeksu mające zastosowanie do tych typów przestrzennych. Te dodatkowe funkcje, operatory, powiązania i typy indeksów zwiększają moc rdzenia PostgreSQL DBMS, czyniąc go szybkim, bogatym w funkcje i solidnym systemem zarządzania przestrzenną bazą danych.

Lista funkcji

Seria PostGIS 2+ zapewnia:

  • Funkcje przetwarzania i analizy zarówno danych wektorowych, jak i danych rastrowych do łączenia, krojenia w kostki, przekształcania, przeklasyfikowywania i zbierania / łączenia z mocą algebry map rastrowych SQL do precyzyjnego przetwarzania rastra
  • Odrzucanie przestrzenne Funkcje wywoływane SQL zarówno dla danych wektorowych, jak i rastrowych Obsługa importu / eksportu danych wektorowych w formacie SHAPefile za pomocą narzędzi wiersza polecenia i GUI oraz obsługa większej liczby formatów za pomocą innych narzędzi Open Source innych firm
  • Pakiety wiersza polecenia do importowania danych rastrowych z wielu standardowych formatów: GeoTiff, NetCDF, PNG, JPG

  • Renderowanie i importowanie funkcji obsługi danych wektorowych dla standardowych formatów tekstowych, takich jak KML, GML, GeoJSON, GeoHash i WKT przy użyciu SQL Renderowanie danych rastrowych w różnych standardowych formatach GeoTIFF, PNG, JPG, NetCDF, aby wymienić tylko kilka przy użyciu SQL

  • Bezproblemowe funkcje rastrowe / wektorowe SQL do wyciskania wartości pikseli według regionu geometrycznego, uruchamiania statystyk według regionu, przycinania rastrów według geometrii i wektoryzacji rastrów Obsługa obiektów 3D, indeks przestrzenny i funkcje Obsługa topologii sieci Pakiety Tiger Loader / Geocoder / Reverse Geocoder / wykorzystując dane US Census Tiger

Ponadto do punktów / części wymienionych już w tym poście. Dodałbym, jak wspomniano na stronie PostGIS, jak to działa

Ponieważ PostGIS jest w C, może korzystać z innych bibliotek w C i C ++ i robi to swobodnie. PostGIS zależy od:

  • GEOS dla wielu algorytmów przetwarzania geometrii
  • Proj.4 dla funkcji ponownego rzutowania współrzędnych
  • GDAL do przetwarzania rastrowego i obsługi formatu
  • LibXML2 do analizowania XML
  • JSON-C do analizowania JSON
  • SFCGAL dla rozszerzonej obsługi 3D i dodatkowych algorytmów geoprzetwarzania
whyzar
źródło