преобразование координат GPS в слово OpenGL в AR - PullRequest
3 голосов
/ 10 января 2012

У меня есть список координат GPS (long, lat), и у меня есть текущая позиция (long, lat).я узнал, что, вычитая две координаты, я нахожу относительные координаты из моей позиции, и эти координаты я использую в своем приложении AR для рисования поля в мире opengl.

проблема в том, что отдаленные координатывсе еще будет слишком далеко, чтобы "видеть", поэтому я хочу, чтобы уравнение переводило все, чтобы быть близко к моей позиции, но с их исходным относительным положением.

double kGpsToOpenglCoorRatio = 1000;
    - (void)convertGlobalCoordinatesToLocalCoordinates:(double)latitude x_p:(double *)x_p longitude:(double)longitude y_p:(double *)y_p {

        *x_p = ((latitude - _userLocation.coordinate.latitude)   * kGpsToOpenglCoorRatio);
        *y_p = ((longitude - _userLocation.coordinate.longitude) * kGpsToOpenglCoorRatio);

    } 

Я попытался применить квадратный корень, чтобы датьдля них это «предел расстояния», но их позиции испортились относительно их первоначальной позиции.

Ответы [ 2 ]

3 голосов
/ 10 января 2012

Это может быть связано с тем, что GPS использует сферическую (ish) систему координат, и вы пытаетесь напрямую сопоставить ее с декартовой системой координат (плоскостью).

Что вы можете сделать, это преобразовать ваши GPS-координаты в локальную базовую плоскость, а не отобразить их напрямую. Если вы считаете свое местоположение источником вашей системы координат, вы можете получить полярные координаты точек на плоскости земли относительно начала координат и истинного севера, используя расстояние по большому кругу (r) и направление (тета) между вашим местоположением и удаленную координату, а затем преобразуйте ее в декартовы координаты, используя (x, y) = (r * cos (theta), r * sin (theta)).

Еще раз лучше для вашего случая, когда у вас есть большой круговой подшипник, вы можете просто использовать ракурс r (расстояние). Это перетянет точки ближе к вам и в x, и в y, но они все равно будут в правильном относительном направлении, вам просто нужно как-то указать это.

Другой подход заключается в масштабировании размеров визуализируемых объектов, чтобы они увеличивались с увеличением расстояния для компенсации перспективы. Таким образом, вы можете напрямую использовать правильное положение и ориентацию.

Эта страница имеет алгоритмы определения направления / расстояния: http://www.movable -type.co.uk / scripts / latlong.html

0 голосов
/ 11 января 2012

В итоге я решил проблему с помощью уравнения координаты GPS, перехваченного с окружностью. Я хочу, чтобы все точки появлялись, это работает отлично.Я нигде не пользовался подшипниками.вот код, если кому интересно:

- (void)convertGlobalCoordinatesToLocalCoordinates:(double)latitude x_p:(double *)x_p longitude:(double)longitude y_p:(double *)y_p {

    double x = (latitude - _userLocation.coordinate.latitude) * kGpsToOpenglCoorRatio;
    double y = (longitude - _userLocation.coordinate.longitude) * kGpsToOpenglCoorRatio;

    y = (y == 0 ? y = 0.0001 : y);
    x = (x == 0 ? x = 0.0001 : x);

    double slope = x / ABS(y);

    double outY = sqrt( kPoiRadius / (1+pow(slope,2)) );
    double outX = slope * outY;

    if (y < 0) {
        outY = -1 * outY;
    }

    *x_p = outX;
    *y_p = outY;
}
...