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.
Niestety pobieranie map google w ten sposób jest nielegalne i oznacza łamanie regulaminu.
OdpowiedzUsuń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.
Usuń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.
Na własny użytek jest legalne
UsuńWitam!
OdpowiedzUsuń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?
Sporo by było do przerabiania:
Usuń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 ??
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.
Usuń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.
Mogę, do tej drugiej, za chwilę napiszę, wystarczy polecieć kolejno po numerach kafelków bez bawienia się w skomplikowane obliczenia.
UsuńTu masz skrypt do pobierania drugiej mapy,
Usuń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
Marek, wielkie dzięki! :)
Usuń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)?
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.
Usuń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.
Zainstalowałem najnowszego Pythona 3.3.1 w folderze C:\Program Files\Python. Skrypt, tak jak pisałeś, przeniosłem też do folderu Python.
Usuń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?
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)
Usuń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.
Znowu jakiś błąd:
Usuń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.
Coś mi ucięło fragmenty komunikatu w nawiasach ostrokątnych (tym razem zastępuję je okrągłymi):
UsuńTraceback (most recent call last):
File "czeskipobieracz.py", Line 7, in (module)
import Image
ImportError: No module named 'Image'
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)
UsuńJakąś wersję pod windows znalazłem na http://www.pythonware.com/products/pil/
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?
UsuńEwentualnie jeśli zainstaluję Pythona 2.7 i do tego PIL 1.1.7, to czy skrypt będzie działał?
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ń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ć.
UsuńCzy jest jakiś sposób, żeby to coś działało w miarę normalnie pod Windowsem?
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.
Usuń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.
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.
Usuń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)?
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.
Usuń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.
A jak odpalić skrypt w Ubuntu? Wystarczy dwuklik na plik, czy coś trzeba jeszcze robić?
Usuń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.
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).
Usuń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.
Jak się używa tego skryptu?
OdpowiedzUsuńPo uruchomieniu wyświetla się dokładna instrukcja.
UsuńW skrócie: trzeba jako parametr podać nazwę pliku i współrzędne geograficzne.
Wyświetla mi błąd "Syntaxerror line 29"
UsuńA nie zmieniałeś tam niczego?
UsuńJaką masz wersję pythona?
Niczego nie zmieniałem, wersję posiadam 3.3:-)
Usuń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ńMarku czy mogę Ci podesłać na maila printscreen?
OdpowiedzUsuńDalej mi wyskakuje błąd:/
Czy w wierszu trzeba podawać stronę z której się chce ściągnąć zdjęcia?
A czy jest możliwość pobrania z tej strony:
OdpowiedzUsuńhttp://www.googleartproject.com
Wydaje się, że działa podobnie, jak google maps.
Tyle, że to ma kafelki w jakimś dziwnym formacie.
UsuńWitam, czy dałbyś radę zrobić podobny skrypt na tę mapę?
OdpowiedzUsuńhttp://tiny.pl/h86j4
Pozdrawiam, Wojtek
Tak, wystarczy zamienić 2 linijki
Usuń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)
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.
UsuńPozdrawiam, Wojtek
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.
Usuń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.
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?
UsuńPozdrawiam, Wojtek
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.
UsuńPrzykładowe polecenie
./pobieraczmap.py mapa.png 50.921888 14.090567 15
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).
OdpowiedzUsuń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
Te które są podobne
Usuń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
A mógłbyś wrzucić skrypt na jakiś inny hosting, bo ta nowa strona Kima często ma awarie (teraz na nieszczęście też)?
UsuńPS. Rozumiem, że w tym wariancie również należy dodać na końcu polecenia liczbę kafelków, np. "10 10"?
Pozdrawiam, Wojtek
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ę ;)
Usuń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
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)
Usuń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.
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! :)
UsuńŻ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
Hej!
OdpowiedzUsuń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".
Usuń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.
Hej!
OdpowiedzUsuń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!
PS. To było oczywiście w sprawie skryptu do: http://www.katastralni-mapa.cz
UsuńOK https://sites.google.com/site/marekdrwota/czeskipobieracz2.py
Usuń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ć
Wielkie dzięki! :)
Usuń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?
Tak na końcu podaje się wymiary.
Usuń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
Niby ściąga mapę, ale nie ten obszar co powinien
Usuń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?
OdpowiedzUsuńpozdro
kuba
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ń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:
OdpowiedzUsuń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
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ń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ńNiestety ale strona udostępnia dane jedynie w formie obrazków.
UsuńByć może są jakieś inne sposoby na obranie się do tych danych ale nic nie wiem na ten temat.
Witam,
OdpowiedzUsuń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
https://sites.google.com/site/marekdrwota/pobieracz_mapy_wroc.py
Usuń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
Podałem np. takie polecenie dla pierwszej mapy:
Usuń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.
Dwie rzeczy:
Usuń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).
Już działa :)
Usuń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ł?
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:
Usuńhttp://fotus.pl/przegladarka/b1G
http://fotus.pl/przegladarka/b1J
Do 4 poziomu zooma działa dobrze i można pobrać całość za jednym razem.
Usuń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.
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 :)
Usuń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ę?
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
Usuń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
Przerobiłem mój skrypt, tak aby dział dla każdego powiększenia i sam rozpoznawał rozmiary mapy (wystarczy adres jednego kafelka).
Usuń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.
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
Usuń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?
Skrypt nie konwertuje tylko tworzy zupełnie nowy obraz do którego wkleja poszczególne kafelki, można sobie wybrać w jakim.
Usuń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
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ńTak będzie działać.
OdpowiedzUsuń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:
OdpowiedzUsuń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
Hej!
Usuń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!
Dałoby radę skrypt dla wikimapii i bingsa ?
OdpowiedzUsuńBłąd jest taki
OdpowiedzUsuń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
Razem z nowymi zdjęciami satelitarnymi nieznacznie zmienił się link, teraz jest v=166
UsuńJuż poprawiłem w skrypcie, można pobrać nową wersję (albo zmienić link samemu).
Witam Panie Marku nie wiem czy dobrze zrobiłem:
OdpowiedzUsuń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?
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
UsuńPoza tym skrypt od googla oczekuje, że poda mu się długość i szerokość geograficzną a nie adres do strony.
A szerokosc i dlugosc geograficzna z tego linku
OdpowiedzUsuń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 ?
czy moglby pan napisac mi jak ma wyglądac poprawne polecenie dla tej strony ?
OdpowiedzUsuń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ę
pobieraczmap.py mapa.png 25.780196 -80.188977
Usuń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
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ńW bieżącym katalogu.
UsuńNiestety w folderze z Pythonem nie ma zadnych zapisanych obrazów. Czy skrypt pobieraczmap trzeba edytoiwac, czy wystarczy tylko go zapisac na dysku ?
OdpowiedzUsuńNapisałem przecież, że nie tam gdzie python tylko w bieżącym katalogu.
Usuń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
Wpisalem to polecenie w konsoli python.exe ale pojawia się komunikat SyntaxError invalid syntax
OdpowiedzUsuńFile line 1
Jeśli chcesz korzystać tylko z map googla to nie ma potrzeby edytowania skryptu.
Usuń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
Cześć, wielkie dzięki za ten skrypt, jest genialny
OdpowiedzUsuń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)
U mnie działa.
Usuń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ą.
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
Usuń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
W sumie to przepraszam za tego posta powyżej, postaram się znaleźć inną drogę, żeby rozwiązać ten problem...
Usuń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:
OdpowiedzUsuń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
juz rozumiem... próbowałem sciagnac mape za pomocą innego programu i zostalem upomniany, ze moje IP jest zbanowane...
OdpowiedzUsuńWitam,
OdpowiedzUsuń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!
a publicznie masz udostępnione ze znakiem wodnym czy bez ?
OdpowiedzUsuńMoim zdaniem wyraźnie nadużywasz cierpliwości Autora strony
Jak uruchomic ten skrypt?
OdpowiedzUsuńŚwietny wpis. Będę na pewno tu częściej.
OdpowiedzUsuń