2016-08-24 5 views
0

Моя задача - наложить пользовательские маркеры на изображение карты, которое я создаю с помощью API Google Static Maps.Наложение маркеров на Google Static Maps image

Проблема в том, что наложенные маркеры всегда немного отличаются от их исходного положения или, если быть точным, их положение выглядит как зеркальное отражение.

Я читал о том, как преобразовать из сферических координат в декартовы, используя проекцию Меркатора, но что-то не так, и у меня нет никаких идей.

Это мой PHP код:

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); 
} 

}

Вот как это выглядит на карте:

enter image description here

И это то, что я получаю:

enter image description here

Я был бы признателен за любую помощь.

ответ

1

Вы можете использовать (до 5 уникальных) custom icons in markers.

IMO, наложение значков поверх уже сделанной карты, требует большой головной боли.