Построение треугольника на основе координат на карте - PullRequest
3 голосов
/ 06 июня 2010

Я создаю приложение, основанное на геолокации, и пытаюсь найти способ заставить мое приложение понять, когда пользователь смотрит в направлении заданного местоположения (определенной длины / широты). У меня есть математика, у меня просто есть треугольник, который нужно построить.

// ОБНОВЛЕНИЕ

Так что я понял это немного ...

Ниже приведен метод, который принимает значение 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 / скрипты / latlong.html

Кажется, это правильно, и я проверил несколько вещей ...

Я пытался преобразовать в радианы, затем отправить вычисления обратно в градусы и т. Д. И т. Д.

У кого-нибудь есть идеи, как исправить этот метод, чтобы он отображал треугольник ТОЛЬКО в 700 метрах от моего текущего местоположения в направлении, с которым я столкнулся?

Спасибо

Ответы [ 3 ]

1 голос
/ 06 июня 2010

на большие расстояния: 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 не будет простым, поэтому вам, вероятно, следует использовать формулы, представленные в ссылках.

0 голосов
/ 10 июня 2010

Проблема была в том, что то, что я отправил в java, вывело бы в радианах, трюк состоял в том, чтобы изменить все на радианы, а затем результат был получен в радианах, преобразованных в градусы.

0 голосов
/ 10 июня 2010

Возможно, это потому, что я не знаю javascript, но вам не нужно делать что-то вроде

currlat = Math.toRadians(currlat);

, чтобы фактически изменить значение currlat на радианы.

...