使用GMap.NET将地理坐标转换为静态谷歌地图图像中的像素

时间:2018-02-06 16:47:28

标签: c# google-maps gmap.net

我正在尝试从地理位置???,???创建静态地图 并且在该位置附近获取POI(名胜古迹),他们的地理位置是必需的,所以我认为我需要对它们进行单独的查询,而不仅仅是在静态搜索中为它们设置标记。

        //transform static map center to pixels
        var center = projection.mercator.FromLatLngToPixel(
            worldPosition.latitude,
            worldPosition.longitude,
            zoom
        );
        //iterate places
        foreach (Place place in map.places)
        {
            //transform place location to pixels
            var point = projection.mercator.FromLatLngToPixel(
                place.location.latitude,
                place.location.longitude,
                zoom
            );
            //calculate pixel position relative to the image center
            var pointRelativeToImage = center - point;

        }

然而,结果略有不正确,所以我的问题是我如何做到这一点? 这是计算像素位置的方法:(GMaps.Net.Projections.MercatorProjection)

  public override GPoint FromLatLngToPixel(double lat, double lng, int zoom)
  {
     GPoint ret = GPoint.Empty;

     lat = Clip(lat, MinLatitude, MaxLatitude);
     lng = Clip(lng, MinLongitude, MaxLongitude);

     double x = (lng + 180) / 360;
     double sinLatitude = Math.Sin(lat * Math.PI / 180);
     double y = 0.5 - Math.Log((1 + sinLatitude) / (1 - sinLatitude)) / (4 * Math.PI);

     GSize s = GetTileMatrixSizePixel(zoom);
     long mapSizeX = s.Width;
     long mapSizeY = s.Height;

     ret.X = (long)Clip(x * mapSizeX + 0.5, 0, mapSizeX - 1);
     ret.Y = (long)Clip(y * mapSizeY + 0.5, 0, mapSizeY - 1);

     return ret;
  }

1 个答案:

答案 0 :(得分:0)

解决了这个问题。 导致稍微不正确的结果是因为我正在计算相对于中心像素的像素,当我应该相对于左上角像素计算它们时。谷歌地图中的(0,0)像素。

解决方案:

        //translate place to pixels
        var needlePoint = m_mercator.FromLatLngToPixel(needle.latitude,
            needle.longitude,
            zoom);

        //translate map center to pixel
        var haystackPoint = m_mercator.FromLatLngToPixel(haystackCenter.latitude,
            haystackCenter.longitude,
            zoom);

        //calculate the top left pixel
        var haystackCorner = new Point(haystackPoint.x-(imageSize.x/2),
            haystackPoint.y-(imageSize.y/2));

        //translate the pixel to local space relative to the map
        var point = new Point(needlePoint.x - haystackCorner.x,
            needlePoint.y - haystackCorner.y);

这假设图像上的0,0像素位于左上角,显然我正在使用的图像API在左下角有0,0像素。