Skip to main content

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

%7B8A4D9728-59CE-401E-B4ED-7CA041D98820%7D

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”> Rendering process failed. Layers: indxr_vector:album1_4_ano4_14 java.io.IOExceptionorg.postgresql.util.PSQLException: ERROR: lwgeom_simplify_in_place: unsupported geometry type: MultiSurface ERROR: lwgeom_simplify_in_place: unsupported geometry type: MultiSurface

Co objawia się następującym stanem wizualnym: %7B3A255057-34F7-48BD-89EB-E5606267D831%7D 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”> Rendering process failed. Layers: indxr_vector:gmtest_24_08_2023_15_11_5_ano1_10 java.io.IOExceptionorg.postgresql.util.PSQLException: ERROR: Cannot find SRID (404000) in spatial_ref_sys ERROR: Cannot find SRID (404000) in spatial_ref_sys

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

INDXR jest częścią infrastruktury Dariah.lab stworzonej w ramach projektu DARIAH-PL