LINUX.ORG.RU

Показать карту OpenSeaMap через плагин «osm» в QML

 , , , , плагин


1

2

Имею Qt 5.10.1, Linux Debian 9 Stable.

Хочу сделать очень простую вещь: показать карту с тайлового сервера OpenSeaMap через плагин «osm».

Читаю документацию тут:

https://doc-snapshots.qt.io/qt5-5.10/location-plugin-osm.html

Читаю поправку к документации тут:

https://bugreports.qt.io/browse/QTBUG-55176

Использую такой код:

    // Карта OSEAM
    Map {
        id: mapOseam
        gesture.enabled: true
        anchors.fill: parent
        center: QtPositioning.coordinate(59.9758,29.7686)
        zoomLevel: 15

        // Если раскомментировать - будет сегфолт
        // supportedMapTypes: MapType.CustomMap


        // Плагин OSM с картой OSEAM
        plugin: Plugin {
            name: "osm"

            PluginParameter {
                name: "osm.mapping.custom.host"
                value: "http://tiles.openseamap.org/seamark/"
            }

            PluginParameter {
                name: "osm.mapping.cache.directory"
                value: "./mapCache/oseam"
            }

            PluginParameter {
                name:"osm.mapping.providersrepository.disable"
                value:true
            }

        }
    }

Перед каждым запуском директорию с кешем очищаю. Но все равно все время показывается карта OpenStreetMap, а не OpenSeaMap.

Я уже игрался как мог, ставил osm.mapping.providersrepository.disable в false, писал вместо http://tiles.openseamap.org/seamark/ сервер http://t1.openseamap.org/seamark/, комментировал/раскомментировал supportedMapTypes, пробовал прописывать activeMapType, но ничего не меняется: все время отображается OpenStreetMap, несмотря на то что указан другой тайловый сервер.

Вопрос: как таки заставить плагин «osm» обращаться к другому тайловому серверу?

★★★★★

Похоже на то, что где-то есть странный кэш. Посмотри, как на других местах/зумах выглядит, на которых ты ещё не смотрел.

Плюс учти, что симарк — это оверлей, там почти все тайлы прозрачные просто.

ChALkeR ★★★★★
()
Ответ на: комментарий от ChALkeR

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

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

Но затык происходит даже на одном Map, который должен опензеа показывать.

Доберусь до компа, посмотрю еще раз.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от ChALkeR

В общем, я выяснил еще две директории кеша:

qDebug() << "Cache location 1: " << QStandardPaths::writableLocation( QStandardPaths::GenericCacheLocation );
qDebug() << "Cache location 2: " << QStandardPaths::writableLocation( QStandardPaths::CacheLocation );

Очистил их, очистил кеш, заданный в параметре «osm.mapping.cache.directory». Запускаю программу, и снова показывает OpenStreetMap. И в директории кеша «osm.mapping.cache.directory» появляются тайлы от OpenStreetMap.

Такое впечатление, что плагин плевал на параметр «osm.mapping.custom.host», и тупо использует OpenStreetMap сервер вместо указанного OpenSeaMap.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от ChALkeR
import QtQuick 2.0
import QtPositioning 5.5
import QtLocation 5.5

Map {
  plugin: Plugin {
    name: 'osm'
    PluginParameter {
      name: 'osm.mapping.host'
      value: 'http://tiles.openseamap.org/seamark/'
    }
  }
  activeMapType: supportedMapTypes[supportedMapTypes.length - 1]
  center: QtPositioning.coordinate(54.18, 12.09)
  zoomLevel: 12
}

Пробуй.

ChALkeR ★★★★★
()
Ответ на: комментарий от ChALkeR

А. Эм. `osm.mapping.custom.host`? Я не обратил внимания, что у тебя он так написан. `osm.mapping.host` же.

В документации пишут «osm.mapping.custom.host» и там же в примерах «osm.mapping.host». Они название этого параметра меняли, потому что в C++-коде плагина идет такая обработка:

    if (parameters.contains(QStringLiteral("osm.mapping.custom.host"))
            || parameters.contains(QStringLiteral("osm.mapping.host"))) {
        // Adding a custom provider
        QString tmsServer;
        if (parameters.contains(QStringLiteral("osm.mapping.host")))
            tmsServer = parameters.value(QStringLiteral("osm.mapping.host")).toString();
        if (parameters.contains(QStringLiteral("osm.mapping.custom.host"))) // priority to the new one
            tmsServer = parameters.value(QStringLiteral("osm.mapping.custom.host")).toString();
...

Пробуй.

В общем мой код заработал как только добавил строчку:

activeMapType: supportedMapTypes[supportedMapTypes.length - 1]

В документации про это написано как-то невнятно:


To use this server, the Map::activeMapType parameter of the Map should be set to the supported map type whose type is MapType.CustomMap.


Проблема в том что типы свойства activeMapType и значения MapType.CustomMap не совпадают. В баге написано, что вместо activeMapType надо использовать supportedMapTypes, но с ним происходит сегфолт.

Так же в доке про MapType.CustomMap написано, что этот тип всегда представляет Map::supportedMapTypes[supportedMapTypes.length - 1] :


This map type is only be available if this plugin parameter is set, in which case it is always Map::supportedMapTypes[supportedMapTypes.length - 1].


Додуматься что если вместо MapType.CustomMap написать Map::supportedMapTypes[supportedMapTypes.length - 1], то все заработает, я как-то не смог. Да и сейчас не понимаю почему так.

В любом случае благодарю.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от ChALkeR

Мда, идея иметь два инстанса Map с плагином «osm» не сработала полностью как ожидалось.

Карта с тайловым сервером «OpenSeaMap» хоть и получает тайлы с прозрачностью (в кеше тайлы прозрачные), но рисует тайлы, видимо, с подложкой.

И поэтому под картой OpenSeaMap не видно карты OpenStreetMap.

Как это обойти пока не придумал. В качестве временного решения выставляю opacity: 0.5, но это явно не то.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от anonymous

Карта же из слоев состоит. Взять нужные слои из OpenSeaMap и отобразить на OpenStreetMap

Может быть, ты и код покажешь для плагина «osm»? Ведь этот плагин, конечно, может работать со слоями?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Да, с color сработало, теперь морская карта накладывается как положено.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.