0

我的任务是将自定义标记叠加到我使用 Google Static Maps API 生成的地图图像上。

问题是重叠的标记总是有点偏离它们的原始位置,或者准确地说它们的位置看起来像镜面反射。

我读到了如何使用墨卡托投影将球坐标转换为笛卡尔坐标,但是出了点问题,我不知道是什么。

这是我的 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);
}

}

这是它在地图上的样子:

在此处输入图像描述

这就是我得到的:

在此处输入图像描述

如果有任何帮助,我将不胜感激。

4

1 回答 1

1

您可以在标记中使用(最多 5 个唯一的)自定义图标

IMO,在已经渲染的地图上覆盖图标是一件很头疼的事。

于 2017-01-26T13:25:29.973 回答