Meine Aufgabe besteht darin, benutzerdefinierte Markierungen auf ein Kartenbild zu überlagern, das ich mithilfe der Google Static Maps-API erzeuge.Überlagern von Markierungen auf einem Google Static Maps-Bild
Das Problem ist, dass überlagerte Marker immer ein bisschen von ihrer ursprünglichen Position entfernt sind, oder um genau zu sein, ihre Position sieht wie eine Spiegelreflexion aus.
Ich habe gelesen, wie man von sphärischen Koordinaten in kartesische mit der Mercator-Projektion konvertiert, aber etwas ist falsch und ich habe keine Ideen was.
Das ist mein PHP-Code:
class GoogleMaps
{
const TILE_SIZE = 256;
const MAP_IMAGE_SIZE = 640;
private function getMercatorProjection($zoomLevel, $lat, $lng)
{
$pixelGlobeSize = self::TILE_SIZE * pow(2, $zoomLevel);
$xPixelsToDegreesRatio = $pixelGlobeSize/360;
$yPixelsToRadiansRatio = $pixelGlobeSize/(2 * M_PI);
$halfPixelGlobeSize = $pixelGlobeSize/2;
// get x value
$x = ($lng + 180) * ($pixelGlobeSize/360);
// convert from degrees to radians
$latRad = $lat * M_PI/180;
// get y value
$mercN = log(tan((M_PI/4) + ($latRad/2)));
$y = ($halfPixelGlobeSize) -($pixelGlobeSize * $mercN/(2 * M_PI));
return ['x' => $x, 'y' => $y];
}
/**
* @return string
*/
private function getStaticMapsUrl()
{
$url = 'http://maps.googleapis.com/maps/api/staticmap?key=' .
env('GOOGLE_MAPS_API_KEY');
$url .= sprintf('&path=color:%s|weight:%d|',
env('GM_PATH_COLOR'), env('GM_PATH_WEIGHT'));
foreach ($this->points as $point) {
$url .= $point->lat . ',' . $point->lng . '|';
}
$url = rtrim($url, '|');
$url .= '&scale=1&size=' . self::MAP_IMAGE_SIZE .
'x' . self::MAP_IMAGE_SIZE
$url .= '¢er=' . $this->getMapCenter(true);
$url .= '&zoom=' . ($this->getMapZoom());
return $url;
}
private function combineMapImageWithMarker($mapImage, $marker)
{
$resDir = realpath(__DIR__ . '/../../resources');
$markerImgRes = imagecreatefrompng("$resDir/icons/marker.png");
$mapImageRes = imagecreatefrompng($mapImage);
$zoom = $this->getMapZoom();
$mapCenter = $this->getMapCenter();
$markerXY = $this->getMercatorProjection($zoom, $marker->lat, $marker->lng);
$mapCenterXY = $this->getMercatorProjection($zoom, $mapCenter['lat'], $mapCenter['lng']);
$imageX = floor((self::MAP_IMAGE_SIZE/2) + $mapCenterXY['x'] - $markerXY['x']);
$imageY = floor((self::MAP_IMAGE_SIZE/2) + $mapCenterXY['y'] - $markerXY['y']);
imagecopy($mapImageRes, $markerImgRes,
$imageX, $imageY,
0, 0, $markerW, $markerH);
}
}
Dies ist, wie es auf der Karte aussieht:
Und das ist, was ich bekommen:
Ich wäre für jede Hilfe dankbar.