2016-08-24 3 views
0

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 .= '&center=' . $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:

enter image description here

Und das ist, was ich bekommen:

Ich wäre für jede Hilfe dankbar.

Antwort

1

Sie können (bis zu 5 einzigartige) custom icons in markers verwenden.

IMO, das Überlagern von Symbolen auf einer bereits gerenderten Karte verlangt nach großen Kopfschmerzen.

Verwandte Themen