[GELÖST] OpenStreetMap GeoService Plugin für QML-Map

Alles rund um die Programmierung mit Qt
Antworten
riede
Beiträge: 4
Registriert: 28. April 2015 12:06

[GELÖST] OpenStreetMap GeoService Plugin für QML-Map

Beitrag von riede » 4. Mai 2015 17:47

Hallo Leute,
ich bin neu in der QT-Programmierwelt und deshalb noch etwas grün hinter den Ohren, hoffe aber natürlich ihr könnt mir weiterhelfen. :wink:
Ich habe erfolgreich eine QT Quick Anwendung (QT 5.4) erstellt und auf mein Android-Tablet übertragen. Da ich weiter unten noch ein zweites Projekt aufführe, nenne ich das Projekt mit der QT-Quick Anwendung für Android im folgenden immer "Android-Projekt".

Im Android-Projekt wird zurzeit im Vollbildmodus eine QML-Map angezeigt. Als Map-Plugin habe ich das OpenStreetMap (OSM)-Plugin ausgewählt. Das ganze sieht zusammengefasst so aus.

Code: Alles auswählen

 ApplicationWindow {
     // ...
    Map {
        id:osmMap
        anchors.fill: parent
        plugin: Plugin {
            id: osmPlugin
            name: "osm"
        }
     // ...
     }
}
Mein eigentlicher Wunsch ist es jetzt aber, mein eigenes Plugin zu schreiben, welches auf meinen Server verweist. Daher habe ich gegoogelt, nicht viel gefunden - außer u.a. den Source-Code von QT selbst, wo aber auch das der Sourcecode des Osm-Plugins bei liegt (https://qt.gitorious.org/qt/qtlocation/ ... rvices/osm). Anhand des Source-Codes des OSM-Plugins & der Dokumentation von QT habe ich ein neues Projekt als C++-Bibliothek erstellt. Dieses nenne ich im folgenden "OSM-Plugin-Projekt".

Im besagten OSM-Plugin-Projekt habe ich aus dem Git-Repository die .h- und .cpp-Dateien des OSM-Plugins kopiert. Da ich nur Mapping benötige, habe ich die implementierten Dateien für GeoCoding, Places etc. weggelassen und die Factory-Klasse dementsprechend angepasst, dass für die nicht unterstützten Engines 0 zurück gegeben wird. Die Dokumentation zum Implementieren eines GeoService-Plugins empfielt dies ebenfalls (http://doc.qt.io/qt-5/qtlocation-geoser ... ng-plugins) .

Meine Projektdatei (.pro) des OSM-Plugin-Projektes sieht hierzu folgendermaßen aus:

Code: Alles auswählen

QT += location-private
QT += positioning-private
QT += network
QT += qml quick

TARGET = MyOsmPlugin
TEMPLATE = lib

DEFINES += MYOSMPLUGIN_LIBRARY

PLUGIN_TYPE = geoservices
PLUGIN_CLASS_NAME = QServiceProviderFactoryOsm
#load(qt_plugin) # <-- das funktioniert bei mir nicht, steht aber bei der Projektdatei des OSM-Plugins so drin
[/color]
HEADERS +=\
    qgeoserviceproviderpluginosm.h \
    qgeotiledmappingmanagerengineosm.h \
    qgeotilefetcherosm.h \
    qgeomapreplyosm.h

SOURCES += \
    qgeoserviceproviderpluginosm.cpp \
    qgeotiledmappingmanagerengineosm.cpp \
    qgeotilefetcherosm.cpp \
    qgeomapreplyosm.cpp

OTHER_FILES += \
    myOsm_plugin.json

unix {
    target.path = /usr/lib
    INSTALLS += target
}
Am jeweiligen Inhalt der Klassen & Headern habe ich bis jetzt noch nichts geändert. Ich habe mir jedoch schon alles angeschaut und soweit verstanden, was wo wie gemacht wird. So müsste ich bei Zeit nur in der Datei "qgeomapreplyosm.cpp" die Serveradresse auf die gewünschte Adresse ändern. Der Server muss natürlich die Anfrage natürlich dann auch unterstützen :wink:

Die json-Datei habe ich selbst geschrieben und beinhaltet folgenden Inhalt:

Code: Alles auswählen

{
    "Keys": ["osmMap"],
    "Provider": "osm",
    "Version": 100,
    "Experimental": false,
    "Features": [
        "OnlineMappingFeature"
     ]
}
So wie ich das ganze verstanden habe, bestimme ich hierüber den Provider des Kartenmaterials, unter welchem Key das Plugin erreichbar ist und welche Features von meinem Plugin unterstützt werden.
Anschließend habe ich das OSM-Plugin-Projekt als Desktop-Release-Bibliothek gebaut und habe meinem Android-Projekt die Datei: "libMyOsmPlugin.so" als "Externe Bibliothek" bekannt gemacht. Die zugehörige Projektdatei (.pro) des Android-Projekts sieht nun so aus:

Code: Alles auswählen

TEMPLATE = app

QT += qml quick widgets
QT += location
QT += positioning
QT += network

#CONFIG += mobility
#MOBILITY += location

PKGCONFIG += openssl

SOURCES += main.cpp \


RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Default rules for deployment.
include(deployment.pri)

DISTFILES += \
    android/gradle/wrapper/gradle-wrapper.jar \
    android/AndroidManifest.xml \
    android/res/values/libs.xml \
    android/build.gradle \
    android/gradle/wrapper/gradle-wrapper.properties \
    android/gradlew \
    android/gradlew.bat \
    myOsm_plugin.json \

HEADERS += \

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build-MyOsmPlugin-Desktop_Qt_5_4_1_GCC_64bit-Release/release/ -lMyOsmPlugin
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build-MyOsmPlugin-Desktop_Qt_5_4_1_GCC_64bit-Release/debug/ -lMyOsmPlugin
else:unix: LIBS += -L$$PWD/../build-MyOsmPlugin-Desktop_Qt_5_4_1_GCC_64bit-Release/ -lMyOsmPlugin

INCLUDEPATH += $$PWD/../build-MyOsmPlugin-Desktop_Qt_5_4_1_GCC_64bit-Release
DEPENDPATH += $$PWD/../build-MyOsmPlugin-Desktop_Qt_5_4_1_GCC_64bit-Release
Wenn ich im Android-Projekt den Plugin-Key nun auf "osmMap" ändere und das Projekt neu baue, verläuft dies auch reibungslos. Nachdem die App aber auf dem Tablet gestartet wurde, erscheint folgende Meldung in der Console:
D/OpenGLRenderer(11675): Enabling debug mode 0
W/libAndroid_Application.so(11675): qrc:/main.qml:71 ((null)): qrc:/main.qml:71:5: QML Map: Error: Plugin does not support mapping.
W/libAndroid_Application.so(11675): Error message:The geoservices provider is not supported.
W/libAndroid_Application.so(11675): qrc:/main.qml:66 ((null)): qrc:/main.qml:66: ReferenceError: marker is not defined
D/QtPositioning(11675): Looper Thread startup time in ms: 1
D/QtPositioning(11675): Regular updates using GPS 1000
D/QtPositioning(11675): Regular updates using network 1000
W/libAndroid_Application.so(11675): (null):0 ((null)): QObject::connect: Cannot connect (null)::copyrightsChanged(QImage,QPoint) to QDeclarativeGeoMapCopyrightNotice::copyrightsChanged(QImage,QPoint)
Die App bleibt leer und zeigt kein Kartenmaterial an.

Ich hoffe ihr könnt mir helfen und sagen woran das liegt. Weil eigentlich habe ich ja gar nichts großartig anderes gemacht, als das OSM-Plugin des QT-Repositories in ein eigenes Projekt kopiert und meinem Android-Projekt als externes Plugin zur Verfügung gestellt. Habe ich irgendetwas vergessen oder nicht beachtet? Danke schon einmal für eure Antworten :)
Zuletzt geändert von riede am 6. Mai 2015 13:35, insgesamt 1-mal geändert.

veeman
Beiträge: 247
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: OpenStreetMap GeoService Plugin für QML-Map

Beitrag von veeman » 4. Mai 2015 23:28

Ich würde nach dem hier mal schauen:
load(qt_plugin)

Die Konfigurations-Datei "qt_plugin" wird sich ggf. irgendwo in den Ordnern der Qt Installation befinden.
Vermutlich werden da Sachen Konfiguriert die dazu führen, dass in die Bibliothek weitere Informationen
exportieren werden damit diese von Qt auch als Plugin erkannt wird.
mfg veeman

mage-dev

riede
Beiträge: 4
Registriert: 28. April 2015 12:06

Re: OpenStreetMap GeoService Plugin für QML-Map

Beitrag von riede » 5. Mai 2015 15:19

Danke für deine Antwort. Ich werde danach mal schauen. :)
ich habe herausgefunden, dass zur Laufzeit meiner Android-App in der Liste der verfügbaren Map-Provider mein angegebener Provider nicht drin steht. Das erklärt auch die Konsolen-Ausgaben (Provider wird nicht unterstützt etc) und bestärkt die Idee, dass das Plugin nicht richtig importiert ist. Ich weiß aber einfach nicht so recht wie ich das Plugin anders bekannt machen soll. Vielleicht weiß ja jemand von euch weiter :wink:

riede
Beiträge: 4
Registriert: 28. April 2015 12:06

Re: OpenStreetMap GeoService Plugin für QML-Map

Beitrag von riede » 6. Mai 2015 13:35

So ich habe das Problem ausfindig gemacht. An meinen Programmierkünsten liegt es wohl nicht. Sobald ich das kompolierte Plugin in den Standardpfad von Qt kopiere (*Qt_home*/5.4/*plattform_to_compile_for*/plugins/geoservices), funktioniert meine Android App einwandrei. D. h., das Plugin wird geladen & alle Map-Tiles werden angezeigt. Deshalb markiere ich das Thema als GELÖST...

ManX070
Beiträge: 1
Registriert: 29. Juni 2018 13:35

Re: [GELÖST] OpenStreetMap GeoService Plugin für QML-Map

Beitrag von ManX070 » 29. Juni 2018 13:38

Hallo Riede,
hab das selbe Problem wie du. Würde gerne mein eigenes Plugin schreiben womit man auf seinen Tileserver und zusätzlich von auf Standard OSM Server zugreifen kann. Würdest du mir dein Projekt mit dem Plugin zur Verfügung stellen damit ich es für meine Zwecke umstellen kann? :)

Antworten