Why dose GeoElevationData[] give different results in its one and two argument forms?

(* the version I am running *) 

In[1]:= $Version 

Out[1]= 11.1.0 for Linux x86 (64-bit) (March 13, 2017) 

(* get elevation data at highest resolution for a very small rectangle 
w/ only 2 values *) 

In[2]:= GeoElevationData[ 
 Automatic, "GeoPosition", GeoZoomLevel -> 12] // FullForm              

    GeoPosition[List[List[List[32.100162506103516`, 103.09999465942383`, 
    3071.465259638845`]], List[List[32.09981918334961`,  
    103.09999465942383`, 3076.4657749984644`]]]] 

(* this should give me 3071.465259638845 or 3071 or even 3072 if 
Mathematica is rounding, but it does not *) 

 GeoElevationData[GeoPosition[{32.100162506103516`, 103.09999465942383`}]] 

Out[3]= 3103. meters 

(* similarly, this should give me 3076 or 3077 meters, but does not *) 

 GeoElevationData[GeoPosition[{32.09981918334961`, 103.09999465942383`}]] 

Out[4]= 3108. meters 


Note the second result is 5 meters higher than the first, just like in 
the two argument form of GeoElevationData, but both heights in the 
single argument version are about 32m higher than those in the two 
argument version. Why? 



The difference is due to the fact that GeoPosition always stores elevations with respect to the ellipsoid ("ITRF00" by default), while the bare GeoElevationData call reports elevations with respect to the geoid. The former are called geodetic elevations, and the latter are called orthometric elevations. You can see the difference as follows:


In[]:= p = GeoPosition[{32.100162506103516`, 103.09999465942383`}];

Then compare

In[]:= GeoElevationData[p]
Out[]= Quantity[3103., "Meters"]

In[]:= GeoElevationData[p, "Geodetic"]
Out[]= Quantity[3071.47, "Meters"]

The difference is called "undulation" and can also be obtained as:

In[]:= GeoElevationData[p, "Undulation"]
Out[]= Quantity[-31.5347, "Meters"]

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy