QMapControl проблема с яндекс картами

161
03 февраля 2020, 09:50

Захотелось отображать яндекс карты в QMapControl, для этого создал yandexMapAdapter

    YandexMapAdapter::YandexMapAdapter(   )
    : TileMapAdapter("vec01.maps.yandex.net", "/tiles?l=map&v=3.340.0&x=%2&y=%3&z=%1&lang=ru_RU", 256, 0, 21)
{}

Все прекрасно отображается, однако координаты по Y имеют какое-то смещение, один и тот же дом имеет разные координаты при использовании имеющегося googleMapAdapter и моего yandexMapAdapter. Скорее всего нужно переопределить эти функции:

    QPoint TileMapAdapter::coordinateToDisplay(const QPointF& coordinate) const
{
    qreal x = (coordinate.x()+180) * (mNumberOfTiles*mTileSize)/360.; // coord to pixel!
    qreal y = (1-(log(tan(PI/4+deg_rad(coordinate.y())/2)) /PI)) /2  * (mNumberOfTiles*mTileSize);
    return QPoint(int(x), int(y));
}
QPointF TileMapAdapter::displayToCoordinate(const QPoint& point) const
{
    qreal longitude = (point.x()*(360/(mNumberOfTiles*mTileSize)))-180;
    qreal latitude = rad_deg(atan(sinh((1-point.y()*(2/(mNumberOfTiles*mTileSize)))*PI)));
    return QPointF(longitude, latitude);
}

Но какие формулы нужно использовать для яндекс карт? может кто-то уже это делал, если не трудно подскажите куда копать или дайте ссылку на формулы.

Answer 1

Вот исправленные функции для WGS84

    QPointF YandexMapAdapter::displayToCoordinate( const QPoint& point ) const
{
    qreal longitude = (point.x()*(360/(mNumberOfTiles*mTileSize)))-180; // pix per grad
    qreal ypos = asin( tanh( (1-point.y()*(2/(mNumberOfTiles*mTileSize)))*PI ) );
    qreal n = 0.003356551468879694;
    qreal k = 0.00000657187271079536;
    qreal h = 1.764564338702e-8;
    qreal m = 5.328478445e-11;
    qreal g = ypos;
    qreal l = g + n * sin( 2 * g ) + k * sin( 4 * g ) + h * sin( 6 * g ) + m * sin( 8 * g );
    qreal latitude = rad_deg( l );
    return QPointF( longitude, latitude );
}
QPoint YandexMapAdapter::coordinateToDisplay( const QPointF& coordinate ) const
{
    qreal x = (coordinate.x()+180) * (mNumberOfTiles*mTileSize)/360.; // coord to pixel!
    qreal y = deg_rad( coordinate.y() );
    qreal e = 0.081819790992114408;
    qreal lat = atanh( sin( y ) ) - e * atanh( e * sin( y ) ); 
    qreal pixLat = (1 - lat /PI)/2  * (mNumberOfTiles*mTileSize);
    return QPoint( int( x ), int( pixLat ) );
}
READ ALSO
Настройка включения библиотек для cxxtest [закрыт]

Настройка включения библиотек для cxxtest [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»

183
эхоподавление на с++

эхоподавление на с++

Реализую небольшой проект по воспроизведении аудио данных, в том числе и с микрофонаДля воспроизведения пользуюсь библиотекой soundiolib, библиотека...

166
stack around the variable “pd” was corrupted

stack around the variable “pd” was corrupted

Программа должна считывать из файла элементы матрицы, но в конце выдаёт ошибку stack around the variable pd was corruptedГде ошибка?

182
Функции высокого и низкого уровня в C/C++

Функции высокого и низкого уровня в C/C++

Мне нужно записать данные в файлtxt используя функции высокого уровня,а считать данные из файла используя функции низкого уровня на С и С++

161