DEV
Informacje dla administratorów i developerów.
Przechowywanie informacji o lokalizacji na skanie
Lokalizacja na skanie zapisywana jest w bazie danych w polu typu “geometry”. W celu zapewnienia bezproblemowej obsługi przez różne narzędzia wspierające odczyt, zapis, wizualizację, analizy danych tego typu czyli “przestrzennych”, dodatkowo potrzebne jest określenie typu geometrii i układu odniesienia dla używanych współrzędnych. Sama baza danych nie wymaga określania dodatkowo typu geometrii ani układu współrzędnych. Ale narzędzia korzystające z tych danych mogą już tego wymagać. Wymaganiom tym można uczynić zadość od razu w bazie danych, albo za każdym razem indywidualnie w danej aplikacji dostępowej (bibliotece lub innym narzędziu) doprecyzowując metadane w taki sposób jak na to pozwala dane narzędzie. Podanie tych metadanych bezpośrednio w bazie danych powoduje, że nie trzeba już tego robić w aplikacji dostępowej (powinna to odczytać automatycznie z bazy).
Typ geometrii Typ geometrii ze względu na rodzaj wprowadzanych danych (jeden lub więcej połączonych ze sobą obszarów), może być określony jako Multisurface lub Multipolygon. Teoretycznie lepszy jest Multisurface bo:
A MultiPolygon is defined by one or more Polygons, referenced through polygonMember elements. Deprecated with GML version 3.0. Use MultiSurfaceType instead.
za: https://portal.ogc.org/files/?artifact_id=7174
W praktyce używanie Multisurface może czasami sprawiać problemy. Na przykład nawet jeśli uda się zapisać i renderować w trybie wektorowym (WFS), to renderowanie w trybie rastrowym (WMS) może powodować błąd:
<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no”?><!DOCTYPE ServiceExceptionReport SYSTEM „http://172.18.12.112:8020/geoserver/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd”>
Co objawia się następującym stanem wizualnym: Czerwone tło oznacza że nie udało się wczytać obrazu jednej z warstw (GS go nie dostarczył), z powodu powyższego błędu. Natomiast udało się wczytać GML-a (prostokąt z czerwonym obrysem).
Być może da się znaleźć taką kombinację ustawień na linii: OpenLayers (które formuje GML do zapisu i wyświetla obrazek przekazany przez GS albo samodzielnie renderuje GML) <-> Geoserver (który zamienia GML w SQL i na odwrót) <-> PostgreSQL/PostGIS (który w zależności od tego czego żąda Geoserver podaje mu dane wprost lub wcześniej przelicza), która powodowałby w połączeniu z odpowiednim układem współrzędnych prawidłowe działanie również używając Multisurface. Ale przeprowadzone eksperymenty dowiodły że jest to bardzo kruchy stan w porównaniu ze stanem kiedy używany jest typ Multipolygon. Tym bardziej że dodatkowe możliwości wynikające z typu Multisurface (linie typu zakrzywionego zamiast zwykłych), nie są niezbędne.
Ponieważ OL domyślnie przygotowuje żądanie zapisu z Multisurface:
/**
-
- Property: multiSurface
- {Boolean} Write gml:multiSurface instead of gml:MultiPolygon. Since
- the latter is deprecated in GML 3, the default is true. To write
- gml:MultiPolygon instead of gml:multiSurface, set multiSurface to
- false in the options to the constructor (cannot be changed after
-
- instantiation). */ multiSurface: true,
Aby nie zachodziła konieczność konwersji typu geometrii gdzieś po drodze, powyższy parametr trzeba ustawiać na False.
Być może w przyszłości uda się ustalić wszystkie parametry środowiska które pozwalają na stabilną pracę z wykorzystaniem typu Multisurface. Na obecną chwilę bardziej stabilną pracę gwarantuje Multipolygon.
Układ odniesienia
Drugim parametrem przy określaniu typu geometrycznego jest układ odniesienia. Potrzebny jest płaski metryczny układ współrzędnych. Istnieją takie w zbiorze EPSG, ale dla celów obsługi danych typu przestrzennego lecz niezwiązanych bezpośrednio z kulą ziemską twórcy Geoserver’a zdefiniowali układ o kodzie 404000. Jest on obsługiwany przez Geoserver. Nie znajduje się on jednak w domyślnym zbiorze układów odniesienia dla bazy danych PostgreSQL/PostGIS. Co nie powinno być problemem jeśli nie zachodzi potrzeba przeliczania współrzędnych przez bazę danych (co może wystąpić na przykład wtedy gdy otrzyma z zewnątrz żądanie dostarczenia ich w innym niż 404000 układzie współrzędnych). Co skutkuje następującym komunikatem ze strony bazy danych:
<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no”?><!DOCTYPE ServiceExceptionReport SYSTEM „http://172.18.12.112:8020/geoserver/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd”>
Dlatego na wszelki wypadek lepiej jest dodać ten układ do tabeli spatialrefsys zgodnie z definicją zawartą na stronier: https://spatialreference.org/ref/sr-org/epsg404000/
Ostatecznie więc definicja pola z geometrią powinna wyglądać tak:
the_geom public.geometry(multipolygon, 404000) NULL