我正在使用C#为Google map 构建图块叠加服务器,并且发现了一些不同的代码示例,可以根据纬度计算Y。在使它们正常工作之后,我开始注意到某些情况下叠加层无法正确排列。为了测试这一点,我做了一个测试工具,将Google Map的Mercator LatToY转换与我在网上找到的公式进行比较。如下所示,它们在某些情况下不匹配。

案例1



案例#2



考试:



结果:
Equator http://www.kayak411.com/Mercator/MercatorComparison%20-%20Equator.png
North Zoomed Out http://www.kayak411.com/Mercator/MercatorComparison%20-%20North%20Zoomed%20Out.png

查看最顶部和最底部的行:
North Top & Bottom Example http://www.kayak411.com/Mercator/MercatorComparison%20-%20North%20Zoomed%20Out%20-%20TopAndBottom.png

放大时,问题在视觉上会变大,但数值会变小:
alt text http://www.kayak411.com/Mercator/MercatorComparison%20-%20North%20Zoomed%20Midway.png

而且,无论屏幕方向如何,它都将以更近的缩放级别消失。
alt text http://www.kayak411.com/Mercator/MercatorComparison%20-%20North%20Zoomed%20In.png

编码:

Google Maps客户端代码:

            var lat = 0;
        for (lat = -80; lat <= 80; lat += 5) {
            map.addOverlay(new GPolyline([new GLatLng(lat, -180), new GLatLng(lat, 0)], "#FF0033", 2));
            map.addOverlay(new GPolyline([new GLatLng(lat, 0), new GLatLng(lat, 180)], "#FF0033", 2));
        }

服务器端代码:


 protected override void ImageOverlay_ComposeImage(ref Bitmap ZipCodeBitMap)
        {
            Graphics LinesGraphic = Graphics.FromImage(ZipCodeBitMap);

            Int32 MapWidth = Convert.ToInt32(Math.Pow(2, zoom) * 255);

            Point Offset =
                Cartographer.Mercator2.toZoomedPixelCoords(North, West, zoom);

            TrimPoint(ref Offset, MapWidth);

            for (Double lat = -80; lat <= 80; lat += 5)
            {
                Point StartPoint = Cartographer.Mercator2.toZoomedPixelCoords(lat, -179, zoom);
                Point EndPoint = Cartographer.Mercator2.toZoomedPixelCoords(lat, -1, zoom);

                TrimPoint(ref StartPoint, MapWidth);
                TrimPoint(ref EndPoint, MapWidth);

                StartPoint.X = StartPoint.X - Offset.X;
                EndPoint.X = EndPoint.X - Offset.X;

                StartPoint.Y = StartPoint.Y - Offset.Y;
                EndPoint.Y = EndPoint.Y - Offset.Y;


                LinesGraphic.DrawLine(new Pen(Color.Black, 2),
                    StartPoint.X,
                    StartPoint.Y,
                    EndPoint.X,
                    EndPoint.Y);

                LinesGraphic.DrawString(
                    lat.ToString(),
                    new Font("Verdana", 10),
                    new SolidBrush(Color.Black),
                    new Point(
                        Convert.ToInt32((width / 3.0) * 2.0),
                        StartPoint.Y));
            }
        }

        protected void TrimPoint(ref Point point, Int32 MapWidth)
        {
            point.X = Math.Max(point.X, 0);
            point.X = Math.Min(point.X, MapWidth - 1);

            point.Y = Math.Max(point.Y, 0);
            point.Y = Math.Min(point.Y, MapWidth - 1);
        }

那么,有人遇到过吗?我敢问,解决了吗?还是仅仅拥有更好的Mercator Project坐标转换的C#实现?

谢谢!

最佳答案

谢谢大家的建议和帮助。

我最终发现这不是一个公式或技术问题,我相信这是一个方法论问题。

您无法以纬度/经度格式定义查看区域,而期望使用适当的墨卡托投影来填充该 View 区域。那就是失真发生的地方。相反,您必须在Mercator中定义正确的查看框,并在Mercator中进行项目。

这样一来,我就能正确匹配Google map 。

关于c# - Google Maps的Mercator通用投影公式无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2656580/

10-13 04:03