Integracja kafli WMTS z Geoportalu

0

Witam,

próbuję dodać obsługę kafli z geoportalu w formatach WMS i WMTS w swoim systemie.
Mam już istniejącą kontrolkę mapową, która obsługuje różnych providerów mapowych, ale generalnie wszystkie one serwują kafle w oparciu o konkretny identyfikator kafla na danym poziomie zooma, czyli X Y Z, cały świat na zerowym poziomie zooma to jeden kafelek, każdy kolejny poziom to podział tego kafla na cztery mniejsze.
Nie ma mowy o wymianie kontrolki na coś w stylu OpenLayer czy LeafLet, bo zbyt dużo funkcjonalności mam już w niej zaszyte.

Integracje z kaflami WMS generowanymi dynamicznie jakoś ogarnąłem, znam współrzędne geograficzne środka kafelka w sytemie WGS84, więc wyznaczam sobie współrzędne wierzchołków kafelka i ewentualnie konwerutję na układ EPSG2180, po czym podaje w parametrach requestu o konkretny kafel, który nakładam potem na swoje podkłady.

Wyzwaniem okazała się integracja kafli w formacie WMTS, gdyż obrysy kafli nie pokrywają się z moimi.
Z obsługą zoomowania i przesuwania już sobie poradziłem, problemem była poprawna obsługa denominatorów skali, kolejny poziom zooma nie zawsze oznacza dwukrotne powiększenie, czasami jest dwu i półkrotne.

Problemem jet dla mnie przemapowanie współrzędnych WGS84 na ekranowe, czyli określenie konkretnego pixela na konkretnym kaflu dla zadanych współrzędnych.

W przypadku moich kafli, współrzędne lat long mapuję do liczb z zakresu 0-1, gdzie 0,0 (WGS84 90,-180) to lewy górny a 1,1 (WGS84 -90,180) to prawy dolny wierzchołek kafelka na zerowym poziomie zooma.
Znając rozmiar kafelka w pixelach i liczbę kafelków obejmujących cały świat na zadanym poziomie zooma jestem w stanie policzyć sobie offest w pixelach od lewego górnego wierzchołka.

W przypadku kafli WMTS z geoportalu chciałem zrobić to podobnie. Problemem jednak jest, że nie znam współrzędnych wierzchołków kafelka.
Przykładowy kafelek mapy image
Endpoint GetCapabilities z opisem xmlowym usługi WMTS https://mapy.geoportal.gov.pl/wss/service/PZGIK/BDOO/WMTS/2015?VERSION=1.3.0&SERVICE=WMTS&REQUEST=Getcapabilities w teorii podaje jakieś współrzędne:

<TileMatrixSet>
<ows:Identifier>EPSG:2180</ows:Identifier>
<ows:SupportedCRS>urn:ogc:def:crs:EPSG::2180</ows:SupportedCRS>
<TileMatrix>
<ows:Identifier>EPSG:2180:0</ows:Identifier>
<ScaleDenominator>7559538.928571429</ScaleDenominator>
<TopLeftCorner>850000.0 100000.0</TopLeftCorner>
<TileWidth>512</TileWidth>
<TileHeight>512</TileHeight>
<MatrixWidth>1</MatrixWidth>
<MatrixHeight>1</MatrixHeight>
</TileMatrix>

Spodziewałem się, że współrzędne topleft corner mogą opisywać wierzchołek kafla na najniższym poziomie zooma, ale wskazują gdzieś na Ukrainę.

W xmlu są też współrzędne bboxa, na oko wyglądało, że lewy górny punkt mógłby być początkiem kafla z linka powyżej, jednak nim nie jest.

<ows:WGS84BoundingBox>
<ows:LowerCorner>13.800 48.800</ows:LowerCorner>
<ows:UpperCorner>24.400 55.000</ows:UpperCorner>
</ows:WGS84BoundingBox>

Zamieniłem współrzędne na EGPS2180, tam znajać wielkośc pixela w metrach (0,00028 * denominator skali na tym poziomie zooma) i wymiary kafla w pixelach policzyłem sobie przeciwległy wierzchołek w EPSG2180 i zamieniłem na WGS84.
Mająć obie współrzedne policzyłem wysokość i szerokość kafla w stopniach, policzyłem sobie odległość punktu w stopniach od wierzchołka i to dzieląc przez długość kafla w stopniach dało mi liczbę z zakresu 0-1, która przemnożona przez rozmiar kafla dała mi numer konkretnego pixela na ekranie.
Nałożyłem sobie marker na mapie, jednak jego umiejscowienie nie pokrywa mi się ze stanem faktycznym. Niewielkie odchylenie mogło być wynikiem liczenia położenia w opraciu o WGS84 a nie EPSG2180 ale różnica jest istotna, z 20km za zachód i z 70km na północ...

Ma ktoś pomysł jak dobrać się do współrzędnych naróżników kafelka?

0

Ma ktoś pomysł jak dobrać się do współrzędnych naróżników kafelka?

Masz to opisane w dokumentacji.

https://docs.ogc.org/is/17-083r2/17-083r2.html#107

Tag TopLeftCorner X/Y odpowiada (tileMatrixMinX, tileMatrixMaxY) w powyższym opisie. Także wyszukaj miejsce gdzie pierwszy raz jest wspomniany tileMatrixMinX albo tileMatrixMinY i dalej będziesz miał opisane jak tego użyć do obliczenia współrzędnych.

0

Dzięki na naprowadzenie.
Widziałem wcześniej ten dokument z opisem standardu, ale wychodziły mi nadal błędne współrzędne zakotwiczenia kafelka.
Problemem okazał się serwis, z którego korzystałem do szybkiego przeliczenia koordynatów z EPSG 2180 do WGS84 (https://epsg.io/transform#s_srs=2180&t_srs=4326&x=850000.0000000&y=100000.0000000), który dla 850000 100000 wskazywał na Ukrainę.

Znalazłem inny podkład mapowy z geoportalu, który miał nieprzeźroczyste tło i tam spróbkowałem współrzędnie naroźnika. Operując na nich udało mi się lepiej wypozycjonować marker wg długości geograficznej i mocno się zdziwiłem, że ten narożnik ma właśnie koordynaty 850000 100000 w EPSG2180.
Dopiero przeliczając samemu koordynaty EPSG2180 na WGS84 udalo mi się uzyskać poprawny wynik, zbieżny z tym spróbkowanym z geoportalu...

1 użytkowników online, w tym zalogowanych: 0, gości: 1