在我的项目中,我的用户可以选择被放在给定的圆形区域内的一个随机位置。我有中心的经纬度和半径:如何计算给定区域内任意点的经纬度?(我使用PHP,但任何语言的示例都适合)
发布于 2011-09-12 19:55:01
您需要两个随机生成的数字。
对于问题空间来说,使用矩形(Cartesian) (x,y)坐标考虑这个问题有点不自然。给定一个半径,很难考虑如何直接计算落在由中心和半径定义的圆内的(Δx,Δy)增量。
最好使用polar coordinates来分析问题-其中维度是(r1,Θ)。计算一个随机距离,以半径为界。计算一个随机角度,从0度到360度。然后是convert the (r,Θ) to Cartesian (Δx,Δy),使用简单的三角关系,笛卡尔数量只是相对于圆中心的偏移量。
Δx = r * cos(Θ)
Δy = r * sin(Θ)
那么你的新观点就是
xnew = x + Δx
ynew = y + Δy
这适用于小r,在这种情况下,地球的几何形状可以用欧几里得(平面)几何近似。
当r变大时,地球的曲率意味着欧几里得近似与实际情况不符。在这种情况下,您将需要use the formulas for geodesic distance,这将考虑到地球的3d曲率。比方说,超过100公里的距离,这就开始有意义了。当然,这取决于你需要的精确度,但我假设你有相当大的回旋余地。
在3D几何中,您再次需要计算两个量-角度和距离。距离也是由r半径限制的,但在这种情况下,距离是在地球表面上测量的,它被称为“大圆距离”。对于第一个量,随机生成一个小于或等于r的数字。
大圆几何关系
d = R Δσ
...states指出,d是一个大圆距离,它与球体的半径成正比,也与球体表面上两点对齐的圆心角成正比。“中心角”是指由三个点描述的角度,其中球体的中心在顶点,另外两个点在球体的表面上。
在你的问题中,这个d必须是一个由你的原始'r‘约束的随机数。因为地球的R是已知的(大约6371.01公里),所以计算d就可以得到圆心角度,换句话说就是Δσ。
这给出了沿大圆的绝对(随机)距离,远离原始的经度/经度。现在,您需要由角度量化的方向,描述从原始点开始的N/S/E/W方向。同样,如果你愿意,可以使用0-360度的随机数,其中零代表正东方向。
纬度的变化可以由d sin(Θ)
计算,经度的变化由d cos(Θ)
计算。这给出了与r相同维度的大圆距离(假设是km),但您需要的是经度/长度,因此需要进行转换。从纬度距离到度数很容易得到:it's about 111.32 km per degree regardless of latitude。从纵向距离到纵向度数的转换比较复杂,因为纵向线彼此更接近极点。因此,您需要使用更多的complex formulae来计算与所选d(大距离)和角度相对应的经度变化。请记住,您可能需要跨越+/- 180°障碍。( F22猛禽战机的设计者忘记了这一点,还有their airplanes nearly crashed when attempting to cross the 180th meridian。)
由于在连续近似中可能会累积误差,因此您需要检查新点是否符合约束条件。使用公式
Δσ = arccos( cos(Δlat) - cos(lat1)*cos(lat2)*(1 - cos(Δlong) ) .
其中Δlat是纬度变化,等等。
这将为您提供Δσ,即新旧经纬点之间的中心角度。验证您在此处计算的圆心角度是否与您先前随机选择的圆心角度相同。换句话说,验证计算点之间计算的d(大圆距离)是否与您随机选择的大圆距离相同。如果计算的d与您选择的d不同,则可以使用数值近似来提高精度,稍微更改纬度或经度,直到它满足您的标准。
发布于 2011-09-12 23:43:33
这可以通过计算随机方位角(在0和2*pi之间)和0与所需最大半径之间的随机距离来简单地完成。然后使用给定经度/纬度中心点的随机方位角/范围计算新的(随机)纬度/经度。请参阅以下网站上的“目标点与起点的距离和方向角”一节:http://www.movable-type.co.uk/scripts/latlong.html
注意:给定的公式要求所有角度均为弧度(包括经度/经度)。产生的纬度/纬度也是弧度,因此您需要转换为度数。
https://stackoverflow.com/questions/7386286
复制相似问题