Portál AbcLinuxu, 30. dubna 2025 10:09

Jak stáhnout Google maps

13.2.2008 20:09 | Přečteno: 5968× | Ruzne | poslední úprava: 21.5.2009 15:26

Měl bych se sice šrotit na zkoušky a psát zápočtové programy, ale je to taková nuda... A tak bezcílně brouzdám webem a dnes se mi konečně podařilo najít něco zajímavého. Vždycky jsem si lámal hlavu, jaký mají u Googlů systém pojmenování bloků map a světe div se, dneska jsem to našel úplně náhodou v blogu jednoho machra z Francie.

Podívejte se na to, je to sice francouzsky, ale i bez její znalosti lze pochopit o co jde. Má tam dokonce funkci v C, která podle zoomu a pravoúhlých souřadnic vrátí adresu odpovídajícího bloku mapy. Napadlo mě tedy, že si prostě musím ty mapy za každou cenu stáhnout a složit z těch bloků :-). Tak jsem si na to napsal prográmek. Ten stáhne bloky wgetem a pomocí montage z ImageMagicku ty bloky poskládá dokupy. A ono to dokonce funguje.

Tady je ten prográmek. Přeložíte takto: gcc -std=c99 get-map.c -o get-map. Jsem lenoch líná, tak zoom si musíte nastavit v kódu, ostatní už funguje samo. Přeju hodně zábavy!

Pro ty co mají silné stroje: jak velkou mapu se vám podařilo složit?


#include <stdio.h>
#include <string.h>

char* getBlock(char* url, unsigned int x, unsigned int y, unsigned int zoom)
{
	strcpy(url, "http://kh*.google.com/kh?n=404&v=3&t=t")[9] = '0' + (x + y) % 4;

	if(!zoom)
		return url;

	for(unsigned long c = 1 << (zoom - 1); c != 0; c >>= 1)
		if(y < c)
		{
			if(x < c)
				strcat(url, "q");
			else
			{
				strcat(url, "r");
				x -= c;
			}
		}
		else
		{
			if(x < c)
			{
				strcat(url, "t");
				y -= c;
			}
			else
			{
				strcat(url, "s");
				x -= c;
				y -= c;
			}
		}
	
	return url;
}

int main(void)
{
	int zoom = 3, num = 0;
	char cmd1[100], cmd2[100];
	
	for(int y = 0; y < 1 << zoom; y++)
		for(int x = 0; x < 1 << zoom; x++)
		{
			sprintf(cmd2, "wget \"%s\" -O google-maps-block-%.6d.jpg", getBlock(cmd1, x, y, zoom), num++);
			system(cmd2);
		}
		
	sprintf(cmd1, "montage -geometry %dx%d +frame -tile %dx%d -verbose google-maps-block-* map-zoom-%d.jpg", 256, 256, 1 << zoom, 1 << zoom, zoom);
	system(cmd1);
	system("rm google-maps-block-*");
		
	return 0;
}

Tak moje pokusy dopadly následovně :-D. Těch bloků jsem stáhnul několik tisíc. Asi hodím mezi jednotlivé wgety nějaký sleep, a nechám to běžet přes noc.

Google Error	 

    We're sorry...

    ... but your query looks similar to automated requests from a computer virus or spyware 
application. To protect our users, we can't process your request right now.

    We'll restore your access as quickly as possible, so try again soon. In the meantime, if you 
suspect that your computer or network has been infected, you might want to run a virus checker or 
spyware remover to make sure that your systems are free of viruses and other spurious software.

    We apologize for the inconvenience, and hope we'll see you again on Google.

Největší mapu, co se mi podařilo složit byl zoom = 5, čili 1024 bloků, výsledná bitmapa má 8192x8192 bodů a málem se mi u toho upekl počítač. Paměťové nároky toho programy montage jsou nějaké velké.

       

Hodnocení: 100 %

        špatnédobré        

Obrázky

Jak stáhnout Google maps, obrázek 1

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

13.2.2008 20:44 zde | skóre: 9 | blog: Linuch | Brno
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Odpovědět | Sbalit | Link | Blokovat | Admin
Hmm, to jsem netušil že google maps to mají tak kryptický a neefektivní (co bit to jeden znak v url). Seznam.cz to má triviální, až na tu podivnou projekci. Ta se nedá moc pochopit (klasická S-42 to skoro určitě není), ale dá se aproximovat.
Táto, ty de byl? V práci, já debil.
13.2.2008 20:54 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps

Co znak, to 2 bity, ne?

A jak je to tedy s tím Seznam.cz?

Pochybnost, nejistota - základ poznání
andree avatar 13.2.2008 23:05 andree | skóre: 39 | blog: andreeeeelog
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
tak to je fajnove... este k tomu mat kalibraciu a bolo by to dokonale.. nema niekto nieco podobne pre atlas/centrum/seznam/zoznam? :)
14.2.2008 00:50 Radek Podgorny | skóre: 16
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
seznam.cz hint: UTM zona 33
13.2.2008 21:39 Stevko
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Odpovědět | Sbalit | Link | Blokovat | Admin
To by chcelo stiahnúť napríklad celú Prahu a/alebo Bratislavu. Bude to ľahšie na Sezname alebo na Google Maps?Skúsi to niekto?
13.2.2008 23:22 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Tak jsem udělal tu Prahu. Není úplně celá, protože na to nemám dost paměti. Stáhnout můžeš zde. Má to 57 MB.
Pochybnost, nejistota - základ poznání
14.2.2008 01:12 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Tak ještě jednou Praha v rozlišení 15104x9728, 85 MB. Link
Pochybnost, nejistota - základ poznání
14.2.2008 09:38 klassik | skóre: 24 | blog: Klassikov | Praha
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Dobra prace cece :-)
V podstatě nic nevím
13.2.2008 23:30 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Jinak takový obrázek si můžeš udělat taky pomocí toho programu v blogu. Stačí si zjistit kód nějakého bloku vlevo do toho co chceš stáhnout (např. trtqtrtsqtqsrtsttr) a přepočítat ho na pravoúhlé souřadnice pomocí tohohle algoritmu:
void code2location(char* code)
{
	unsigned int x = 0, y = 0;
	
	for(int i = 1; i < strlen(code); i++)
	{
		x = (x << 1) | ((code[i] == 'r' || code[i] == 's') ? 1 : 0);
		y = (y << 1) | ((code[i] == 't' || code[i] == 's') ? 1 : 0);
	}
	
	printf("locatiton = [%d; %d], zoom = %d", x, y, strlen(code) - 1);
}

Výstupem pro trtqtrtsqtqsrtsttr je:

locatiton = [70761; 44382], zoom = 17

Získaná čísla potom dosadíš do toho programu a je to.

Pochybnost, nejistota - základ poznání
14.2.2008 00:36 Stevko
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Vidím, kam dosadím zoom. A kam dosadím x a y? A kde nastavím pokiaľ chcem tie bloky (pravý dolný roh)?
14.2.2008 00:46 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps

Jde o nastavení levého horního rohu. Je třeba upravit ty vnořene cykly takhle:

	for(int y = odkud_v_ose_y; y < potud_v_ose_y; y++)
		for(int x = odkud_v_ose_x; x < potud_v_ose_x; x++)

A potom ještě tenhle řádek:

sprintf(cmd1, "montage -geometry %dx%d +frame -tile %dx%d -verbose google-maps-block-* map-zoom-%d.jpg", 256, 256, potud_v_ose_x - odkud_v_ose_x, potud_v_ose_y - odkud_v_ose_y, zoom);

Kde location = [odkud_v_ose_x; odkud_v_ose_y] zoom = 17

Pochybnost, nejistota - základ poznání
Milan Lajtoš avatar 13.2.2008 22:27 Milan Lajtoš | skóre: 22 | blog: /blog/babraq
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Odpovědět | Sbalit | Link | Blokovat | Admin
Bolo by pekne, keby niekto pouzil informacie z clanku o Marble a pokusil sa o to aby Marble dostaval mapy z Google Maps.. To by bolo uzasne, len neviem, ci legalne.. ;)
“Every great achievement was once considered impossible.”
13.2.2008 23:13 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Niekto? A preco nie Ty?
Pochybnost, nejistota - základ poznání
Milan Lajtoš avatar 13.2.2008 23:49 Milan Lajtoš | skóre: 22 | blog: /blog/babraq
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Keby som bol kamarat s C++, tak by som to samozrejme vyskusal, no realita je trosku ina.. A samozrejme nenutim nikoho do toho ist - len som dal ideu.. Nic viac..
“Every great achievement was once considered impossible.”
belisarivs avatar 14.2.2008 13:58 belisarivs | skóre: 22 | blog: Psychobláboly
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Odpovědět | Sbalit | Link | Blokovat | Admin
Poslal jsem odkazy a prelozenou diskusi k tematu vyvojarum Marble.

Neumim moc programovat, ale domluvit to muzu. Tak snad to nikomu nebude vadit.
IRC is just multiplayer notepad.
belisarivs avatar 14.2.2008 14:02 belisarivs | skóre: 22 | blog: Psychobláboly
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Kdo tomu rozumite vic, tady je ten vyvojar:

Torsten Rahn - torsten.rahn@credativ.de
IRC is just multiplayer notepad.
belisarivs avatar 14.2.2008 14:55 belisarivs | skóre: 22 | blog: Psychobláboly
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Hm, tak je to nelegalni. Skoda.
IRC is just multiplayer notepad.
14.2.2008 16:59 Käyttäjä 11133 | skóre: 58 | blog: Ajattelee menneisyyttä
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
No není nelegální pro to naprogramovat podporu :-) S těmi daty v té mapě je to stejný jako s datovými soubory u slovníků.
15.2.2008 15:43 R
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Odpovědět | Sbalit | Link | Blokovat | Admin
ImageMagick je pomaly a zravy. Dokonca sa aj neuveritelne dlho kompiluje...
16.2.2008 12:33 Marble | skóre: 27 | blog: marble
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
K té žravosti -- mám pocit, že na většině distribucí je zkompilovaný s tím, že interně používá 16bit na barvu, takže překompilováním by se mělo dát dosáhnout poloviční spotřeby paměti a adekvátně vyšší rychlosti. Použít parametr -depth nepomůže, ten ovlivňuje jen vstup/výstup, takže nakolik tuším, je to fakt třeba nastavit při kompilaci. (Sám jsem to nezkoušel, takže uvedené info je s omezenou zárukou. :))
17.2.2008 09:43 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Jo to by mohlo být, podívám se na to, díky.
Pochybnost, nejistota - základ poznání
16.2.2008 21:56 Geograf
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Odpovědět | Sbalit | Link | Blokovat | Admin
Snad to neni moc off topic, ale jen pro informaci: lepsi mapy nez na google ci na seznamu/atlasu najdete na http://geoportal.cenia.cz (pro CR) a http://www.geoportal.sk (pro SR). Je potreba si zapnout rastrovou zakladni mapu v meritku 1:10.000. Ta slovenska sice neni zrovna nejaktualnejsi, ale i mimo intravilan tam vidite detaily, ktere na ortofotu pod vegetaci neuvidite. Stazeni je celkem trivialni, staci orez a odstraneni vodoznaku, coz pri pevnem poctu barev mapy neni tak slozity ukol...

K vytvareni obrazku z dlazdic: Osobne jsem pouzival metodu, ze stahnu dlazdice a vyrobim HTML stranku s obrovskou tabulkou (pole tabulky=obrazek) a tuto stranku zkonvertuji do PDF. I zde existuji omezeni (rozmer PDF souboru by mel byt mensi nez 200 palcu, pri velikosti vysledneho PDF nad 750 MB jsou s tim problemy). Lepsi varianta je pri stahovani dlazdic vyrobit soubor, ktery da obrazek do souradnicoveho systemu (napr. k obrazku dlazdice_01_01.tif soubor dlazdice_01_01.tfw) a hodit to do nejakeho GISu. Stejne asi nikdo nema monitor, kde by byl obrazek 20.000x20.000 viditelny v meritku 1:1 :-)
17.2.2008 09:43 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: Jak stáhnout Google maps
Díky za tipy.
Pochybnost, nejistota - základ poznání

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.