基于地图坐标构建三角形

3
我正在构建一个基于地理位置的应用程序,我正在尝试找到一种方法使我的应用程序能够意识到用户是否朝向给定位置(特定的经纬度)。我已经解决了数学问题,现在只需构建三角形。
//更新
所以我已经解决了很大一部分...
以下是一个采用long/lat值并尝试计算一个三角形的方法,找到一个距离该点700米远且左右各一个点。然后使用它们来构建三角形。 它计算出正确的经度,但纬度则出现在东非海岸附近。(我在爱尔兰!)
public void drawtri(double currlng,double currlat, double bearing){

    bearing = (bearing < 0 ? -bearing : bearing);

    System.out.println("RUNNING THE DRAW TRIANGLE METHOD!!!!!");
    System.out.println("CURRENT LNG" + currlng);
    System.out.println("CURRENT LAT" + currlat);
    System.out.println("CURRENT BEARING" + bearing);

    //Find point X(x,y)
    double distance = 0.7; //700 meters.
    double R = 6371.0; //The radius of the earth.
    //Finding X's y value.

    Math.toRadians(currlng);
    Math.toRadians(currlat);
    Math.toRadians(bearing);

    distance = distance/R;
    Global.Alat = Math.asin(Math.sin(currlat)*Math.cos(distance)+ 
            Math.cos(currlat)*Math.sin(distance)*Math.cos(bearing));
    System.out.println("CURRENT ALAT!!: " + Global.Alat);
    //Finding X's x value.
    Global.Alng = currlng + Math.atan2(Math.sin(bearing)*Math.sin(distance)
            *Math.cos(currlat), Math.cos(distance)-Math.sin(currlat)*Math.sin(Global.Alat));
    Math.toDegrees(Global.Alat);
    Math.toDegrees(Global.Alng);


    //Co-ord of Point B(x,y)
    // Note: Lng = X axis, Lat = Y axis.
    Global.Blat = Global.Alat+ 00.007931;
    Global.Blng = Global.Alng;

    //Co-ord of Point C(x,y)
    Global.Clat = Global.Alat  - 00.007931;
    Global.Clng = Global.Alng;

    }

从调试中,我确定问题出在这里计算纬度的部分。

 Global.Alat = Math.asin(Math.sin(currlat)*Math.cos(distance)+ 
        Math.cos(currlat)*Math.sin(distance)*Math.cos(bearing));

我不知道为什么,也不知道如何解决它。我从这个网站上得到了这个公式:http://www.movable-type.co.uk/scripts/latlong.html。它看起来正确,我已经尝试了多种方法... 我尝试将其转换为弧度,然后再将计算结果转回角度等等。有人有什么想法可以修复这个方法,使其仅在我当前位置的方向上映射距离700米的三角形吗?谢谢。
3个回答

1

对于长距离:http://www.dtcenter.org/met/users/docs/write_ups/gc_simple.pdf,但是对于短距离,您可以尝试使用简单的二维数学来模拟“经典”指南针,方法如下:http://en.wikipedia.org/wiki/Compass#Using_a_compass。例如,您可以从点A和B获取像素坐标,并找到连接这些点和垂直线之间的角度。

此外,您可能应该考虑磁偏角:http://www.ngdc.noaa.gov/geomagmodels/Declination.jsp

//编辑:

我试图提供一个直观的解决方案。然而,从经纬度计算屏幕坐标并不容易,因此您可能应该使用链接中提供的公式。


我并不是真的想画一个指南针,更多的是想检查一下我面对的方向是否与位置所在的方向相同。getbearing() 不起作用,因为当我不移动时它不会更新。假设用户处于静止状态。 - Skizit
在这种情况下,使用getOrientation()而不是exactly getbearing是没有用的。绕z轴的旋转是方位角。然而,读取设备方向可能是这个问题中最容易的部分。 - Maciek Sawicki
是的,Android 知道我的位置和其他位置,它也知道我的方向,但我希望它能够识别出当我的方向与位置相同时。我该如何实现这个功能? - Skizit
这只是数学问题,但如果您需要一些代码,可以在此网站上找到一些JS代码:http://www.movable-type.co.uk/scripts/latlong.html或http://www.ig.utexas.edu/outreach/googleearth/latlong.html。 - Maciek Sawicki
你已经部分回答了我的问题,我已经更新了问题以反映你提供的新信息。 - Skizit

0
也许是因为我不懂JavaScript,但是难道你不需要做像这样的事情吗:
currlat = Math.toRadians(currlat);
才能真正将currlat的值改变为弧度吗?

这是Java,不是JavaScript。而且我已经说过我尝试过弧度和角度的转换了。 - Skizit
好的。在上面粘贴的代码中,Math.toRadians(currlat)实际上不会改变currlat的值。只是为了澄清一下,抱歉。 - Jay R.

0
问题在于无论我在Java中输入什么,输出都是弧度。诀窍是将所有内容转换为弧度,然后输出就会以弧度形式呈现,最后再将其转换为角度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接