当前位置: 首页 > 知识库问答 >
问题:

将EPSG:4326投影转换为EPSG:3857墨卡托投影

梁德馨
2023-03-14

我正在使用sharpmap将MSSQL中的边界(几何体)渲染为PNG图像。这一切都很好,除了国家在平面图像格式上看起来太“宽”。

据我所知,我需要创建到EPSG:3857投影的转换,但我不知道如何做。

这是我的密码

 var map = new Map(new Size(request.Width, request.Height));
 map.BackColor = Color.Transparent;
 var countryGeometry = GeometryFromWKT.Parse(dto.CountryWkt);

 IProvider countryProvider = new GeometryFeatureProvider(countryGeometry);
 var countryLayer = new VectorLayer("country", countryProvider);
 var borderColor = System.Drawing.ColorTranslator.FromHtml("#525252");

 countryLayer.Style.EnableOutline = true;
 countryLayer.Style.Outline = new Pen(borderColor);
 countryLayer.Style.Fill = Brushes.Transparent;
 //does not work with this
countryLayer.CoordinateTransformation = new
                ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory().CreateFromCoordinateSystems(
                    ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84,
                    ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator);

 map.Layers.Add(countryLayer);

 map.ZoomToBox(new Envelope(dto.Envelope.BottomLeft.Longitude,
            dto.Envelope.TopRight.Longitude,
            dto.Envelope.BottomLeft.Latitude,
            dto.Envelope.TopRight.Latitude
        ));

 var img = map.GetMap();

WKT可以在这里找到https://pastebin.com/PEbpAdxT

感谢您的帮助。

编辑2

我也尝试了以下转换,但这会呈现空白的png(没有红色的十字线)

 public  ICoordinateTransformation Wgs84toGoogleMercator
        {
            get
            {

                if (_wgs84ToGoogle == null)
                {
                    CoordinateSystemFactory csFac = new ProjNet.CoordinateSystems.CoordinateSystemFactory();
                    CoordinateTransformationFactory ctFac = new CoordinateTransformationFactory();

                    IGeographicCoordinateSystem wgs84 = csFac.CreateGeographicCoordinateSystem(
                      "WGS 84", AngularUnit.Degrees, HorizontalDatum.WGS84, PrimeMeridian.Greenwich,
                      new AxisInfo("north", AxisOrientationEnum.North), new AxisInfo("east", AxisOrientationEnum.East));

                  // var a =  csFac.CreateFromWkt("aa");


                    List<ProjectionParameter> parameters = new List<ProjectionParameter>();
                    parameters.Add(new ProjectionParameter("semi_major", 6378137.0));
                    parameters.Add(new ProjectionParameter("semi_minor", 6378137.0));
                    parameters.Add(new ProjectionParameter("latitude_of_origin", 0.0));
                    parameters.Add(new ProjectionParameter("central_meridian", 0.0));
                    parameters.Add(new ProjectionParameter("scale_factor", 1.0));
                    parameters.Add(new ProjectionParameter("false_easting", 0.0));
                    parameters.Add(new ProjectionParameter("false_northing", 0.0));
                    IProjection projection = csFac.CreateProjection("Google Mercator", "mercator_1sp", parameters);

                    IProjectedCoordinateSystem epsg900913 = csFac.CreateProjectedCoordinateSystem(
                      "Google Mercator", wgs84, projection, LinearUnit.Metre, new AxisInfo("East", AxisOrientationEnum.East),
                      new AxisInfo("North", AxisOrientationEnum.North));

                    ((CoordinateSystem)epsg900913).DefaultEnvelope = new [] { -20037508.342789, -20037508.342789, 20037508.342789, 20037508.342789 };

                    _wgs84ToGoogle = ctFac.CreateFromCoordinateSystems(wgs84, epsg900913);
                }

                return _wgs84ToGoogle;

            }
        }

共有1个答案

年业
2023-03-14

坐标转换,您使用的实际工作。

您得到的是空白图像,因为您的ZoomToBox坐标是错误的,所以它实际上显示了图像的空白部分。如果使用map。ZoomToExtents();函数相反,在缩放之前查看整个图像,它看起来像这样:

现在,如果我在浏览器中手动放大,得到法国的特写图像,并应用此转换,您可以看到它实际上不再拉伸。

最后,我想说你只需要修复你的ZoomToBox坐标,一切都会很好。希望有帮助。:)

 类似资料:
  • 我能够使用Bokeh从一个geopandas数据帧在谷歌地图上使用gmap()函数绘制字形。 它给我: 然而,当我使用Carto作为提供商绘制时,如这里所解释的,轴上有一个错误: 因此,它在地图上的位置是错误的,人们可以看到红色圆圈: 看起来地图在EPSG: 3857(“网络墨卡托”),而我的来源可能在EPSG: 4326。我怎样才能正确地绘制它? 这是我的数据的前几行:

  • 关于这个话题有很多问题,也有很多答案,但似乎没有一个对我的代码起作用,不确定是不是转换公式或其他东西在整个代码上有问题。经度值似乎如预期的那样起作用,但我未能将纬度转换为地图上的y值。我将添加一个jsfiddle和代码,以及我尝试过的公式的一些链接。我所读到的谷歌地图是一种墨卡托投影,它使用了投影的双重版本(椭球和球面),通用公式在这种情况下不会那么精确,但我没有20km的差异,而是点在地图中的任

  • 我理解为什么墨卡托投影的纬度是有限制的,但是根据我假设的理论,经度是[-180,180]呢。 然而,从几个地图应用程序的源代码中我看到了。他们试图将经度限制在[-177177]之间。 这是什么原因?

  • 我已经看到了不同的实现方法,还有一些关于堆栈溢出的问题--我已经试用了不同的代码片段,虽然我得到了像素的正确经度,但纬度总是偏离的--似乎变得更合理了。 我需要公式,以考虑图像大小,宽度等。 我试过这段代码: 当使用原始代码时,如果纬度值为正,则返回一个负点,所以我稍微修改了它,并用极端纬度进行测试--应该是0点和766点,它工作得很好。然而,当我尝试一个不同的纬度值,例如:58.07(正好在英国

  • 基于这种后转换LAT/LON到像素坐标?,这与真正的墨卡托投影很好地工作。 我面临一个问题的svg地图从openstreet map使用“谷歌墨卡托投影与简化网格(1000)”。 我试着在我的法国地图上画一些城市,所有的点都在这里,但不是它们应该在的地方 svg是基于openmapstreet的pdf在Inkscape中创建的,代码有点长,我在这个fiddle中复制粘贴iti(因为我没有附上Rap

  • Geoserver2.5中的WFS实现存在严重错误。 我将数据集加载到SQL Server和PostGIS中。该数据集由几个点组成,采用本机EPSG:3857。 已为SQL Server连接设置Geometry_Columns表,并且在Geoserver设置中一切正常。 但是,尝试通过OpenLayers访问WFS: wfs1.0。0 |获取|修复| SQL Server WFS 1.0.0|GE