我在WPF中使用WPF,我的代码是基于这个项目的。
我正在尝试从一个数据库加载多边形,以便在地图上显示。我也希望能够编辑这些多边形,并更新他们的数据库。当我用SpatialReferences.WebMercator属性保存我的多边形时,一切都很好。
但是现在我有了一个数据库,其中多边形被保存为Wgs84 (lat & lon)。现在我可以将这些多边形加载到地图上,但是我无法编辑它们,因为地图是WebMercator,多边形是Wgs84。一旦我尝试编辑,我就会得到一个例外:
输入空间引用与拥有的空间引用不匹配.
当我将多边形从数据库加载(Wgs84到WebMercator)时,我需要立即转换它们,并在保存到数据库之前将它们转换回数据库(WebMercator到Wgs84)。
因此,我能够进行第一次转换,从数据库加载Wgs84多边形并将每个点转换为WebMercator。我可以显示这些多边形,我也可以编辑它们。
但是当我试图保存一个多边形时,我很难进行第二次转换。我确实找到了一个公式,可以将这些WebMercator点转换回Wgs84来保存数据库,但是除了lat和lon之外,它还需要一个区域。所以我得到分数的方式是:
String geomStr = MyMapView.SketchEditor.Geometry.ToJson();从那里,我可以得到所有的lat & lon对来转换,但是我需要每个点的区域。有没有任何方法从图形或几何对象中检索区域?或者仅仅是通过了解lat或lon点来找出区域呢?在我尝试Wgs84到WebMercator的转换公式之前,这就是我所需要的。
这个工具有我需要的功能。但是,当从EPSG:3857转换到EPSG:4326时,这并不是100%的准确。
发布于 2020-02-13 10:37:29
我不知道ArcGIS如何实际存储或处理以WebMercator作为空间引用的数据。
“正式”规范由EPSG:3857提供。
另见https://epsg.io/3857和https://spatialreference.org/ref/sr-org/epsg3857-wgs84-web-mercator-auxiliary-sphere/
地图投影在这里解释:投影
如果您想自己进行计算,请使用如下方法,其中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;
}发布于 2021-10-01 16:14:36
这应该能起作用:
var geometry = GeometryEngine.Project(MyMapView.SketchEditor.Geometry, SpatialReferences.Wgs84);https://stackoverflow.com/questions/60205531
复制相似问题