Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 使用两个经度/纬度点获取方向(指南针)_Math_Geolocation_Location_Compass Geolocation_Direction - Fatal编程技术网

Math 使用两个经度/纬度点获取方向(指南针)

Math 使用两个经度/纬度点获取方向(指南针),math,geolocation,location,compass-geolocation,direction,Math,Geolocation,Location,Compass Geolocation,Direction,我正在为移动设备设计一个“指南针”。我有以下几点: point 1 (current location): Latitude = 47.2246, Longitude = 8.8257 point 2 (target location): Latitude = 50.9246, Longitude = 10.2257 我还有以下信息(来自我的android手机): 如何创建一个“指南针式”箭头,向我显示指向该点的方向 这有数学问题吗 编辑:好的,我找到了一个解决方案,看起来是这样的: /**

我正在为移动设备设计一个“指南针”。我有以下几点:

point 1 (current location): Latitude = 47.2246, Longitude = 8.8257
point 2 (target  location): Latitude = 50.9246, Longitude = 10.2257
我还有以下信息(来自我的android手机):

如何创建一个“指南针式”箭头,向我显示指向该点的方向

这有数学问题吗

编辑:好的,我找到了一个解决方案,看起来是这样的:

/**
 * Params: lat1, long1 => Latitude and Longitude of current point
 *         lat2, long2 => Latitude and Longitude of target  point
 *         
 *         headX       => x-Value of built-in phone-compass
 * 
 * Returns the degree of a direction from current point to target point
 *
 */
function getDegrees(lat1, long1, lat2, long2, headX) {
    
    var dLat = toRad(lat2-lat1);
    var dLon = toRad(lon2-lon1);

    lat1 = toRad(lat1);
    lat2 = toRad(lat2);

    var y = Math.sin(dLon) * Math.cos(lat2);
    var x = Math.cos(lat1)*Math.sin(lat2) -
            Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
    var brng = toDeg(Math.atan2(y, x));

    // fix negative degrees
    if(brng<0) {
        brng=360-Math.abs(brng);
    }

    return brng - headX;
}
/**
*参数:lat1,long1=>当前点的纬度和经度
*lat2,long2=>目标点的纬度和经度
*         
*headX=>内置电话指南针的x值
* 
*返回从当前点到目标点的方向度
*
*/
函数getDegrees(lat1、long1、lat2、long2、headX){
var dLat=toRad(lat2-lat1);
var-dLon=toRad(lon2-lon1);
lat1=toRad(lat1);
lat2=toRad(lat2);
变量y=数学sin(dLon)*数学cos(lat2);
var x=数学cos(lat1)*数学sin(lat2)-
数学sin(lat1)*数学cos(lat2)*数学cos(dLon);
var brng=toDeg(数学公式atan2(y,x));
//固定负度数

如果(brng您需要计算起点和终点之间的欧几里德向量,然后计算其角度(比如相对于正X)这就是你想要旋转箭头的角度。

O忘了说我最终找到了答案。该应用程序用于确定过境车辆的罗盘方向及其目的地。本质上,是获取地球曲率、找到角度/罗盘读数,然后将该角度与通用罗盘匹配的奇特数学ss值。当然,您可以保持compassReading,并将其作为图像的旋转量。请注意,这是车辆方向到终点(公交车站)的平均值,这意味着它无法知道道路在做什么(因此这可能最适用于飞机或滚道德比)

//包含lat和lng点的obj数据示例
//停止位置-半径端点
endpoint.lat=44.9631;
终点液化天然气=-93.2492;
//从东南方向出发的公交车位置-圆环中心
startpoint.lat=44.95517;
startpoint.lng=-93.2427;
功能车辆轴承(端点、起点){
端点.lat=x1;
终点液化天然气=y1;
startpoint.lat=x2;
startpoint.lng=y2;
var弧度=getAtan2((y1-y2),(x1-x2));
函数getAtan2(y,x){
返回数学atan2(y,x);
};
var compassReading=弧度*(180/数学π);
变量坐标=[“N”、“NE”、“E”、“SE”、“S”、“SW”、“W”、“NW”、“N”];
var coordIndex=数学四舍五入(对比阅读/45);
if(坐标指数<0){
坐标索引=坐标索引+8
};
返回坐标名称[coordIndex];//返回坐标值
}
即: 车辆轴承(mybus、公共汽车站)
可能返回“NW”意味着它向西北方向移动

我在数学中找到了一些有用的gps坐标公式。 对于这种情况,这里是我的解决方案

 private double getDirection(double lat1, double lng1, double lat2, double lng2) {

    double PI = Math.PI;
    double dTeta = Math.log(Math.tan((lat2/2)+(PI/4))/Math.tan((lat1/2)+(PI/4)));
    double dLon = Math.abs(lng1-lng2);
    double teta = Math.atan2(dLon,dTeta);
    double direction = Math.round(Math.toDegrees(teta));
    return direction; //direction in degree

}

我不能很好地理解你的解决方案,计算坡度对我很有用。 要修改的和您的答案,请执行以下操作-

import math
def getDegrees(lat1, lon1, lat2, lon2,head):
    dLat = math.radians(lat2-lat1)
    dLon = math.radians(lon2-lon1)
    bearing = math.degrees(math.atan2(dLon, dLat))
    return head-bearing

或者你可以想尽一切办法解释地球的曲率这是一个很好的答案描述,试着提供一个真实的例子。@liquified-如果你看这篇文章,即使在编辑之前,它也没有任何语言标记,问的问题是:
这有数学问题吗?
。也没有提供代码和apart来自
math
tag如果OP想要解决它,也没有其他指示(在众多指示中)via,让我们说实数三角学或复数三角学。考虑到问题的模糊参数,我认为答案就足够了。不要发布连你自己都不清楚的解决方案。@Sameer你的解决方案有什么问题吗?如果没有人发布,我可以是一个。仅供参考,如果其他人发布需要它。因为那个“原因”获得否决票。我不明白。@eav你创建的toRad函数是什么样子的?@gohnjanotis:后面没什么魔力->函数声明有long1和long2,但当在函数中使用时,它们是lon1和lon2。@liquified,抱歉,我无法理解为什么(compassReading/45)正在进行。请让我知道。谢谢。45是指南针的45度间隔,与指南针阵列(NSEW等)的9个坐标(人名)相关。将指南针读数除以45,在360度范围内,您的读数与其中一个间隔(数学圆)有多近例如,.360/45给出了数组中第8个索引的8或“N”。如果只需要NSEW除以90,则可以修改此值instead@efwjames“关联到9个坐标系”-45*8=360。您在坐标系数组中重复了两次“N”。请删除该选项。
 private double getDirection(double lat1, double lng1, double lat2, double lng2) {

    double PI = Math.PI;
    double dTeta = Math.log(Math.tan((lat2/2)+(PI/4))/Math.tan((lat1/2)+(PI/4)));
    double dLon = Math.abs(lng1-lng2);
    double teta = Math.atan2(dLon,dTeta);
    double direction = Math.round(Math.toDegrees(teta));
    return direction; //direction in degree

}
import math
def getDegrees(lat1, lon1, lat2, lon2,head):
    dLat = math.radians(lat2-lat1)
    dLon = math.radians(lon2-lon1)
    bearing = math.degrees(math.atan2(dLon, dLat))
    return head-bearing