它不需要非常准确.有谁知道这样做的好方法?
任何帮助深表感谢.
当你说"它不需要非常准确"时,你并没有说出你准备接受的解决方案有多么不准确.此外,您没有说出所考虑的地理区域可能有多大.这两个标准对需要采取的方法有很大的不同.
对于一个较小的区域(比如几公里),平面近似可能已经足够好了(例如,墨卡托投影),其他一些响应会告诉你如何做到这一点.对于较大的区域,您必须考虑地球的球形度.如果你想要不准确度不到百分之一左右,你需要考虑地球的偏心率.
我将假设为了这个答案的目的,球面近似是足够好的,并且你的点在足够相似的高度,我们不需要担心它们的高度.
您可以使用变换将地理点(ψ,λ)转换为笛卡尔地球中心坐标
(ψ,λ)→(cos(ψ)cos(λ),cos(ψ)sin(λ),sin(ψ))
其中a是地球的平均半径(6,371 km).所以我们假设你的线的两个点是p 0和p 1; 那么通过p 0和p 1的最短线是一个大圆,它定义了一个将地球切成两半的平面,正常n = p 0×p 1.
现在我们需要找到圆形区域的边界.假设该区域的中心位于c并且该区域的表面半径为s.然后该区域的直线半径是r = sin(s/a).我们还需要圆形区域的真正中心,c'= c cos(s/a).(这一点埋在地下深处!)
我们想要将两个圆相交并求解交点.不幸的是,由于数值不精确,很可能这个程序永远找不到任何解决方案,因为不精确的圆圈会在3个维度上相互错过.所以我建议采用以下步骤:将两个圆的平面相交,得到如下所示的虚线(除非c'×n = 0,在这种情况下,两个圆是平行的,c'= o,在这种情况下它们是重合的,否则他们不相交).然后将线与圆形区域相交.
这个两步过程将问题简化为二维,并保证即使数值不精确使得两个圆在三维中错过也能找到解.
如果您需要更高的精度,那么您可能需要在参考椭球上使用大地坐标,例如WGS 1984.