Страница 1 из 1

QMapControl и яндекс карты

Добавлено: 17 апр 2019, 18:54
ipkis
Захотелось отображать яндекс карты в 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);

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

Re: QMapControl и яндекс карты

Добавлено: 17 апр 2019, 20:32
freeExec
Яндекс основан на эллипсоиде, а не на сфере как у гугла.

Re: QMapControl и яндекс карты

Добавлено: 18 апр 2019, 13:45
ipkis
так, получается долгота совпадает, подскажите формулу для вычисления широты

Re: QMapControl и яндекс карты

Добавлено: 18 апр 2019, 13:50
trir
в ГОСТ'е посмотри

Re: QMapControl и яндекс карты

Добавлено: 18 апр 2019, 15:29
Игорь Белов
В общепринятых координатах зависимость y(lat):

Код: Выделить всё

y = a * (atanh(sin(lat)) - e * atanh(e * sin(lat)))
Здесь параметры a, e — соответственно экваториальный радиус эллипсоида и его эксцентриситет.
Радиус a далее сокращается при вычислении тайловых/пиксельных координат.
Эксцентриситет же разный:
  • сфера Гугла и др.: e = 0
  • эллипсоид Яндекса: e = 0.08181919084262149433480245175385667
При e ≠ 0 обратная функция lat(y) в лоб не считается. Либо итеративный поиск корня, либо разложение в тригонометрический ряд с последующим обращением. С первым, надеюсь, сами справитесь. Второе выложу, если ну прям очень надо.

Re: QMapControl и яндекс карты

Добавлено: 18 апр 2019, 16:11
ipkis
с первым справлюсь, а второе ну очень надо :) Спасибо за помощь!

Re: QMapControl и яндекс карты

Добавлено: 18 апр 2019, 21:29
Игорь Белов
Второе: тригонометрический ряд

Вычислим широту на сфере χ (хи):

Код: Выделить всё

chi = asin(tanh(y/a))
chi.png
Широта на сфере χ
chi.png (642 байт) 10626 просмотров
Широта на эллипсоиде φ в виде тригонометрического ряда по χ:
phi.png
Широта на эллипсоиде φ
phi.png (9.45 КБ) 10626 просмотров
Здесь e — эксцентриситет. Квадрат эксцентриситета для эллипсоида WGS 84:
e² = 0.006694379990141316996137233540044784

Re: QMapControl и яндекс карты

Добавлено: 19 апр 2019, 21:57
stout
Вот формула Боуринга для перехода от изометрической широты к геодезической
isometric2Geodic.png
isometric2Geodic.png (47.73 КБ) 10566 просмотров
А вот график ошибки этой формулы в секундах дуги (φ(true) - φ(approx))*20624.806247
isometric2GeodicERROR.png
isometric2GeodicERROR.png (11.18 КБ) 10566 просмотров
Вертикальная шкала в единицах 10 знака после запятой.

Re: QMapControl и яндекс карты

Добавлено: 22 апр 2019, 15:23
stout
Скорее всего для Игорь Белов, это элементарщина, но мне кажется надо добавить, что сумму тригонометрического ряда удобно находить по алгоритму Кленшоу
Clenshaw formula (sin).png
Clenshaw formula (sin).png (36.11 КБ) 10493 просмотра

Re: QMapControl и яндекс карты

Добавлено: 22 апр 2019, 20:53
Игорь Белов
t = 2 cos 2χ ?

Re: QMapControl и яндекс карты

Добавлено: 23 апр 2019, 07:14
stout
Игорь Белов писал(а):
22 апр 2019, 20:53
t = 2 cos 2χ ?
Да, конечно! Вы правы.
В качестве частичного искупления оставлю здесь ссылку на неплохую статью (на мой взгляд)
SOME APPLICATIONS OF CLENSHAW'S RECURRENCE FORMULA IN MAP PROJECTIONS
в качестве добавки в этой статье описан алгоритм proj_etmerc.c из PROJ

Re: QMapControl и яндекс карты

Добавлено: 23 апр 2019, 10:12
ipkis
Я выложил решение тут https://ru.stackoverflow.com/questions/ ... 417#972417