Pobieracz map i zdjęć satelitarnych

Na OpenStreetMap mają fajną funkcję eksportu mapy, zaznacza się obszar i wybiera skalę a następnie pobiera jeden duży plik graficzny który można wydrukować albo użyć do innych celów.

Jeszcze fajniej by było pobrać w taki sposób zdjęcia satelitarne - niestety OpenStreetMap to tylko mapa a na GoogleMaps nie ma funkcji eksportu. Niby można robić zrzuty ekranu ale to niewygodne, zwłaszcza jak interesujący nas obszar w skali takiej jak nam potrzebna nie mieści się na ekranie.

Daltego napisałem pobieracz map. Prosty skrypt który pobiera zdjęcia satelitarne albo mapy bezpośrednio z serwera a potem łączy je w jeden duży obrazek. Wystarczy wyciągnąć współrzędne geograficzne z linku do mapy a skrypt zajmie się resztą.

Wszystkich którzy znają się choć odrobinę na programowaniu zachęcam do zajrzenia do wnętrza skryptu. Zasada działania jest bardzo prosta i jest ona wspólna dla wielu różnych map internetowych, wszędzie kafelki mają taki sam wymiar 256×256px tak samo przelicza się też zoom i współrzędne geograficzne na numery kafelków, dlatego zmieniając tylko jedną linijkę w skrypcie można sprawić, że będzie on obsługiwał zupełnie inne mapy.

Listę adresów serwerów z mapami znaleźć można np. tutaj

--- 2 Uwagi:
Skrypt wymaga biblioteki python imaging (PIL lub jakiegoś jej odpowiednika)
Skrypt był pisany już jakiś czas temu w pythonie 2.X dopiero niedawno poprawiłem go aby działał też z 3.X

W grudniu 2013r zmienił się adres serwera na którym znajdują się mapy, jeśli komuś skrypt przestał działać to proszę o ściągnięcie nowszej wersji która zawiera aktualne adresy.
Na początku 2015r ponownie zmienił się adres - skrypt został zaktualizowany.

98 komentarzy:

  1. Niestety pobieranie map google w ten sposób jest nielegalne i oznacza łamanie regulaminu.

    OdpowiedzUsuń
    Odpowiedzi
    1. Nielegalne z pewnością nie jest bo nie ma żadnego prawa które zabraniało by pobierania zdjęć publicznie udostępnionych na stronie. A przynajmniej nie ma takiego prawa w Polsce gdzie mieszkam.

      Czy narusza jakiś regulamin? Żadnego regulaminu nie widziałem i nie akceptowałem przed wejściem na tamtą stronę, dlatego nie wiem co takiego mógł by zawierać.

      Jednak wątpię aby wprowadzał rozróżnienia na rodzaje przeglądarek jakimi można stronę oglądać a jakimi nie. Mój skrypt nie robi niczego czego nie robił by program firefox albo opera.

      To czy ktoś naruszy jakieś prawo albo regulamin zależy od tego co zrobi ze zdjęciami potem, zapewne nie wolno ich wykorzystywać komercyjnie ani rozpowszechniać bez zgody autora, nie wolno też sobie przypisywać ich autorstwa itd.

      Usuń
    2. Na własny użytek jest legalne

      Usuń
  2. Witam!

    Czy za pomocą tego skryptu dałoby się pobrać większe fragmenty następujących map?
    1. http://www.mapy.cz/s/6UoI
    2. http://www.smartmaps.cz/turisticke-mapy/

    Ewentualnie co by należało zmienić w skrypcie, żeby był zdatny do użycia w powyższych mapach?

    OdpowiedzUsuń
    Odpowiedzi
    1. Sporo by było do przerabiania:

      Widzę, że używają jakiegoś własnego sposobu numeracji kawałków mapy.

      Trzeba by podpatrzyć jak przeliczają współrzędne geograficzne na numerki map.

      Długość geograficzna jest chyba liczona podobnie jak na mapach googla tylko zapisywana w taki dziwny sposób
      hex( xtile << (28 - zoom))[2:]

      ale szerokość geograficzna ??

      Usuń
    2. A dałbyś radę zmodyfikować odpowiednio skrypt lub stworzyć nowy dla tych map? Od długiego czasu szukam jakiegoś narzędzia do pobierania z nich większych fragmentów. Szczególnie zależałoby mi na tej drugiej mapie.

      Ze stroną mapy.cz radzę sobie w ten sposób, że klikam na druk (tisk) mapy. Wyświetla się obrazek w .jpg lub .png. PPM -> polecenie "otwórz obrazek". Następnie w adresie url modyfikuję odpowiednio wysokość i szerokość mapy wyrażone w pikselach. Z tym że są pewne ograniczenia, o ile dobrze pamiętam najwięcej może być 3 tys. pikseli w pionie i 30 tys. w poziomie, czyli można uzyskać dość wąskie pasy poziome.

      Usuń
    3. Mogę, do tej drugiej, za chwilę napiszę, wystarczy polecieć kolejno po numerach kafelków bez bawienia się w skomplikowane obliczenia.

      Usuń
    4. Tu masz skrypt do pobierania drugiej mapy,
      https://sites.google.com/site/marekdrwota/czeskipobieracz.py
      Wielkość obszaru ograniczona jest tylko pamięcią operacyjną komputera na którym to uruchomisz.

      Aby wybrać która część mapy ma zostać pobrana kliknij ją prawym przyciskiem i daj „pokaż obrazek” albo „kopiuj adres obrazka” tak aby mieć adres kawałka mapy który jest w tej chwili wyświetlany, będzie to coś w stylu http://m2.smartmaps.cz/tm25/0/209/tm25_419_392.png?width=250&height=250
      Interesują nas z niego liczby 25 419 392
      25 to skala mapy (może być tylko 25 albo 50)
      419 392 to współrzędne x y wyświetlanego kwadratu, trzeba je podać skryptowi to pobierze całą okolicę wyświetlanego kawałka

      Usuń
    5. Marek, wielkie dzięki! :)

      Nie wiem jednak, w jaki sposób udało Ci się wydobyć adresy poszczególnych kafelków, bo u mnie po prawokliku w obrębie mapy w ogóle nie pojawia się menu podręczne (w różnych przeglądarkach).

      I druga rzecz: czy jeśli postąpię wg instrukcji na tej stronie: http://www.symbianos.pl/faq/2-s60v3-programy/99-jak-uruchomic-skrypty-i-programy-napisane-w-pythonie - skrypt będzie działał? Ewentualnie jaki jest inny najprostszy sposób uruchomienia skryptu w Pythonie pod Windowsem (Vista)?

      Usuń
    6. W firefoksie wejdź w preferencje, zakładka treść, obok napisu „włącz obsługę języka javascript” jest przycisk zaawansowane, prawdopodobnie masz tam zaznaczone „zezwalaj na blokowanie lub zmianę menu kontekstowego” - odznacz to.

      Ten poradnik co podałeś dotyczy uruchamiania skryptów napisanych w pythonie na telefonach z symbianem.
      Do uruchomienia pod windows wystarczy zainstalować pythona (najlepiej w jakiejś nowej wersji) wtedy kliknięcie w skrypt uruchamia go jak normalny program.

      Ten konkretny skrypt potrzebuje aby mu podać na początku parametry więc nie objedzie się bez użycia konsoli, co nie jest zbyt przyjemne pod windowsem, najwygodniej będzie skopiować go tam gdzie zainstalowałeś pythona
      Aby uruchomić konsolę w windowsie trzeba przytrzymać znaczek windowsa i nacisnąć r a potem wpisać w to okienko cmd a potem wydajesz polecenia:
      cd katalog_w_którym_zainstalowany_jest_python
      python.exe nazwa_skryptu.py parametry dla skryptu

      Jak sobie nie poradzisz z konsolą to ewentualnie można by przerobić skrypt aby uruchomiony bez parametrów, zadawał pytania o nazwę pliku i potrzebne mu liczby.

      Usuń
    7. Zainstalowałem najnowszego Pythona 3.3.1 w folderze C:\Program Files\Python. Skrypt, tak jak pisałeś, przeniosłem też do folderu Python.

      W konsoli wpisałem polecenia dla podanego przez ciebie kafelka:

      cd c:\program files\python
      python.exe czeskipobieracz.py 25 419 392

      Wyświetla się następujący komunikat:
      File "czeskipobieracz.py", Line 20
      SyntaxError: invalid syntax

      Czy coś źle robię?

      I jeszcze jedno: w jaki sposób można określić wielkość pobranego obszaru mapy, tj. wielkość okolicy wokół podanego kafelka?

      Usuń
    8. A już widzę co było nie tak, pythonowi trójce nie podobało się, że nie ma nawiasu za printem, a dwójka działała bez i nie marudziła (poprawiłem ściągnij jeszcze raz)

      a druga sprawa to parametry

      python.exe czeskipobieracz.py jakasnazwa.png 419 392 25 10 10

      czyli najpierw nazwa pliku w jakim ma zostać zapisana pobrana mapa, potem współrzędne, potem skala, potem wymiary (licząc w kafelkach).

      Przecież jest instrukcja w samym skrypcie.

      Usuń
    9. Znowu jakiś błąd:

      Traceback :
      File "czeskipobieracz.py", Line 7, in
      import Image
      ImportError: No module named 'Image'

      Taki komunikat wyświetla się po wpisaniu identycznego polecenia, jakie napisałeś wyżej, a także innych.

      Usuń
    10. Coś mi ucięło fragmenty komunikatu w nawiasach ostrokątnych (tym razem zastępuję je okrągłymi):

      Traceback (most recent call last):
      File "czeskipobieracz.py", Line 7, in (module)
      import Image
      ImportError: No module named 'Image'

      Usuń
    11. Nie masz zainstalowanej biblioteki do obsługi obrazków, musisz doinstalować Python Imaging Library (pod linuksem pakiet nazywa się python-imaging i zazwyczaj zainstalowany jest z automatu)

      Jakąś wersję pod windows znalazłem na http://www.pythonware.com/products/pil/

      Usuń
    12. Najnowszej biblioteki PIL (ver. 1.1.7) z tej strony nie da się zainstalować, a wujek Google podpowiada, że nie została jeszcze wydana biblioteka PIL do Pythona 3.3.1. Zainstalowałem jakiś substytut Pillow 2.0.0 ze strony https://pypi.python.org/pypi/Pillow/2.0.0#downloads, ale dalej wyświetla się ten sam komunikat. Czy jest jakiś sposób, żeby działało to na najnowszym Pythonie?

      Ewentualnie jeśli zainstaluję Pythona 2.7 i do tego PIL 1.1.7, to czy skrypt będzie działał?

      Usuń
    13. Myślę, że w twoim wypadku najprostszym wyśjciem będzie zainstalowanie pythona 2.7 wtedy będzie działało bez żadnych kombinacji.

      Usuń
    14. Ten Python to jednak straszne dziadostwo ;). Zainstalowałem wersję 2.7.4, do tego chciałem doinstalować bibliotekę PIL 1.1.7. Niestety, przy każdej próbie zainstalowania biblioteki wywala błąd i Windows przerywa instalację. Spróbowałem więc zainstalować wcześniejszą wersję Pythona 2.6. Tego to nawet w ogóle u mnie nie da się zainstalować.

      Czy jest jakiś sposób, żeby to coś działało w miarę normalnie pod Windowsem?

      Usuń
    15. Tak zaraz narzekasz przy programie który ma dosłownie kilka linijek, korzysta tylko z jednej biblioteki i jest napisany w języku który działa praktycznie na każdej możliwej platformie.

      No niestety tak to już jest w windowsie który nie posiada automatycznego instalatora i wszystko trzeba robić ręcznie.

      To sobie wyobraź jakim koszmarem jest uruchomienie pod windowsem programu który jest napisany w C i wymaga kompilacji. Jeszcze jak taki program, korzysta z kilkudziesięciu bibliotek z których każdej potrzebujesz mieć odpowiednią wersję i to dodatkowo z nagłówkami potrzebnymi do kompilacji.
      Wszystko musisz znajdować, ściągać i instalować ręcznie a jak pojawia się błąd to jeszcze nawet nie wiadomo jaki co by sobie wpisać go w google i ustalić co jest grane.

      Usuń
    16. Jak działa na każdej możliwej platformie, skoro u mnie (Windows Vista) nie działa? I to problem dotyczy każdej z kilku ostatnich wersji, z jakimi miałem do czynienia - albo jest problem z instalacją, albo z biblioteką, albo skrypt trzeba zmieniać pod konkretną wersję... Co mi po programie, którego zwyczajnie nie da się zainstalować, mimo że jest przeznaczony pod dany system? Z mojej perspektywy nie ma znaczenia, czy program korzysta z kilku, czy kilkudziesięciu bibliotek, skoro już na starcie są problemy uniemożliwiające korzystanie z niego.

      Wracając do tematu, czy w świetle powyższego jest jakaś możliwość skorzystania ze skryptu? Sam nie za bardzo wiem, co mógłbym jeszcze zrobić. Dałbyś radę ewentualnie napisać coś podobnego bez wykorzystania Pythona? Rozumiem, że Ty nie korzystasz z Windowsa, tylko Linuksa - może więc dałoby się odpalić skrypt na jakiejś wersji live Linuksa (np. Ubuntu)?

      Usuń
    17. W takim ubuntu (np 12.04LTS) zadziała z marszu, nic nawet nie trzeba instalować, bo wszytko jest na płycie live gotowe do uruchomienia.

      Jeśli chodzi o windowsa to niestety taki już system, że nawet z najmniejszym drobiazgiem trzeba walczyć. Nie wiem jak ludzie mogą z tego korzystać, zwłaszcza tacy początkujący. Sam mam już trochę doświadczenia z tymi systemami, przynajmniej na tyle, że nigdy nie miałem problemu z zainstalowaniem pythona lub czegoś podobnie prostego ale jeśli jeśli chodzi o jakieś bardziej skomplikowane rzeczy to już nie na moje nerwy, jestem przyczajony, że wszytko po prostu działa, a jak potrzeba jakiegoś programu albo biblioteki to mi automat zainstaluje.

      Co do pisania w czymś innym to raz, że program był by dłuższy i dużo bardziej skomplikowany a dwa, że miał byś 10 razy większe problemy z uruchomieniem tego pod windows. Znaczenie czy program korzysta z kilku czy kilkunastu blibliotek pod windowsem jest ogromne, ponieważ nie ma automatu i musisz każą bibliotekę sam poszukać i to jeszcze w odpowiedniej wersji a następnie zainstalować ręcznie co potrafi zająć przeszło pół godziny. Różnica między jedną biblioteką a kilkunastoma jest więc taka jak między poświęceniem na coś pól godziny a straceniem całego dnia.

      Usuń
    18. A jak odpalić skrypt w Ubuntu? Wystarczy dwuklik na plik, czy coś trzeba jeszcze robić?

      Spróbuję w wolnym czasie pokombinować coś jeszcze na Windowsie z różnymi wersjami Pythona i różnymi bibliotekami. Może wujek Google coś podpowie. Jak nie, to najwyżej będę ściągał potrzebne mapy, korzystając z Ubuntu, choć dla mnie Windows byłby jednak dużo wygodniejszym rozwiązaniem.

      Usuń
    19. Wystarczy ściągnąć, nadać uprawnienia do działania i będzie działał jak normalny program (uprawnienia można sobie ustawić klikając prawym i wchodząc we właściwości albo poleceniem chmod 755 nazwa_pliku).

      Ten skrypt nie jest przeznaczony do działania interaktywnego (żadnego klikania myszą i innych działań ze strony użytkownika), uruchamia się go z a pomocą polecenia:
      ścieżka/nazwa_skryptu parametry
      konkretnie np
      ./czeskipobieracz.py mapa.png 419 392 25 10 10
      skrypt robi co ma zrobić i kończy swoje działanie, nie zadaje żadnych pytań


      Różnica między tym jak należało go uruchomić pod windows nie jest wielka, ułatwienie jest takie, że powłoka sama rozpoznaje czym to uruchomić (po pierwszej linijce skryptu) więc nie musisz się przejmować tym gdzie jest python i że ta powłoka trochę pomaga przy wpisywaniu poleceń (np po wpisaniu pierwszych kilku liter można nacisnąć tab to dokończy, można sobie przeglądać i zmieniać to co wpisało się wcześniej).


      Ale powinno działać też pod windows, zrób porządek, usuń co instalowałeś wcześniej i zainstaluj od nowa pythona 2.7 albo 2.6.

      Usuń
  3. Jak się używa tego skryptu?

    OdpowiedzUsuń
    Odpowiedzi
    1. Po uruchomieniu wyświetla się dokładna instrukcja.
      W skrócie: trzeba jako parametr podać nazwę pliku i współrzędne geograficzne.

      Usuń
    2. Wyświetla mi błąd "Syntaxerror line 29"

      Usuń
    3. A nie zmieniałeś tam niczego?

      Jaką masz wersję pythona?

      Usuń
    4. Niczego nie zmieniałem, wersję posiadam 3.3:-)

      Usuń
    5. A już wiem co jest grane, nowa wersja pythona płacze, że nie ma nawiasu za printem, nieco starsza w której to pisałem nie potrzebowała takich rzeczy. Już poprawiłem, ściągnij skrypt jeszcze raz.

      Usuń
  4. Marku czy mogę Ci podesłać na maila printscreen?
    Dalej mi wyskakuje błąd:/

    Czy w wierszu trzeba podawać stronę z której się chce ściągnąć zdjęcia?

    OdpowiedzUsuń
  5. A czy jest możliwość pobrania z tej strony:
    http://www.googleartproject.com

    Wydaje się, że działa podobnie, jak google maps.

    OdpowiedzUsuń
    Odpowiedzi
    1. Tyle, że to ma kafelki w jakimś dziwnym formacie.

      Usuń
  6. Witam, czy dałbyś radę zrobić podobny skrypt na tę mapę?
    http://tiny.pl/h86j4
    Pozdrawiam, Wojtek

    OdpowiedzUsuń
    Odpowiedzi
    1. Tak, wystarczy zamienić 2 linijki

      W linii 54 (tam gdzie jest adres) dać
      url_s="http://ec2.cdn.ecmaps.de/WmsGateway.ashx.jpg?Experience=kompass&MapStyle=KOMPASS Touristik&TileX="

      W linii 65
      url=url_s+str(xs+x)+"&TileY="+str(ys+y)+"&ZoomLevel="+str(zoom)

      Usuń
    2. Super! Tylko jak znaleźć współrzędne kafelka? Odznaczyłem w Firefoxie opcję "zezwalaj na blokowanie lub zmianę menu kontekstowego" w zaawansowanych ustawieniach opcji "włącz obsługę języka javascript", ale dalej po kliknięciu prawym przyciskiem myszki w obszarze mapy wyświetla mi się standardowe menu podręczne (bez możliwości pokazania obrazka lub skopiowania jego adresu). Z kolei w adresie url są, zdaje się, zawarte długość i szerokość geograficzna oraz skala mapy.
      Pozdrawiam, Wojtek

      Usuń
    3. Właśnie długość i szerokość geograficzną oraz powiększenie trzeba skryptowi podać a on sam oblicza współrzędne kafelków do ściągnięcia. W tym przypadku nie musisz się męczyć z wyciąganiem czegokolwiek.

      Ta strona wykorzystuje identyczną numerację kafelków jak google maps więc i skrypt działa tak samo. Jedyne co trzeba było w nim zmienić to adres serwera z którego ma pobierać obrazki i nazwy parametrów.

      Usuń
    4. Czy należy podać długość i szerokość z wszystkimi cyframi po przecinku? Mógłbyś napisać przykładowe polecenie, które należy podać skryptowi, dla kafelka z mapy, której adres podałem w pierwszym moim poście?
      Pozdrawiam, Wojtek

      Usuń
    5. Można podać wszystkie cyfry, choć przy tej skali map tak duża dokładność nie jest konieczna, spokojnie wystarczy 6 cyfr po przecinku, ale jak podasz dokładnej to w niczym nie zaszkodzi.

      Przykładowe polecenie
      ./pobieraczmap.py mapa.png 50.921888 14.090567 15

      Usuń
  7. Nie za bardzo rozumiem, które linijki mam zamienić (otworzyłem skrypt w notatniku i przekopiowałem zawartość do Worda, ale trudno mi namierzyć właściwe numery linii).

    W oryginalnym skrypcie jest tak:

    if ( (len(sys.argv) < 8) or sys.argv[7]=="satelita"):
    url_s="http://khm1.google.com/kh/v=128&src=app&x="#119
    elif (sys.argv[7]=="mapa") :
    url_s="http://mt1.google.com/vt/lyrs=m@195061254&hl=pl&src=app&x="
    elif (sys.argv[7]=="hybryda"):
    url_s="http://mt1.google.com/vt/lyrs=y&x="
    else:
    print("Nieznany typ "+sys.argv[7])
    exit(0)

    Gdzie mam wstawić linijkę: url_s="http://ec2.cdn.ecmaps.de/WmsGateway.ashx.jpg?Experience=kompass&MapStyle=KOMPASS Touristik&TileX=" ?

    I drugie:

    Czy linijkę: url=url_s+str(xs+x)+"&TileY="+str(ys+y)+"&ZoomLevel="+str(zoom)
    mam wkleić zamiast:
    url=url_s+str(xs+x)+"&y="+str(ys+y)+"&z="+str(zoom)+"&s=" ?

    Pozdrawiam, Wojtek

    OdpowiedzUsuń
    Odpowiedzi
    1. Te które są podobne

      było
      url_s="http://khm1.google.com/kh/v=128&src=app&x="

      ma być
      url_s="http://ec2.cdn.ecmaps.de/WmsGateway.ashx.jpg?Experience=kompass&MapStyle=KOMPASS Touristik&TileX="


      było
      url=url_s+str(xs+x)+"&y="+str(ys+y)+"&z="+str(zoom)+"&s="

      ma być
      url=url_s+str(xs+x)+"&TileY="+str(ys+y)+"&ZoomLevel="+str(zoom)

      Ale lepiej sobie ściągnij już przerobiony skrypt bo jeśli zaczniesz edytować go w wordzie to tylko popsujesz.
      http://mega.co.nz/#!gplDzBAA!c-nlKzWEx0FfMnhC09yUGDeFoqy1yzPseSf5hUQ1kBI

      Usuń
    2. A mógłbyś wrzucić skrypt na jakiś inny hosting, bo ta nowa strona Kima często ma awarie (teraz na nieszczęście też)?

      PS. Rozumiem, że w tym wariancie również należy dodać na końcu polecenia liczbę kafelków, np. "10 10"?

      Pozdrawiam, Wojtek

      Usuń
    3. W końcu udało mi się pobrać skrypt - okazało się, że Kim tak sobie wymyślił, że można skorzystać z jego hostingu tylko poprzez Google Chrome, i to najnowszą wersję ;)

      Niestety, skrypt nie chce działać. Wyświetla się komunikat: "Nazwa 'pobieraczmap_de' nie jest rozpoznawana jako polecenie wewnętrzne lub zewnętrzne, program wykonywalny lub plik wsadowy".

      Pozdrawiam, Wojtek

      Usuń
    4. To komunikat windowsa który nie potrafi rozpoznać czym ma uruchomić skrypt (w windowsie to normalne, taki system trzeba się przyzwyczaić, albo zainstalować lepszy system)

      Aby uruchomić skrypty pisane w pythonie pod windowsem trzeba na początku polecenia dodać czym ma je uruchomić. Czyli polecenie będzie wyglądało

      python.exe nazwa_skryptu.py parametry skryptu

      albo jeśli nie będzie potrafił znaleźć pythona to całe

      c:\miejsce gdzie zainstalowany jest python\python.exe nazwa_skryptu.py parametry skryptu


      A co do kima to myślałem, że już sobie odpuścił takie numery.
      To nie jest zbyt miłe, że nadal wyłudzają tego dolara za każdą osobę którą namówią na instalację chroma ale przynajmniej mają kasę na serwery i pliki które się tam wrzuci nigdy nie wygasają.
      Jeśli nie masz chrome i nie chcesz instalować można skorzystać z jakiegoś managera pobierania (np jdownloader, plowshare), albo założyć konto na tamtej stronie, wtedy nie ma ograniczeń co do przeglądarki, albo go oszukać zmieniając identyfikację przegladarki i flasza tak żeby udawała, że jest chromem.

      Usuń
    5. Działa! Prawdopodobnie wczoraj zapomniałem dodać rozszerzenia skryptu w poleceniu i Python nie mógł go znaleźć. Teraz wszystko pięknie pobiera. Można modyfikować wielkość pobranej mapy, zmieniając liczbę kafelków poziomo i pionowo. Wielkie dzięki za skrypt! :)

      Że Kim wyłudza w ten sposób kasę od wujka Google, to nie wiedziałem. Próbowałem pobrać też przez FDM, ale ten programik coś ciężko integruje się z przeglądarkami (przynajmniej u mnie) i pobiera całe strony internetowe, zamiast określonego pliku. Czy pliki na nowym hostingu Dotcoma nigdy nie wygasają, tego nie byłbym taki pewien - co będzie, jak znowu zamkną mu hosting, tak jak Megaupload? ;)

      Jeszcze raz wielkie dzięki za świetny skrypt! Pozdrawiam Wojtek

      Usuń
  8. Hej!

    A dałbyś może radę przerobić skrypt tak, żeby działał na tej mapie:
    http://www.katastralni-mapa.cz/#pos=49.794473;15.504143@sc=6200000

    Chodzi przy tym o możliwość pobrania różnych kategorii map, mnie najbardziej zależałoby na "základní mapy" i "turistické mapy".

    OdpowiedzUsuń
    Odpowiedzi

    1. http://voila.pl/index.php?f=1751628.py

      W 38 linijce trzeba podać początek adresu jednego kafelka z mapy którą chcesz ściągać, aż do "&PX="
      a jako parametry skryptu podajesz 2 liczby które są na końcu adresu.

      Jeśli masz zamiar używać tego częściej mogę przerobić tak aby się podawało jako parametr cały adres kafelka a skrypt sam wyciągał sobie te liczby.

      Usuń
  9. Hej!

    Wielkie dzięki za skrypt! Mam zamiar pobrać więcej map, więc dałbyś radę przerobić skrypt tak, żeby nie trzeba go było zmieniać za każdym razem? Chciałbym przy okazji pobrać też parę map ze strony: http://www.mapy.cz (zakładka 'mapy turystyczne'). Dałoby się sporządzić podobny skrypt?

    Z góry dzięki!

    OdpowiedzUsuń
    Odpowiedzi
    1. PS. To było oczywiście w sprawie skryptu do: http://www.katastralni-mapa.cz

      Usuń
    2. OK https://sites.google.com/site/marekdrwota/czeskipobieracz2.py

      zrobiłem tak, że wystarczy podać jako parametr adres jednego kafelka a skrypt sam wyciągnie sobie z tego adresu wszystkie potrzebne dane. Czyli uruchamiać się to będzie np tak:

      ./czeskipobieracz2.py mapa.png "http://1mt-1188.o2.position.cz/Tile?STATE=AxgcAAAAADCMMUEAAAAAxORaQVVUTVpvbmUzMwAVAAAAAIBP8kABAA__&PX=-261&PY=561"

      w samym skrypcie nie trzeba już nic zmieniać

      Usuń
    3. Wielkie dzięki! :)

      Czy wielkość mapy np. 10 x 10 kafelków należy podać na końcu?

      A co z tą drugą mapą (http://www.mapy.cz)? Dałbyś radę wykonać podobny skrypt, przy tym żeby można było pobrać więcej map, tzn. nie trzeba było zmieniać skryptu za każdym razem?

      Usuń
    4. Tak na końcu podaje się wymiary.

      a tu masz skrypt do mapy.cz
      https://sites.google.com/site/marekdrwota/pobieracz_mapy_cz.py

      tak samo trzeba mu podać nazwę pliku, adres jednego kafelka i rozmiar mapy, czyli np
      ./pobieracz_mapy_cz.py plik.png "http://m4.mapserver.mapy.cz/turist_trail/12_7f30000_8000000" 10 10

      Usuń
    5. Niby ściąga mapę, ale nie ten obszar co powinien

      Usuń
  10. Witam, z jakiego źródła korzystałeś dowiadując się o budowie mapy na stronach google, o kafalkach i ich położeniu i ogólnie wszystkiego co jest związane z google maps?
    pozdro
    kuba

    OdpowiedzUsuń
    Odpowiedzi
    1. Z dokumentacji do OpenStreetMap - mapy googla są zbudowane w identyczny sposób tylko adres serwera inny, a adres serwera to już sobie sam podpatrzyłem.

      Usuń
  11. Witam, najpierw chciałem podziękować za skrypt, dobra robota, oby takich jak najwięcej. Mam też niestety takie pytanie :p, odpaliłem skrypt i za pierwszym razem poszło bez zgrzytów, kolejne próby kończą się komunikatem:
    Traceback (most recent call last):
    File "pobieraczmap.py", line 68, in
    img = Image.open(im)
    File "C:\Python27\lib\site-packages\PIL\Image.py", line 1980, in open
    raise IOError("cannot identify image file")
    IOError: cannot identify image file

    OdpowiedzUsuń
    Odpowiedzi
    1. Zmienił się adres serwera z którego pobierane są fragmenty mapy, już poprawiłem w skrypcie, pobierz jeszcze raz nową wersję skryptu albo zmień w skrypcie adresy serwerów na https://khms0.google.com i https://mts0.google.com

      Usuń
  12. a jesteś w stanie napisać skrypt, który umożliwi export map google z nałożonymi layer'ami do jakiegoś innego formatu? np gpx albo po prostu zapisanie jako mapy google ze znacznikami? chodzi o mapy jak tu: http://www.sardegnaabbandonata.it/mappa/ lub tu: http://forgotten.pl/. chcę sobie to w jakąś aplikacje gps na tablecie wrzucić, ale nie mam pomysłu. jakieś wskazówki?

    OdpowiedzUsuń
    Odpowiedzi
    1. Niestety ale strona udostępnia dane jedynie w formie obrazków.

      Być może są jakieś inne sposoby na obranie się do tych danych ale nic nie wiem na ten temat.

      Usuń
  13. Witam,
    Dałbyś radę stworzyć podobny skrypt umożliwiający pobranie map umieszczonych w Zoomify? Chciałbym pobrać kilka map z tej strony: http://www.bu.uni.wroc.pl/ozk/?lang=pl

    Kilka przykładowych map:

    http://dk.bu.uni.wroc.pl/cymelia/showPicture.htm?docId=8200038458&shortTilesPath=/0/03/035/0357/03579/03579002.jpg

    http://dk.bu.uni.wroc.pl/cymelia/showPicture.htm?docId=8200032882&shortTilesPath=/0/03/036/0363/03636/03636001.jpg

    http://dk.bu.uni.wroc.pl/cymelia/showPicture.htm?docId=8200037534&shortTilesPath=/0/03/036/0365/03657/03657002.jpg

    OdpowiedzUsuń
    Odpowiedzi
    1. https://sites.google.com/site/marekdrwota/pobieracz_mapy_wroc.py

      Jako parametr musisz podać nazwę pod jaką ma być zapisany plik i adres jednego kafelka w środku obszaru który chcesz pobrać.

      Adresy kafelków możesz poznać jeśli podczas przeglądania mapy online naciśniesz w firefoksie ctrl+shift+k albo w operze/chrome naciskając ctrl+shift+i

      Usuń
    2. Podałem np. takie polecenie dla pierwszej mapy:

      c:\Python27>python.exe pobieracz_mapy_wroc.py mapa1 http://dk.bu.uni.wroc.pl/mid
      as/manu/tiles//0/03/035/0357/03579/03579002/TileGroup7/6-27-16.jpg

      Odpowiedź:

      http://dk.bu.uni.wroc.pl/midas/manu/tiles//0/03/035/0357/03579/03579002/TileGrou
      p7/6-0-0.jpg
      Traceback (most recent call last):
      File "pobieracz_mapy_wroc.py", line 51, in
      img = Image.open(im)
      File "c:\Python27\lib\site-packages\PIL\Image.py", line 1980, in open
      raise IOError("cannot identify image file")
      IOError: cannot identify image file

      Czy coś źle robię, czy w skrypcie jest błąd? Kafelek mam nadzieję dobrze dobrałem? Mój Python to wersja 2.7.4, do tego doinstalowana biblioteka PIL-1.1.7.

      Usuń
    3. Dwie rzeczy:
      1 Nazwa pliku do zapisania musi wskazywać na jego format, zamiast mapa1 daj mapa1.png albo mapa1.jpeg
      2 Nieszczęśliwie trafiłeś na kafelek na krawędzi mapy i skrypt nie mógł pobrać tego co znajduje się poza krawędzią. Dodałem obsługę wyjątków aby się w takiej sytuacji nie wysypywał tylko jak nie może pobrać zostawiał w tym miejscu czarny margines (ściągnij jeszcze raz nowszą wersję skryptu).

      Usuń
    4. Już działa :)
      Ale nadal z błędami :(

      Pobiera tylko kawałek 1024 x 1024 pikseli. Przy czym fragment obrazka jest czarny, nawet jak się weźmie kafelek prawie ze środka mapy. Przykład: http://fotus.pl/zdjecia/2014/04/07/mapa6.jpg
      W odniesieniu do wielu kafelków daje odpowiedź "Nie mogę pobrać, poza krawędzią mapy" (a przecież nie są poza krawędzią mapy).

      Czy da się tak skonstruować skrypt, żeby pobrał po prostu całą zeskanowaną mapę (najlepiej w formacie wyjściowym), czyli wszystkie kafelki w maksymalnym powiększeniu mapy i je łączył?

      Usuń
    5. Już wiem! Podałem wymiary na końcu i pobiera większy fragment. Ale dalej to są wąskie pasy mapy z czarnymi pasami u dołu i góry:
      http://fotus.pl/przegladarka/b1G
      http://fotus.pl/przegladarka/b1J

      Usuń
    6. Do 4 poziomu zooma działa dobrze i można pobrać całość za jednym razem.
      Przy 5 i 6 poziomie zaczyna zmieniać się jeszcze jeden człon adresu i to jest przyczyną problemu. W sumie powinno dać się to przewidzieć i ulepszyć skrypt, tylko czy jest taka potrzeba? Te mapy nie są aż tak szczegółowe aby przy tak dużym zoomie było widać coś więcej poza nierównościami na papierze.

      Usuń
    7. Jednak zależałoby mi, żeby pobrać mapy w najlepszej możliwej jakości. Poza tym mapy są różne - niektóre są bardzo "upchane" treścią, jest drobna czcionka itp., tak że mniejsza rozdzielczość może sprawiać problem z ich odczytaniem. Nie wiem jeszcze, jak skrypt będzie się spisywał przy innych mapach - na razie próbowałem z tą jedną. Gdybyś dał radę zrobić tak, żeby dało się pobrać całą mapę przy największym powiększeniu, byłbym bardzo zobowiązany :)

      A przy okazji: teraz to jest trochę strzelanie na ślepo: trzeba znaleźć kafelek w źródle strony i potem tak dobrać długość i szerokość pobieranego kawałka, żeby pobrało całą mapę. Trzeba dobierać odpowiednie wartości metodę prób i błędów. Czy dałoby się tak zmienić skrypt, żeby pobierał po prostu automatycznie całą mapę?

      Usuń
    8. A słuchaj, znalazłem wcześniej jeszcze taki skrypt Pythona do pobierania map z Zoomify: http://www.staremapy.cz/zoomify-analyza/zoomify-downloader.py

      U mnie on nie działa (może coś źle wpisuję?), ale może po drobnych korektach byłby dobry do tych map?

      Tutaj ktoś już próbował kombinować z zastosowaniem tego skryptu do innych map:
      http://sternadel.pl/blog/?id=102
      http://sternadel.pl/blog/?id=110
      http://sternadel.pl/blog/?id=180

      Usuń
    9. Przerobiłem mój skrypt, tak aby dział dla każdego powiększenia i sam rozpoznawał rozmiary mapy (wystarczy adres jednego kafelka).

      Przynajmniej w teorii bo dla zbyt dużych powiększeń mapa może nie zmieścić się w pamięci. Z 5 działa jak należy, z 6 raz próbowałem i sobie poradził ale na 6 nie daję gwarancji że zawsze się uda.

      Usuń
    10. Teraz działa bardzo dobrze. Rewelacja! Po kilku próbach nie zauważyłem problemów ze skalą 6. Jest tylko jeden drobny błąd - skrypt obcina ostatni rząd kafelków na dole i po prawej stronie. Może ma to związek z tym, że w tych rzędach kafelki nie są pełne (mają mniej niż 256 x 256 pikseli)? Przykład takiej mapy: http://zapodaj.net/23ddb48a9cf96.jpg.html

      Przy okazji mam takie pytanie techniczne: w jaki sposób ten skrypt konwertuje pomiędzy formatami? Jeśli kafelki tych map są w jpg, to czy jeśli w skrypcie podam format jpg to uzyskam wyjściową jakość map na serwerze? Czy jakość będzie lepsza, jeśli podam format png?

      Usuń
    11. Skrypt nie konwertuje tylko tworzy zupełnie nowy obraz do którego wkleja poszczególne kafelki, można sobie wybrać w jakim.

      Jpeg jest formatem stratnym każde zapisanie obrazu po jakiś modyfikacjach w formacie jpeg trochę pogarsza jego jakość, różnica może być minimalna ale jeśli chcesz jej uniknąć zapisuj w formatach bezstratnych np png.
      Jpeg i png to nie jedyne obsługiwane formaty plików powinno działać też tiff, gif i różne rodzaje bitmap, np ppm, bmp

      Usuń
    12. Dzięki za informację. Pokombinuję w takim razie z png i popatrzę, jaki będzie stosunek jakości do rozmiaru pliku. A dałbyś radę jeszcze zrobić coś z tym, żeby nie obcinało tych skrajnych rzędów? Zdarza się, że ucina treść mapy, gdy mapa sięga prawie do samej krawędzi skanu.

      Usuń
  14. A czy dałbyś radę zmodyfikować nieco skrypt, żeby działał na tej stronce: http://www.deutschefotothek.de ? Chciałbym pobrać parę map. Kilka przykładów:

    http://www.deutschefotothek.de/documents/obj/90053477/df_dk_0011669
    http://www.deutschefotothek.de/documents/obj/70400029/df_dk_0000034
    http://www.deutschefotothek.de/documents/obj/70400167/gr_olb_0000064

    OdpowiedzUsuń
    Odpowiedzi
    1. Hej!

      Naprawdę nie da sie nic zrobić, żeby skrypt pobieral też z tej stronki? Bardzo zależy mi na tych mapach. Dla Ciebie to niewiele roboty, a dla mnie ogromna pomoc. Albo napisz co należałoby zmienić w tym skrypcie, to popróbuję może sam go dostosować (chociaż zupełnie nie znam się na programowaniu w Pythonie).

      Pozdrawiam i bardzo proszę o pomoc!

      Usuń
  15. Dałoby radę skrypt dla wikimapii i bingsa ?

    OdpowiedzUsuń
  16. Błąd jest taki

    sudo python map.py a.png 51.377 20.284
    Traceback (most recent call last):
    File "map.py", line 68, in
    img = Image.open(im)
    File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 2028, in open
    raise IOError("cannot identify image file")
    IOError: cannot identify image file

    OdpowiedzUsuń
    Odpowiedzi
    1. Razem z nowymi zdjęciami satelitarnymi nieznacznie zmienił się link, teraz jest v=166
      Już poprawiłem w skrypcie, można pobrać nową wersję (albo zmienić link samemu).

      Usuń
  17. Witam Panie Marku nie wiem czy dobrze zrobiłem:
    Zainstalowałem Pythona 2.7 i Python imaging. Skrypt skopiowalem do folderu z Pythonem. W wierszu polecen wydaje takie polecenie :


    c:\Python27\python.exe pobieraczmapy.py mapa1.png https://www.google.pl/maps/@25.780196,-80.188977,3a,75y,280.02h,90t/data=!3m4!1e1!3m2!1s34cf8DaS24r3rRCcNkSPDg!2e0!6m1!1e1

    ale dostaje komunikat can'topen file 'pobieraczmapy.py [Errno 21 no such file of directory] Skrypt ma dokladnie nazwe pobieraczmapy.py Co robię nie tak?

    OdpowiedzUsuń
    Odpowiedzi
    1. Skoro skopiowałeś go tam gdzie python a pythona uruchamiasz c:\Python27\python.exe (domyślam się, że nieustawiona ścieżka) to skrypt wołać trzeba c:\Python27\pobieraczmapy.py

      Poza tym skrypt od googla oczekuje, że poda mu się długość i szerokość geograficzną a nie adres do strony.

      Usuń
  18. A szerokosc i dlugosc geograficzna z tego linku

    https://www.google.pl/maps/@25.780196,-80.188977,3a,75y,280.02h,90t/data=!3m4!1e1!3m2!1s34cf8DaS24r3rRCcNkSPDg!2e0!6m1!1e1

    to 25.780196,-80.188977 ?

    OdpowiedzUsuń
  19. czy moglby pan napisac mi jak ma wyglądac poprawne polecenie dla tej strony ?

    https://www.google.pl/maps/@25.780196,-80.188977,3a,75y,280.02h,90t/data=!3m4!1e1!3m2!1s34cf8DaS24r3rRCcNkSPDg!2e0!6m1!1e1

    Probowalem roznymi sposobami, ale mi nie wychodzi, serdecznie dziękuję

    OdpowiedzUsuń
    Odpowiedzi
    1. pobieraczmap.py mapa.png 25.780196 -80.188977

      A uwzględniając to, że masz inną nazwę i nieustawione ścieżki
      c:\Python27\python.exe c:\Python27\pobieraczmapy.py mapa.png 25.780196 -80.188977

      Usuń
  20. Wpisalem taką komende w cmd, ale nie otrzymalem zadnego komunikatu, ze pobieranie się udało. To chyba tak ma byc ? W folderze z Pythonem nie ma jednak sciagnietego fragmentu mapy. Gdzie go znajde ?

    OdpowiedzUsuń
  21. Niestety w folderze z Pythonem nie ma zadnych zapisanych obrazów. Czy skrypt pobieraczmap trzeba edytoiwac, czy wystarczy tylko go zapisac na dysku ?

    OdpowiedzUsuń
    Odpowiedzi
    1. Napisałem przecież, że nie tam gdzie python tylko w bieżącym katalogu.
      Wszędzie gdzie podaje się nazwy jakiś plików czytane/zapisywane są z/w katalogu w którym się znajdujesz. Chyba, że razem z nazwą pliku podasz nazwę jakiegoś innego katalogu.

      Nie wiesz gdzie się znajdujesz to pwd albo patrz na prompt (ten napis obok którego wpisujesz polecenia).
      Aby przejść do innego katalogu możesz użyć polecenia cd

      Usuń
  22. Wpisalem to polecenie w konsoli python.exe ale pojawia się komunikat SyntaxError invalid syntax

    File line 1

    OdpowiedzUsuń
    Odpowiedzi
    1. Jeśli chcesz korzystać tylko z map googla to nie ma potrzeby edytowania skryptu.

      Uruchamiając samego pythona bez podania mu nazwy skryptu do wykonania uruchomisz go w trybie interaktywnym o tym jak można wykorzystać ten tryb pisałem kiedyś na blogu http://miniskrypt.blogspot.com/2012/10/kalkulator-zamist-skryptu.html

      Usuń
  23. Cześć, wielkie dzięki za ten skrypt, jest genialny

    Jestem totalnym laikiem, ale jakimś dziwnym trafem udało mi się użyć tego skryptu po kilku godzinach główkowania :D wpisałem w cmd:
    python.exe pobieraczmap.py mapazeskryptu.png 52.237054 20.9208575 20 10 10 satelita

    jednak, po 3 próbie, jak chciałem dostosować zoom i wielkosc obrazka, zeby zmiescil moj obszar, dostalem odpowiedz:

    C:\Python27>python.exe pobieraczmap.py mapazeskryptu.png 52.237054 20.9208575 20
    10 10 satelita
    Traceback (most recent call last):
    File "pobieraczmap.py", line 68, in
    img = Image.open(im)
    File "C:\Python27\lib\site-packages\PIL\Image.py", line 1980, in open
    raise IOError("cannot identify image file")
    IOError: cannot identify image file

    Wiesz czym jest to spowodowanie? (moze to chwilowe, zaraz resetuje kompa i probuje dalej)

    OdpowiedzUsuń
    Odpowiedzi
    1. U mnie działa.
      Nie wiem czy przypadkiem nie masz starej wersji skryptu bo niedawno zmienił się adres do map. Jak ma masz wersję starszą niż 9 lutego to pobierz nową.

      Usuń
    2. pythona/PIL/skrypt sciagalem dzisiaj i, co najdziwniejsze, udalo mi sie tez sciagnac mapke na dysk (nawet 2), a przy zmianie ilosci kafelkow z 10 na 30 wyskoczyl mi blad i juz wyskakuje w zaparte przy kazdej probie... zresetowalem kompa, przeinstalowalem pythona i PIL i problem nie znika

      potrzebuje tego zdj sat. w wysokiej rozdzielczosci na potrzeby mojego dyplomu magisterskiego... Mógłbym Cię poprosić o odpalenie skryptu i zuploadowanie pliku? (oczywiscie jak znajdziesz chwile czasu)

      python.exe pobieraczmap.py mapazeskryptu.png 52.2374526 20.9185871 20 60 40 satelita


      chodzi dokladnie o ten obszar (z kawalkiem otoczenia):
      http://imagizer.imageshack.us/v2/1600x1200q90/673/UulSAr.jpg

      Bylbym bardzo wdzieczny

      Usuń
    3. W sumie to przepraszam za tego posta powyżej, postaram się znaleźć inną drogę, żeby rozwiązać ten problem...

      Usuń
  24. Dzisiaj, gdy wpisalem inna szerokosc/dlugosc, skrypt znowu zadzialal (tylko z domyslnym zoomem/wielkoscia obrazka), ale po zmianie zoomu na 20 i rozmiaru 60/40 kafli, wyrzuca ten sam błąd i niestety juz robi to samo niezaleznie od ustawien, stad kilka pytan:

    Czy udalo Ci się juz sciagnac z jego pomoca mapę, ktorej rozmiar byl zblizony do 60/40 kafelkow?
    Zastanawiam się czy np. mógłbym odpalac ten program z parametrami nie poprzez wiersz polecen, a w jakis inny sposob (tak, zebym mogl chociaz wklejac wspolrzedne)?
    Ponadto, chciałbym spróbować z innymi adresami serwerów, ale niestety ten link do adresów wygasł...

    Staram się znalezc jakis inny sposób na pobranie zdjec satelitarnych, ale do tej pory na nic nie trafilem (a reczne screenowanie/ciecie/laczenie w tym przypadku bedzie wymagalo wielu godzin pracy)

    Serdecznie pozdrawiam

    OdpowiedzUsuń
  25. juz rozumiem... próbowałem sciagnac mape za pomocą innego programu i zostalem upomniany, ze moje IP jest zbanowane...

    OdpowiedzUsuń
  26. Witam,

    czy jest jakiś sposób na pobieranie zdjęc z tej strony bez znaku wodnego?

    http://www.gettyimages.com/license/140957944

    Dziękuję za pomoc!

    OdpowiedzUsuń
  27. a publicznie masz udostępnione ze znakiem wodnym czy bez ?
    Moim zdaniem wyraźnie nadużywasz cierpliwości Autora strony

    OdpowiedzUsuń
  28. Jak uruchomic ten skrypt?

    OdpowiedzUsuń
  29. Świetny wpis. Będę na pewno tu częściej.

    OdpowiedzUsuń