sobota, grudnia 27, 2008

Zabawy z Geoportalem cd.

W dzisiejszej notce o tym, jak przy pomocy darmowego programu GDAL stworzyć duuużą (rzędu 10 000 x 10 000 px lub więcej) mapę ze zdjęć lotniczych z serwera WMS Geoportalu.

Na początku należy pobrać (najlepiej razem z pakietem FWTools) i zainstalować GDAL.
(Tutaj małe ostrzeżenie: program nie posiada żadnego GUI, wszystko odbywa się w konsoli/linii poleceń.)
Po instalacji trzeba ustawić zmienne środowiskowe poleceniem setfw.bat, dla pewności można jeszcze wpisać gdalinfo --formats i sprawdzić czy na liście obsługiwanych formatów znajduje się WMS.

Teraz można przystąpić do tworzenia XML z parametrami geoportalowego WMSa: szablon takiego pliku znajduje się na stronie GDAL, pola oznaczone jako optional można pominąć, wartości pól w większości uzupełnia się na podstawie informacji z GetCapabilities Geoportalu. (Kilka wyjaśnień dot. XML na dole; tutaj gotowe pliki: geop2180.xml, geop4326.xml)

Po stworzeniu pliku pozostaje jedynie wpisanie odpowiedniej komendy i... chwila cierpliwości (lub dwie - zależy od szybkości łącza i rozmiaru tworzonej mapy :).
  • Ogólnie:
    gdal_translate -of [format pliku] -projwin [bounding box danego obszaru] -outsize [rozmiar x i y pliku wyj.] [plik.xml] [plik.wynikowy]
  • przykład dla układu 1992 (EPSG:2180), plik jpeg 10000x10000px, obszar Warszawy:
    gdal_translate -of JPEG -projwin 630000 500000 650000 480000 -outsize 10000 10000 tmp\geop2180.xml tmp\wwa4.jpg
  • współrzędne geograficzne (EPSG:4326), 1000x1000px, Warszawa:
    gdal_translate -of JPEG -projwin 20.909 52.451 21.194 52.166 -outsize 1000 1000 tmp\geop4326.xml tmp\wwa.jpg
BBox (projwin) wpisywać należy albo w stopniach (długość, szerokość geograf.), albo we współrzędnych metrowych (X i Y), w zależności od układu zdefiniowanego w pliku XML (Geoportal udostępnia dwa: EPSG:4326 i 2180 czyli PUWG1992). Rozmiar pliku wyjściowego można podać w pikselach albo procentach (np. -outsize 10% 10%), ważne aby proporcje między bokami projwin i outsize były takie same. (100% oznacza stworzenie obrazu w pełnej rozdzielczości np. dla 0,25m/px i obszaru 1x1km powstanie obraz 4000x4000px, przy 10% będzie to 400px.)
Ścieżki do pliku xml i wynikowego można podać też w postaci bezwzględnej np. "C:\Program Files\FWTools\bin\gdal_geop.xml"


W podobny sposób można tworzyć mapy z danych znajdujących się nie tylko na WMSach, ale także na serwerach World Wind czy TMS (czyli np. usługa ARS w Geoportalu).

[EDIT: Więcej o pobieraniu map z ARS w tym poście]

Na koniec kilka wyjaśnień związanych z plikiem XML:
  • DataWindow
    UpperLeftX/Y, LowerRightX/Y można rozumieć jako BBox zestawu danych na serwerze Geoportal (~obszar Polski) i nie należy go mylić z BBox tworzonej mapy czyli projwin; w przypadku EPSG:4326 można to całkowicie pominąć, bo GDAL domyślnie przyjmie -180, 90, 180 i -90 stopni, natomiast dla układu 1992 konieczne jest już wpisanie odpowiednich współrzędnych metrowych (na podstawie GetCapabilities, jednak dobrze jest podać wartości zaokrąglone np. do dziesiątek tysięcy)
  • SizeX i SizeY jest to rozmiar obrazu (jako całości, z której wycinana będzie potem mapa) w pikselach, trzeba go ustalić na podstawie przewidywanej rozdzielczości zdjęć na serwerze oraz wpisanych wcześniej wartości UpperLeft i LowerRight - zakładając np. 0,25m/px oraz X od -180 do 180 stopni (co odpowiada 40 000 000m na równiku) dostaje się SizeX równy 160 000 000 [px], natomiast dla układu 1992, tej samej rozdzielczości i różnicy między right i left X wynoszącej 1 000 000m SizeX wyniesie 4 000 000 (analogicznie dla Y)
  • Cache domyślnie jest wyłączony, jednak warto dodać to pole, aby za każdym razem nie ściągać danych od nowa
  • BlockSizeX/Y rozmiar pojedynczego obrazka (tile), z których sklejana będzie potem gotowa mapa - im większy, tym logo dodawane przez Geoportal będzie relatywnie mniejsze, z drugiej strony (przy mapach niewiele większych od pojedynczej cegiełki) wiąże się to ze ściąganiem wiekszej ilości niepotrzebnych danych
  • BandsCount liczba kanałów w obrazie - dla JPG wartość ta to 3 (składowe RGB), PNG - 4 (RGB + kanał alpha)

21 komentarzy:

jasiekpol pisze...

Próbuje to ogarnąć ale za cholere nie mogę. Jest coś prostszego ?

m_k pisze...

Ten programik powinien być prostszy w obsłudze (posiada normalny interfejs graficzny)
Piszę "powinien", bo nie testowałem go osobiście i nie wiem jak wypada to w praktyce...

Z tego co widziałem, to na forum TrekBuddy tworzyli też jakieś własne programiki - link

Opisywany przeze mnie sposób nie jest może najłatwiejszy, ale pozwala stworzyć naprawde duze mapy przy dosyc niskim obciażeniu serwerów Geoportalu.

jasiekpol pisze...

Dzięki za odpowiedź, jeśli nie miałbyś nic przeciwko pomocy to potrzebuje obszar ORTO w skali 1:1 000 do przerobienia na mapę do Biegu na Orientację z koordynatów:
płn zach X:488150 Y:713000
płn wsch X 488150 Y:717300

pd zach X:484200 Y:713000
pd wsch X:484200 Y:717300

Zapewne da się po rogach te namiary skrócić. Ile zajmowałby taki plik ?

m_k pisze...

Z szybkiego (wiec moglem sie gdzies pomylic:) oszacowania wychodzi mi, ze dla obszaru 4x4km trzeba by obrazka 16x16kpx, co dla jpeg daloby jakies 50MB...

jasiekpol pisze...

Bawiłem się tym programikiem z forum trekbuddy, ale jakość uzyskanego powiększenia jest mizerna. Dla laika najlepszym poradnikiem byłby taki rejestrujący czynności ekranu nagrany np CamStudio bo w tym ciężko się ogarnąć.

jasiekpol pisze...

o instalacji trzeba ustawić zmienne środowiskowe poleceniem setfw.bat, dla pewności można jeszcze wpisać gdalinfo --formats i sprawdzić czy na liście obsługiwanych formatów znajduje się WMS. A jeśli się nie znajduje to co ?

Anonimowy pisze...

czy ktoś może napisać jak w ten sposób pobrać z geoportalu mapy TBD VMAPL2, BDO?

Anonimowy pisze...

Witam
Artykuł bardzo ciekawy ale nie bardzo mogę "załapać" jak ustawić parametry dla gdal aby uzyskiwać różną skalę mapy - może ktoś napisać na 2 lub 3 przykładach jak manipulować skalą pobieranej mapy ? Dla mnie jest to ważne gdyż często mam mapki na których białe tło urozmaica napis "Brak danych dla aktualnego powiększenia" :/
Pozdrawiam i dziękuję.

Anonimowy pisze...

Jeśli można prosić o pomoc w sprawie tego MapRequest'a bo wydaje się prostszy i ma lepszy interface. Jak poprawnie skonfigurować te serwery ze strony http://terraobserver.blogspot.com/2009/02/polskie-serwery-wms.html lub może mała paczka z gotowcami, ja za słaby jestem żeby to rozwiązać
Pozdrawiam

Anonimowy pisze...

P.S.
przynajmniej po jednym przykładzie jak poprawnie konfigurować

Darek pisze...

Witam!

A może dałoby się wyprosić aktualizację wpisu? Lub nowy wpis o gdal_translate i geoportalu? I w gdalu, i w geoportalu sporo się pozmieniało...

pozdrowienia

Anonimowy pisze...

"teraz pozostaje wpisanie tylko odpowiedniej komendy...". Ja się zastanawiam dla kogo Ty ten opis robiłeś? dla siebie? To trzeba było w domu na kartce sobie napisać K**A!!

m_k pisze...

Na pewno nie dla takich anonimowych łosi jak ty.
Poniżej masz przecież przykładowe polecenia gdal_translate. Nie zrozumiałeś czegoś? Można było normalnie zapytać.

terra pisze...

mam prośbę: czy możesz podać mi przykładowe zapytanie w postaci adresu url, do serwera o obrazek. dane obrazka powinny być wg EPSG:4326.

Chodzi mi o cóś takiego:
http://sdi.geoportal.gov.pl/wms_orto/wmservice.aspx?VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ORTOFOTO&TRANSPARENT=TRUE&FORMAT=image/jpeg&styles=Default&SRS=EPSG:4326&BBOX=50.923,15.621,50.926,15.635&WIDTH=1000&HEIGHT=460

pokazuje mi się pusty obrazek z logiem geoportalu.
Niestety nie mogę wykorzystać zewnętrznego narzędzia. Zasoby mogę pozyskiwać tylko w ten sposób.

am

m_k pisze...

Nie wiem czemu (poza tym że "Geoportal już tak ma"), ale zapytanie GetMap nie działa w wersji 1.1.1.
Po zmianie parametru version na 1.3.0 oraz srs na crs, obrazek się ładuje.

http://sdi.geoportal.gov.pl/wms_orto/wmservice.aspx?VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap&LAYERS=ORTOFOTO&TRANSPARENT=TRUE&FORMAT=image/jpeg&styles=Default&CRS=EPSG:4326&BBOX=50.923,15.621,50.926,15.635&WIDTH=1000&HEIGHT=460

Anonimowy pisze...

jesteś WIELKI!

am

Przestrzenny pisze...

Trochę popróbowałem ściągać mapy GDALem i co mi wyszło:

1. w teorii program powinien ściągać mapy kafelkami (wg tego co jest w XMLu), łączyć je i zapisywać jako plik wynikokowy z georeferencjami. W praktyce nie jest tak łatwo, bo np. ja potrzebowałem w miare dokładnej mapy orto - przypuścmy powiatu, ustawiam mu współrzędne, rozmiar kafla w XMLu, spodziewany rozmiar obrazka dla danej rozdzielczości i co? Klapa, bo program łyka polecenie i zawiesza się w konsoli na "0_" (raz stał całą noc na tym "0"). Sprawdzałem i on nawet nie próbuje pobierac czegokolwiek z serwera. Innym razem owszem - pobierze (sprawdzam ilosc wysłanych danych w Comodo oraz przez TCPView) i tez staje na "0". Myślałem, że aktualizacja GDAla pomoże (korzystałem z FWTools) ale to samo. Czasem efekt przynosi zmiana wielkości kafelka w XMLu na mniejszy, co w przypadku geoportalu sprawia że znaczek wodny staje się niepotrzebnie ogromny :|
Drugi sposób to zmniejszenie obszaru (podzielenie go na 2 albo coś takiego), ale to tylko dodaje roboty ...
2. Czasem przy słabszym połączeniu np. serwer się obrazi i nie zwróci nic, program wtedy wywala błąd no i foch. Ok, ale szkoda, że nie można mu ustawić ilości prób które ma podjąc, a także ignorowania błędów i ściągania dalej (zapisze w cache, potem można drugi raz go puścić i uzupełni brakujące kafle). W dodatku czasem ściągnie uszkodzony kafelek (błąd "premature end of jpeg"), ale nie usunie/nie naprawi go. A samemu szukać w cache to mordęga.

Żeby nie było, gdal_transform to tylko jedna biblioteka z całego pakietu, wiec nie twierdzę że całość SSIE :) Szkoda tylko, że mało kto korzysta z niej w taki sposób jak w tym artykule, bo nikt widać nie miał takich problemów jak ja i nie znalazłem póki co rozwiązania (kombinuję z MapoTero i Geoxą).

m_k pisze...

Podejrzewam, że większość tych problemów wynika z kapryśnego działania samego Geoportalu, który albo nie działa, albo działa wolno, albo zmienia coś w ustawieniach.
Co do prostoty samego programiku, to zgoda, ale takie dodatkowe funkcjonalności powinny być chyba zapewniane przez zewnętrzne aplikacje powstałe na jego bazie. gdal_translate i driver formatu WMS/TMS to tylko pojedynczy klocek. (Oddzielną kwestią jest to, czy takie aplikacje istnieją.)

Przestrzenny pisze...

gdal zwiesza się na "0_" także na np. serwerze GDOS, wiec to jest raczej cos z programem. Co do reszty, cóż - dla mnie jednak szkoda, że nie ma opcji ponawiania połączenia. Zewnętrzne programy ... ja nie znam :) Gdala wiem że wykorzystuje kilka aplikacji (Quantum GIS przykładowo), ale żadna chyba nie ma interfejsu stricte do takiego ściągania mapek ;)

MapoTero jest fajne, ale nie zapisuje pliku z georeferencjami dla ArcGiS. Referencjowanie pod Quantumem też jest problematyczne (trzeba plik .points załadować w Georeferencjerze i dopiero śmiga).

Anonimowy pisze...

Witam,
czy można uaktualnić przykładowe pliki *.xml? Udało mi się samemu zrobić pliki xml dla serwerów ars, niestety nie potrafię ogarnąć tego dla serwera wms...

Anonimowy pisze...

Witam,
mam problem z pobraniem mapy. Polega on na tym, że pobrana mapa np. topo jest poszatkowana tj. poszczególne kafelki są źle dopasowane do siebie. Nie wiem w czym rzecz i co robię źle... Wydaje mi się, że problem leży w wyznaczeniu wartości sizex oraz sizey. Mógłby mi ktoś przedstawić sposób wyznaczania tych wartości na przykładzie np. mapy topo_250_1992 ?
pozdrawiam,
Dawid N.