ArcGIS Runtime:在计算不同空间参照中相同地图点之间的角度时获得不同的结果

时间:2015-11-01 09:40:48

标签: c# .net arcgis esri

我正在使用ArcGIS Runtime SDK开发dotNet 10.2.6。

我正在尝试计算地图上两点之间的方位角(从北方开始的度数)。

地图有空间参考3857(WGS_1984_Web_Mercator_Auxiliary_Sphere),我使用空间参考4326(GCS_WGS_1984)进行用户显示。

对于北向用户POV,我让用户点击他在地图上的位置以及他当前正在查看的地图上的另一个点。然后我用一个简单的加权来计算两个给定点之间的方位角。

当我使用地图空间参考(3857)时,我得到了逻辑结果。 当我将两个点投影到用户空间参考(4326)并进行相同的计算时,当方位角大约为45度时,我会得到~5度的误差(所有象限都相同,即135,225和315)。

示例:

Azimuth 0:
[spatial reference Wkid=3857] dAzimuth=00.066 
x1=3910430.46448709 y1=3847292.56056299 
x2=3910431.15764925 y2=3847888.00648926
[spatial reference Wkid=4326] dAzimuth=00.079 
x1=35.1279945373535 y1=32.6375465393066 
x2=35.1280007641351 y2=32.6420507989248

Azimuth 45:
[spatial reference Wkid=3857] dAzimuth=45.002 
x1=3910430.46448709 y1=3847292.56056299 
x2=3910850.25858266 y2=3847712.32276465
[spatial reference Wkid=4326] dAzimuth=49.901 (*** ~5 degrees error ***)
x1=35.1279945373535 y1=32.6375465393066 
x2=35.1317656118759 y2=32.6407218603483

示例中的点之间的距离约为500米。 角度计算是:

dAzimuth = Math.Atan(dDeltaX / dDeltaY) * RADIAN_TO_DEGREE_FACTOR;

使用GeometryEngine完成投影:

projectedPoint = GeometryEngine.Project(inputPoint, targetSpatialReference) as MapPoint;

什么可能导致此错误?

2 个答案:

答案 0 :(得分:1)

"错误"可能是由于预测的差异。地理坐标系(4326)和投影坐标系(3857)将给出不同的结果。

另见:

答案 1 :(得分:1)

EPSG:4326并不是真正的投影,如果您将其视为投影,那肯定不是保形的。

因此,您不应依赖该“投影”来获取角度,而必须依赖地球bearing formulas来获得精确的结果。


因此,地球上两点之间的方位(纬度,经度)(R代码):

R> vectorBearing <- function(a_lat, a_lon, b_lat, b_lon) {
    a_phi    <- a_lat * pi / 180
    a_lambda <- a_lon * pi / 180
    b_phi    <- b_lat * pi / 180
    b_lambda <- b_lon * pi / 180
    dL <- b_lambda - a_lambda
    cosBLat <- cos(b_phi)
    Y <- cosBLat*sin(dL)
    X <- (cos(a_phi)*sin(b_phi))-(sin(a_phi)*cosBLat*cos(dL))
    atan2(Y, X) * 180 / pi                                     
}

在几何上,平面上3个点ABC之间的角度(在A上):

R> angleABC <- function(x1, y1, x2, y2, x3, y3) {
    P12 <- sqrt((x1-x2)^2 + (y1-y2)^2)
    P13 <- sqrt((x1-x3)^2 + (y1-y3)^2)
    P23 <- sqrt((x2-x3)^2 + (y2-y3)^2)

    if (P12==0 || P23==0 || P13 ==0) return(0)
    acos((P12**2 + P13**2 - P23**2) / (2*P12*P13) ) / pi * 180
}

您的具体示例,在纬度/经度点上使用方位公式可以得出正确的结果:

R> vectorBearing(32.6375465393066, 35.1279945373535, 32.6407218603483, 35.1317656118759)
[1] 45.00116

也在投影点上使用几何公式:

R> x1<-3910430.46448709
R> y1<-3847292.56056299
R> x2<-3910430.46448709
R> y2<-4000000.00000000  # any
R> x3<-3910850.25858266
R> y3<-3847712.32276465
R> angleABC(x1,y1,x2,y2,x3,y3)
[1] 45.00218

(由于1而导致的结果不完全相同)可能是有限算术误差2)EPSG:3857(Web Mercator)是slightly non-conformal)。

而在纬度/经度值上直接使用平面函数:

R> x1<-35.1279945373535
R> y1<-32.6375465393066
R> x2<-35.1317656118759
R> y2<-40.0000000000000  # any
R> x2<-35.1279945373535
R> x3<-35.1317656118759
R> y3<-32.6407218603483
R> angleABC(x1,y1,x2,y2,x3,y3)
[1] 49.90194

...给出您所看到的不精确结果。


另请参见:https://gis.stackexchange.com/a/21363/6998