[GELÖST] OpenStreetMap GeoService Plugin für QML-Map
Verfasst: 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.
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.
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:
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
Die json-Datei habe ich selbst geschrieben und beinhaltet folgenden Inhalt:
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:
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:
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
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.
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"
}
// ...
}
}
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
}
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"
]
}
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
Die App bleibt leer und zeigt kein Kartenmaterial an.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)
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