我有以下函数,可以绘制一个给定中心点的圆,但我希望坐标为WGS84。
var coords = new List<Tuple<double, double>>();
const double EARTH_RADIUS_NM = 3437.670013352;
var lat = (latIn * Math.PI) / 180;
var lon = (lonIn * Math.PI) / 180;
double d = radiusIn / EARTH_RADIUS_NM;
for (int x = 0; x <= 360; x++)
{
double brng = (x * Math.PI) / 180;
var latRadians = Math.Asin(Math.Sin(lat) * Math.Cos(d) + Math.Cos(lat) * Math.Sin(d) * Math.Cos(brng));
var lngRadians = lon + Math.Atan2(Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat), Math.Cos(d) - Math.Sin(lat) * Math.Sin(latRadians));
coords.Add(new Tuple<double, double>(latRadians, lngRadians));
}
你说转换为WGS84,但从什么转换?
看看这样的东西 http:/www.gdal.org 或 http:/dotspatial.codeplex.com (或在您的DB中的空间支持,如果您使用的是空间支持).在GIS上的这个答案将帮助解释WGS84 EPSG:4326。
GIS上的这个答案将有助于解释WGS84 EPSG:4326。
https:/gis.stackexchange.comquestions23690is-wgs84-itself-a-coord-reference-system。
当你的圆变成椭圆时,这将有助于:)
EDIT**:对不起,我一开始就误解了这个问题。我不太理解你的命名习惯,所以一开始我不会写代码。另外我是一个微分几何爱好者,所以笑话在我身上......
首先我们先看看任何球体表面的距离。提醒一下我们的坐标:r≥0,0≤θ≤π,0≤φ<;2π。(θ==纬度,φ==经度)现在由于我们的位移ds,仅限于表面,所以我们有dr==0.另外我们还可以考虑一个距离ds的圆盘,离点a=[r,0,0] 。
这些点就必须满足ds==r dθ,从而得到b=[r,dsr,0].这很容易,因为φ实际是什么并不重要,它可以从0到2π,这个距离将保持不变,所以任何点b=[r,dsr,φ]都坐在我们要找的坐标盘上。
那么如果我们从a=[r,θ,φ]开始呢,你可能会问,对此我说,那么为什么不通过添加变换向量t=[0,-θ,-φ]转换回a=[r,0,0]计算出圆盘的坐标,然后在你找到的每个点(b)上做同样的变换向量的减法。
这个老问题的答案可能对其他人有用,那就是弧度的结果需要转换回度数。
下面的代码部分将度数转换为弧度。
var lat = (latIn * Math.PI) / 180;
var lon = (lonIn * Math.PI) / 180;
在你把结果添加到列表中之前 你需要把它们转换为度数。
var latDegrees = (180/Math.PI) * latRadians;
var lngDegrees = (180/Math.PI) * lngRadians;
coords.Add(new Tuple<double, double>(latDegrees, lngDegrees));
更多的信息,请看下面的介绍部分 http:/www.edwilliams.orgavform.htm