• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Google maps support

peter.poetzi

Geocacher
Hallo,

ich habe mal ein programm geschrieben, mit denen man google maps karten "spidern" kann. Auch Geokalibrierung( ca. +0.1m) ist eingebaut.

Hier die Funktionen:

Download:
Code:
function get($url,$head,$timeout,$useragent){

		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_HEADER, $head);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
		curl_setopt($ch, CURLOPT_TIMEOUT,$timeout);

		curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
		$r=curl_exec($ch);
		curl_close($ch);
		return $r;
}
function save_image($x,$y,$z,$filename){
	$img=get("http://khm0.google.at/kh/v=67&x=$x&y=$y&z=$z",0,10,"Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
	$f=fopen($filename,"w");
	fwrite($f,$img);
	fclose($f);
	}

save_image($x,$y,$zoom,"data/$zoom/$x-$y-$zoom.jpg");}}

$x und $y kann man damit ermitteln:

Code:
    function ToNormalisedPixelCoords($lat,$lng)
    {
      // first convert to Mercator projection
      // first convert the lat lon to mercator coordintes.
      if ($lng > 180.0)
      {
        $lng -= 360.0;
      }

      $lng = (180.0 + $lng) / 360.0;
      $lat = 0.5 - log(tan((pi() / 4.0) + ((pi() * $lat) / (2.0 * 180.0)))) / (2.0 * pi());

	  $ret[]=$lng;
	  $ret[]=$lat;
	  return $ret;    
}
function ToTileXY($lng,$lat,$zoom)
    {
      $in=ToNormalisedPixelCoords($lat,$lng);
	  
	  $lng=$in[0];
	  $lat=$in[1];
	  
      $scale = 1 << $zoom;

      $x = (int)($lng * $scale);
      $y = (int)($lat * $scale);

	  $r['x']=$x;
	  $r['y']=$y;
	  return $r;
    }

$center=ToTileXY($lng,$lat,$zoom);
$x=$center['x'];
$y=$center['y'];

Und wenn man den ausschnitt hat($x und $y) kann man auch ermitteln wo welcher punkt ist:

Code:
function GetTileRect($x,$y,$zoom){// out double topLat, out double leftLong, out double bottomLat, out double rightLong)

      $tilesAtThisZoom = 1 << $zoom;
      $lngWidth = 360 / $tilesAtThisZoom; // width in degrees longitude
      $leftLong = -180.0 + ($x * $lngWidth); // left edge in degrees longitude
      $rightLong = $leftLong + $lngWidth;

      $latHeightMerc = 1.0 / $tilesAtThisZoom; // height in "normalized" mercator 0,0 top left
      $topLatMerc = $y * $latHeightMerc; // top edge in "normalized" mercator 0,0 top left
      $bottomLatMerc = $topLatMerc + $latHeightMerc;

      
	  $bottomLat = (180.0 / pi()) * ((2.0 * atan(exp(pi() * (1.0 - (2.0 * $bottomLatMerc))))) - (pi() / 2.0));

      $topLat =    (180.0 / pi()) * ((2.0 * atan(exp(pi() * (1.0 - (2.0 * $topLatMerc))))) - (pi() / 2.0));
	  

	  
	  $cord[0]=$leftLong;
	  $cord[1]=$rightLong;
	  $cord[2]=$topLat;
	  $cord[3]=$bottomLat;
	  return $cord;
    }
$cord=GetTileRect($x,$y,$zoom);

hier habe ich noch eine Funktion geschrieben, um die Bilder zusammenzufügen:
Code:
$gesamt=imagecreatetruecolor((256*(($anz*2)+1)),(256*(($anz*2)+1)));

for($i=$center['x']-$anz;$i<=$center['x']+$anz;$i++){
for($j=$center['y']-$anz;$j<=$center['y']+$anz;$j++){

	$im = imagecreatefromjpeg("data/$zoom/$i-$j-$zoom.jpg");
	$dst_x=($i-$center['x']+($anz))*256;
	$dst_y=($j-$center['y']+($anz))*256;
	imagecopy  ($gesamt,$im,$dst_x,$dst_y,0,0,256,256);//, int $src_w  , int $src_h  )
	imagedestroy($im);
	


}}

und hier noch eine funktion zum einzeichnen von caches(die wird man natürlich verändern müssen:
Code:
function circle($im,$lat,$lng,$cx,$cy,$anz,$wayp){
	global $zoom;
	
	$center=ToTileXY($lng,$lat,$zoom);
	
	$new_x=256*($center['x']-$cx)+($anz*256);
	$new_y=256*($center['y']-$cy)+($anz*256);


	$rect=GetTileRect($center['x'],$center['y'],$zoom);//left - right - top - bottom

	$height=$rect[2]-$rect[3];
	$width=$rect[1]-$rect[0];

	$y=(($rect[2]-$lat)/$height)*256;
	$x=256-(($rect[1]-$lng)/$width)*256;

	if(substr($wayp,0,2)=="GC"){imagefilledellipse($im,$x+$new_x,$y+$new_y,10,10,imagecolorallocate($im,255,0,0));
	
	imagefilledrectangle($im,$x+$new_x+12,$y+$new_y-8,$x+$new_x+80,$y+$new_y+8,imagecolorallocate($im,255,255,255));
	imagestring($im,5,$x+$new_x+12,$y+$new_y-8,$wayp,imagecolorallocate($im,255,0,0));}
}

foreach ($xml->cachelist[0]->CACHE as $cache) {

	$c_lat=floatval(str_replace(",",".",$cache['lat']));
	$c_lon=floatval(str_replace(",",".",$cache['lon']));
   	circle($gesamt,$c_lat,$c_lon,$center['x'],$center['y'],$anz,$cache['wayp']);
	echo $cache['lat'].",".$cache['lon']."<br>";
   }
die Funktionen sind zwar in PHP geschrieben, können aber ohne weiteres in Java umgeschrieben werden.

ich hofffe, ich helfe euch damit, gmaps so schnell wie möglich einzubauen, die karten die schon verfügbar sind, sind immer ca. 50m daneben.

peter.poetzi(at)gmail(dot)com
 
OP
P

peter.poetzi

Geocacher
Beispielsgrafik:
gesamt141.jpg
 

greiol

Geoguru
sieht gut aus, aber passt es zu http://www.google.com/intl/de_de/help/terms_maps.html und http://www.google.com/intl/de_de/help/legalnotices_maps.html ?
 
OP
P

peter.poetzi

Geocacher
ich nutze at photo und at kompass.

und ich weiß nicht ob das erlaubt ist, aber das spidern von GC.com ist doch auch verboten.
 

arbor95

Geoguru
peter.poetzi schrieb:
ich nutze at photo und at kompass.

und ich weiß nicht ob das erlaubt ist, aber das spidern von GC.com ist doch auch verboten.

du hast die zweite Frage nicht beantwortet. Da könntest du sehen wie gmaps - Karten in CW reinkommen können.

und at Kompass ist schlecht kalibriert ? Für at photo hätte ich es noch geglaubt! Ich hatte at kompass mal mit google verglichen. Da sah es gleich aus. Da liegt auch bei entsprechenden Auflösungen die google Karte drunter.
 
OP
P

peter.poetzi

Geocacher
nein, ich kenne den Mobile Atlas Creator nicht.
Aber warum wird denn jetzt Gmaps von CW nicht unterstützt?
 

arbor95

Geoguru
CW nimmt alle Karten ( Bitmap mit Kalibrierungsinfos).
1.
Aber CW bietet im Moment nur Downloads von Expedia, freien wms-Servern und OSM-Karten über Kosmos(einem freien OSM Renderer).
2.
Alle OZI-Bitmap Karten können importiert werden, wobei die CW - Kalibrierungdateien erzeugt werden.
3.
Man kann Beliebige Bitmap-Dateien selber kalibrieren.
4.
Vom oben genannten Mobile Atlas Creator können Karten von vielen verschiedenen Quellen, u.a. auch Google, für die Nutzung in CW durch direkten Export erzeugt werden. Die Dateinamen werden nur bei erstmaliger Verwendung noch umbenannt.

Also müssen wir da nichts mehr selber schreiben. Das funktioniert super.
 

klausundelke

Geowizard
peter.poetzi schrieb:
Wofür sind denn die ersten 4 Zeilen der Kalibrierungsdateien
... schau doch mal einfach in die Doku unter 5.2:

http://cachewolf.aldos.de/rc/r2734/Handbuch_html/CacheWolf_Dokumentation.html#id2691838

hilft Dir das weiter?
Und ansonsten befolge doch einfach mal die Ratschläge, die du schon
bekommen hast:

http://mobac.dnsalias.org/

Erstellt aus einer Vielzahl von Quellen Karten in unterschiedlichen Maßstäben
u.a. auch direkt für Cachewofl.
Warum soll dieser mit einer Funktion ausgestattet werden, die in einem anderen
frei verfügbaren Programm schon perfekt umgesetzt ist? Da gibt es sicher
wichtigere (+auch sinnvollere) Baustellen...
 

arbor95

Geoguru
klausundelke schrieb:
peter.poetzi schrieb:
Wofür sind denn die ersten 4 Zeilen der Kalibrierungsdateien
... schau doch mal einfach in die Doku unter 5.2:

http://cachewolf.aldos.de/rc/r2734/Handbuch_html/CacheWolf_Dokumentation.html#id2691838

hilft Dir das weiter?...
Ich glaube die Frage bezog sich nicht auf die map-Datei sondern auf die wfl-Datei.

Das kann Pfeffer besser beantworten.
Im Prinzip entspricht das dem WORLD FILE mit Bedeutung:
Die Reihenfolge weiss ich nicht:
Einheiten pro Bildpunkt in x-Richtung
Rotation um y-Achse
Rotation um x-Achse
Einheiten pro Bildpunkt in y-Richtung
 
OP
P

peter.poetzi

Geocacher
ah, danke

Code:
1: drehung y (=0.0)
2: latitude/pixel
3:longitude/pixel
4:drehung x (=0.0)
5:latutude oben
6:longitude links
7:latitude unten
8:longitude rechts
9:LEER
 

pfeffer

Geowizard
Bei manchen wfl-Dateien wird in die letzte Zeile der EPSG-Code geschrieben, in den die Koordinaten umgerechnet werden, bevor die darüber stehenden Transformationsparameter angewandt werden.

Man muss etwas aufpassen: leider sind bei Cachewolf zwei Zeilen gegenüber dem "offizielen" .wfl vertauscht (oder das Vorzeichen falsch rum - weiß ich grad nicht genau).

Gruß,
Pfeffer.
 
Oben