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:
$x und $y kann man damit ermitteln:
Und wenn man den ausschnitt hat($x und $y) kann man auch ermitteln wo welcher punkt ist:
hier habe ich noch eine Funktion geschrieben, um die Bilder zusammenzufügen:
und hier noch eine funktion zum einzeichnen von caches(die wird man natürlich verändern müssen:
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
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>";
}
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