【问题标题】:ArcGIS Converting from Wgs84 to WebMercatorArcGIS 从 Wgs84 转换为 WebMercator
【发布时间】:2020-05-29 00:36:56
【问题描述】:

我使用ArcGIS .NET SDKWPF,我的代码基于this project

我正在尝试从数据库加载多边形以显示在地图上。我还希望能够编辑这些多边形并在数据库中更新它们。我一切正常,因为我正在使用 SpatialReferences.WebMercator 属性保存我的多边形。

但现在我有一个数据库,其中多边形保存为 Wgs84(纬度和经度)。现在我可以将这些多边形加载到地图上,但我无法编辑它们,因为地图是 WebMercator,而多边形是 Wgs84。一旦我尝试编辑,我就会得到一个异常:

输入空间参考与所属空间不匹配 参考...

我需要在从数据库加载多边形后立即转换它们(Wgs84 到 WebMercator),并在保存到数据库之前将它们转换回来(WebMercator 到 Wgs84)。

所以我能够进行第一次转换,我从数据库中加载 Wgs84 多边形并将每个点转换为 WebMercator。我可以显示这些多边形,也可以编辑它们。

但是在尝试保存多边形时,我正在努力进行第二次转换。我确实找到了一个可以将这些 WebMercator 点转换回 Wgs84 以保存在数据库中的公式,但除了纬度和经度之外,它还需要一个区域。所以我得到积分的方式:

String geomStr = MyMapView.SketchEditor.Geometry.ToJson();

从那里我可以得到所有要转换的纬度和经度对,但我需要每个点的区域。有没有办法从图形或几何对象中检索区域?或者仅通过知道纬度或经度点来确定区域呢?这就是我在尝试 Wgs84 到 WebMercator 的转换公式之前所需要的。

This tool 具有我需要的功能。但从 EPSG:3857 转换为 EPSG:4326 时,它并不是 100% 准确的。

【问题讨论】:

    标签: c# .net wpf maps arcgis


    【解决方案1】:

    这应该可以解决问题:

     var geometry = GeometryEngine.Project(MyMapView.SketchEditor.Geometry, SpatialReferences.Wgs84);
    

    【讨论】:

      【解决方案2】:

      我不知道 ArcGIS 实际如何存储或处理以 WebMercator 作为空间参考的数据。

      “官方”规范由EPSG:3857给出。

      另见https://epsg.io/3857https://spatialreference.org/ref/sr-org/epsg3857-wgs84-web-mercator-auxiliary-sphere/

      地图投影在这里解释:https://en.wikipedia.org/wiki/Web_Mercator_projection

      如果您想自己进行计算,请使用如下所示的方法,其中 Location 是一个以度为单位保存 WGS 84 纬度和经度值的类,Point 是 System.Windows.Point 并以米为单位保存 X 和 Y 值,从 Latitude=0 和 Longitude=0 的坐标原点测量。

      public class Location
      {
          public double Latitude { get; set; }  // degrees from -90 to 90
          public double Longitude { get; set; } // degrees from -180 to 180
      }
      
      public const double Wgs84EquatorialRadius = 6378137d;
      public const double Wgs84MetersPerDegree = Wgs84EquatorialRadius * Math.PI / 180d;
      
      public override Point LocationToPoint(Location location)
      {
          return new Point(
              Wgs84MetersPerDegree * location.Longitude,
              Wgs84MetersPerDegree * LatitudeToY(location.Latitude));
      }
      
      public override Location PointToLocation(Point point)
      {
          return new Location(
              YToLatitude(point.Y / Wgs84MetersPerDegree),
              point.X / Wgs84MetersPerDegree);
      }
      
      public static double LatitudeToY(double latitude)
      {
          if (latitude <= -90d)
          {
              return double.NegativeInfinity;
          }
      
          if (latitude >= 90d)
          {
              return double.PositiveInfinity;
          }
      
          return Math.Log(Math.Tan((latitude + 90d) * Math.PI / 360d)) * 180d / Math.PI;
      }
      
      public static double YToLatitude(double y)
      {
          return 90d - Math.Atan(Math.Exp(-y * Math.PI / 180d)) * 360d / Math.PI;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-25
        • 1970-01-01
        • 2016-12-18
        • 2014-07-20
        • 1970-01-01
        相关资源
        最近更新 更多