基于地图上的坐标构造三角形

时间:2010-06-06 19:25:18

标签: google-maps math geolocation coordinates

我正在构建一个基于地理位置的应用程序,我正试图找出一种方法,让用户面向给定位置的方向(特定的long / lat co-ord)时实现我的应用程序。我有数学计算,我只需要构建三角形。

// UPDATE

所以我已经弄明白了......

下面是一个接收长/纬度值并尝试计算三角形的方法,该三角形找到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

看起来是正确的,我测试了多个东西......

我尝试过转换为Radians然后将计算发回到学位等等。

任何人都有任何想法如何修复这个方法,以便它将三角形从我当前位置的700米处映射到我所面对的方向?

谢谢,

3 个答案:

答案 0 :(得分:1)

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

你也可以考虑磁偏角:http://www.ngdc.noaa.gov/geomagmodels/Declination.jsp

//编辑:

我试图提供直观的解决方案。但是,从long / lat计算屏幕坐标并不容易,因此您可能应该使用链接中提供的公式。

答案 1 :(得分:0)

也许是因为我不知道javascript,但你不必做像

这样的事情

currlat = Math.toRadians(currlat);

实际上将currlat值更改为弧度。

答案 2 :(得分:0)

问题是无论我在java中输出的是什么,都会在Radians中输出,Trick将所有内容更改为Radians,然后以弧度输出,转换为度数。