首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArcGIS从Wgs84到WebMercator的转换

ArcGIS从Wgs84到WebMercator的转换
EN

Stack Overflow用户
提问于 2020-02-13 10:22:42
回答 2查看 384关注 0票数 0

我在WPF中使用WPF,我的代码是基于这个项目的。

我正在尝试从一个数据库加载多边形,以便在地图上显示。我也希望能够编辑这些多边形,并更新他们的数据库。当我用SpatialReferences.WebMercator属性保存我的多边形时,一切都很好。

但是现在我有了一个数据库,其中多边形被保存为Wgs84 (lat & lon)。现在我可以将这些多边形加载到地图上,但是我无法编辑它们,因为地图是WebMercator,多边形是Wgs84。一旦我尝试编辑,我就会得到一个例外:

输入空间引用与拥有的空间引用不匹配.

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

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

但是当我试图保存一个多边形时,我很难进行第二次转换。我确实找到了一个公式,可以将这些WebMercator点转换回Wgs84来保存数据库,但是除了lat和lon之外,它还需要一个区域。所以我得到分数的方式是:

代码语言:javascript
复制
String geomStr = MyMapView.SketchEditor.Geometry.ToJson();

从那里,我可以得到所有的lat & lon对来转换,但是我需要每个点的区域。有没有任何方法从图形或几何对象中检索区域?或者仅仅是通过了解lat或lon点来找出区域呢?在我尝试Wgs84到WebMercator的转换公式之前,这就是我所需要的。

这个工具有我需要的功能。但是,当从EPSG:3857转换到EPSG:4326时,这并不是100%的准确。

EN

回答 2

Stack Overflow用户

发布于 2020-02-13 10:37:29

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

“正式”规范由EPSG:3857提供。

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

地图投影在这里解释:投影

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

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2021-10-01 16:14:36

这应该能起作用:

代码语言:javascript
复制
 var geometry = GeometryEngine.Project(MyMapView.SketchEditor.Geometry, SpatialReferences.Wgs84);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60205531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档