summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaolo Angelelli <paolo.angelelli@qt.io>2018-01-11 14:49:00 +0100
committerPaolo Angelelli <paolo.angelelli@qt.io>2018-01-11 14:49:00 +0100
commit17b4d7ed60e4a9e521ae74a74ea084a21633955e (patch)
tree05dc1dda6ef318e35e4a7ffefdf541608e7bd33a /src
parent5edef5e181e0f3cf2e04182d06b3c781717e6f87 (diff)
parent8014727e52c65bf6496ad4adf6c8e7ec33250bb7 (diff)
downloadqtlocation-17b4d7ed60e4a9e521ae74a74ea084a21633955e.tar.gz
Merge remote-tracking branch 'origin/dev' into wip/navigation
Conflicts: src/location/maps/qgeomaneuver.cpp src/location/maps/qgeomaneuver.h src/location/maps/qgeomaneuver_p.h tests/auto/declarative_core/tst_routing.qml Change-Id: Iedf10d678a9129797f9aae872e09f78ef0a32de1
Diffstat (limited to 'src')
-rw-r--r--src/3rdparty/icu_dependency.pri13
m---------src/3rdparty/mapbox-gl-native0
-rw-r--r--src/imports/location/location.cpp7
-rw-r--r--src/imports/location/plugins.qmltypes49
-rw-r--r--src/imports/positioning/plugins.qmltypes21
-rw-r--r--src/imports/positioning/positioning.cpp12
-rw-r--r--src/imports/positioning/positioning.pro15
-rw-r--r--src/location/configure.json2
-rw-r--r--src/location/declarativemaps/locationvaluetypehelper.cpp30
-rw-r--r--src/location/declarativemaps/locationvaluetypehelper_p.h4
-rw-r--r--src/location/declarativemaps/qdeclarativegeocodemodel.cpp3
-rw-r--r--src/location/declarativemaps/qdeclarativegeomaneuver.cpp30
-rw-r--r--src/location/declarativemaps/qdeclarativegeomaneuver_p.h9
-rw-r--r--src/location/declarativemaps/qdeclarativegeomap.cpp17
-rw-r--r--src/location/declarativemaps/qdeclarativegeomapitemview.cpp2
-rw-r--r--src/location/declarativemaps/qdeclarativegeoroutemodel.cpp663
-rw-r--r--src/location/declarativemaps/qdeclarativegeoroutemodel_p.h131
-rw-r--r--src/location/declarativemaps/qdeclarativepolygonmapitem.cpp5
-rw-r--r--src/location/declarativemaps/qquickgeomapgesturearea.cpp2
-rw-r--r--src/location/declarativeplaces/qdeclarativesearchmodelbase.cpp3
-rw-r--r--src/location/doc/qtlocation.qdocconf2
-rw-r--r--src/location/doc/snippets/cpp/cppqml.cpp16
-rw-r--r--src/location/doc/snippets/cpp/main.cpp16
-rw-r--r--src/location/doc/snippets/declarative/content/Cell.qml16
-rw-r--r--src/location/doc/snippets/declarative/declarative-location.qml16
-rw-r--r--src/location/doc/snippets/declarative/maps.qml16
-rw-r--r--src/location/doc/snippets/declarative/places.qml16
-rw-r--r--src/location/doc/snippets/declarative/places_loader.qml16
-rw-r--r--src/location/doc/snippets/declarative/plugin.qml16
-rw-r--r--src/location/doc/snippets/declarative/routing.qml16
-rw-r--r--src/location/doc/snippets/places/main.cpp16
-rw-r--r--src/location/doc/snippets/places/requesthandler.h16
-rw-r--r--src/location/doc/src/cpp-qml.qdoc10
-rw-r--r--src/location/doc/src/maps.qdoc10
-rw-r--r--src/location/doc/src/places.qdoc10
-rw-r--r--src/location/doc/src/plugins/itemsoverlay.qdoc8
-rw-r--r--src/location/doc/src/plugins/mapbox.qdoc26
-rw-r--r--src/location/doc/src/plugins/mapboxgl.qdoc16
-rw-r--r--src/location/doc/src/plugins/nokia.qdoc10
-rw-r--r--src/location/doc/src/plugins/osm.qdoc8
-rw-r--r--src/location/doc/src/plugins/places-backend.qdoc10
-rw-r--r--src/location/doc/src/qml-maps.qdoc10
-rw-r--r--src/location/doc/src/qtlocation-changes.qdoc10
-rw-r--r--src/location/doc/src/qtlocation-cpp.qdoc10
-rw-r--r--src/location/doc/src/qtlocation-examples.qdoc10
-rw-r--r--src/location/doc/src/qtlocation-geoservices.qdoc10
-rw-r--r--src/location/doc/src/qtlocation-qml.qdoc10
-rw-r--r--src/location/doc/src/qtlocation.qdoc10
-rw-r--r--src/location/maps/qgeofiletilecache.cpp38
-rw-r--r--src/location/maps/qgeofiletilecache_p.h4
-rw-r--r--src/location/maps/qgeomaneuver.cpp40
-rw-r--r--src/location/maps/qgeomaneuver.h5
-rw-r--r--src/location/maps/qgeomaneuver_p.h7
-rw-r--r--src/location/maps/qgeomapparameter.cpp28
-rw-r--r--src/location/maps/qgeomapparameter_p.h10
-rw-r--r--src/location/maps/qgeoprojection.cpp20
-rw-r--r--src/location/maps/qgeorouteparserosrmv5.cpp57
-rw-r--r--src/location/maps/qgeorouteparserosrmv5_p.h4
-rw-r--r--src/location/maps/qgeorouterequest.cpp50
-rw-r--r--src/location/maps/qgeorouterequest.h6
-rw-r--r--src/location/maps/qgeorouterequest_p.h3
-rw-r--r--src/plugins/geoservices/esri/geocodingmanagerengine_esri.cpp4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/LICENSE.txt116
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/aerialway.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/airfield.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/airport.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/alcohol-shop.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/america-football.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/amusement-park.svg20
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/aquarium.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/art-gallery.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/attraction.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/bakery.svg15
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/bank.svg19
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/bar.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/barrier.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/baseball.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/basketball.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/bbq.svg17
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/beer.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/bicycle-share.svg20
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/bicycle.svg21
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/blood-bank.svg8
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/buddhism.svg24
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/building-alt1.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/building.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/bus.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/cafe.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/campsite.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/car.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/castle.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/cemetery.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/cinema.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/circle-stroked.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/circle.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/city.svg14
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/clothing-store.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/college.svg5
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/commercial.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/cricket.svg14
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/cross.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/dam.svg20
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/danger.svg18
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/defibrillator.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/dentist.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/doctor.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/dog-park.svg49
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/drinking-water.svg5
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/embassy.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/emergency-phone.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/entrance-alt1.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/entrance.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/farm.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/fast-food.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/fence.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/ferry.svg19
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/fire-station.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/florist.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/fuel.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/gaming.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/garden-center.svg5
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/garden.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/gift.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/golf.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/grocery.svg48
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/hairdresser.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/harbor.svg14
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/heart.svg8
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/heliport.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/home.svg8
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/horse-riding.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/hospital.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/ice-cream.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/industry.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/information.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/karaoke.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/landmark.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/landuse.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/laundry.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/library.svg15
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/lighthouse.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/lodging.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/logging.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/marker-stroked.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/marker.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/mobile-phone.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/monument.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/mountain.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/museum.svg14
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/music.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/natural.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/park-alt1.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/park.svg15
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/parking-garage.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/parking.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/pharmacy.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/picnic-site.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/pitch.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/place-of-worship.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/playground.svg16
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/police.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/post.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/prison.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/rail-light.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/rail-metro.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/rail.svg49
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/ranger-station.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/recycling.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/religious-christian.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/religious-jewish.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/religious-muslim.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/residential-community.svg8
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/restaurant.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/roadblock.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/rocket.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/school.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/scooter.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/shelter.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/shop.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/skiing.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/slaughterhouse.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/snowmobile.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/soccer.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/square-stroked.svg8
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/square.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/stadium.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/star-stroked.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/star.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/suitcase.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/sushi.svg19
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/swimming.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/teahouse.svg8
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/telephone.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/tennis.svg16
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/theatre.svg13
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/toilet.svg16
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/town-hall.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/town.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/triangle-stroked.svg12
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/triangle.svg11
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/veterinary.svg18
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/village.svg4
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/volcano.svg16
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/warehouse.svg9
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/waste-basket.svg10
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/water.svg7
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/wetland.svg21
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/wheelchair.svg17
-rw-r--r--src/plugins/geoservices/mapbox/maki-4.0.0/zoo.svg15
-rw-r--r--src/plugins/geoservices/mapbox/mapbox.pro20
-rw-r--r--src/plugins/geoservices/mapbox/mapbox.qrc150
-rw-r--r--src/plugins/geoservices/mapbox/mapbox_plugin.json9
-rw-r--r--src/plugins/geoservices/mapbox/qgeocodereplymapbox.cpp106
-rw-r--r--src/plugins/geoservices/mapbox/qgeocodereplymapbox.h63
-rw-r--r--src/plugins/geoservices/mapbox/qgeocodingmanagerenginemapbox.cpp205
-rw-r--r--src/plugins/geoservices/mapbox/qgeocodingmanagerenginemapbox.h83
-rw-r--r--src/plugins/geoservices/mapbox/qgeoroutereplymapbox.cpp129
-rw-r--r--src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.cpp48
-rw-r--r--src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.h4
-rw-r--r--src/plugins/geoservices/mapbox/qgeoserviceproviderpluginmapbox.cpp38
-rw-r--r--src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp5
-rw-r--r--src/plugins/geoservices/mapbox/qmapboxcommon.cpp140
-rw-r--r--src/plugins/geoservices/mapbox/qmapboxcommon.h71
-rw-r--r--src/plugins/geoservices/mapbox/qplacecategoriesreplymapbox.cpp66
-rw-r--r--src/plugins/geoservices/mapbox/qplacecategoriesreplymapbox.h62
-rw-r--r--src/plugins/geoservices/mapbox/qplacemanagerenginemapbox.cpp318
-rw-r--r--src/plugins/geoservices/mapbox/qplacemanagerenginemapbox.h102
-rw-r--r--src/plugins/geoservices/mapbox/qplacesearchreplymapbox.cpp230
-rw-r--r--src/plugins/geoservices/mapbox/qplacesearchreplymapbox.h71
-rw-r--r--src/plugins/geoservices/mapbox/qplacesearchsuggestionreplymapbox.cpp120
-rw-r--r--src/plugins/geoservices/mapbox/qplacesearchsuggestionreplymapbox.h70
-rw-r--r--src/plugins/geoservices/mapboxgl/mapboxgl.pro11
-rw-r--r--src/plugins/geoservices/mapboxgl/qgeomapmapboxgl.cpp17
-rw-r--r--src/plugins/geoservices/mapboxgl/qgeoserviceproviderpluginmapboxgl.cpp9
-rw-r--r--src/plugins/geoservices/mapboxgl/qmapboxglstylechange.cpp13
-rw-r--r--src/plugins/geoservices/mapboxgl/qsgmapboxglnode.cpp9
-rw-r--r--src/plugins/geoservices/nokia/qgeocodingmanagerengine_nokia.cpp26
-rw-r--r--src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp19
-rw-r--r--src/plugins/geoservices/nokia/qgeouriprovider.cpp2
-rw-r--r--src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp4
-rw-r--r--src/plugins/geoservices/osm/qgeoroutereplyosm.cpp2
-rw-r--r--src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp15
-rw-r--r--src/plugins/geoservices/osm/qgeotileproviderosm.cpp2
-rw-r--r--src/plugins/geoservices/osm/qplacemanagerengineosm.cpp20
-rw-r--r--src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java7
-rw-r--r--src/plugins/position/android/src/jnipositioning.cpp4
-rw-r--r--src/positioning/doc/snippets/cpp/cppqml.cpp16
-rw-r--r--src/positioning/doc/snippets/cpp/main.cpp16
-rw-r--r--src/positioning/doc/snippets/doc_src_qtpositioning.qml16
-rw-r--r--src/positioning/doc/src/cpp-position.qdoc10
-rw-r--r--src/positioning/doc/src/cpp-qml-positioning.qdoc10
-rw-r--r--src/positioning/doc/src/qml-position.qdoc10
-rw-r--r--src/positioning/doc/src/qtpositioning-examples.qdoc10
-rw-r--r--src/positioning/doc/src/qtpositioning-plugins.qdoc10
-rw-r--r--src/positioning/doc/src/qtpositioning-qml.qdoc10
-rw-r--r--src/positioning/doc/src/qtpositioning.qdoc10
-rw-r--r--src/positioning/positioning.pro4
-rw-r--r--src/positioning/qgeocoordinate.cpp36
-rw-r--r--src/positioning/qgeocoordinate.h13
-rw-r--r--src/positioning/qgeocoordinateobject.cpp92
-rw-r--r--src/positioning/qgeocoordinateobject_p.h83
-rw-r--r--src/positioning/qgeopath.cpp34
-rw-r--r--src/positioning/qgeopath.h5
-rw-r--r--src/positioningquick/positioningquick.pro10
-rw-r--r--src/positioningquick/qdeclarativeposition.cpp (renamed from src/imports/positioning/qdeclarativeposition.cpp)5
-rw-r--r--src/positioningquick/qdeclarativeposition_p.h (renamed from src/imports/positioning/qdeclarativeposition_p.h)4
-rw-r--r--src/positioningquick/qdeclarativepositionsource.cpp (renamed from src/imports/positioning/qdeclarativepositionsource.cpp)13
-rw-r--r--src/positioningquick/qdeclarativepositionsource_p.h (renamed from src/imports/positioning/qdeclarativepositionsource_p.h)4
-rw-r--r--src/positioningquick/qpositioningquickglobal.h69
-rw-r--r--src/positioningquick/qpositioningquickglobal_p.h61
-rw-r--r--src/src.pro17
271 files changed, 5702 insertions, 563 deletions
diff --git a/src/3rdparty/icu_dependency.pri b/src/3rdparty/icu_dependency.pri
deleted file mode 100644
index 6318631f..00000000
--- a/src/3rdparty/icu_dependency.pri
+++ /dev/null
@@ -1,13 +0,0 @@
-win32 {
- CONFIG(static, static|shared) {
- CONFIG(debug, debug|release) {
- LIBS_PRIVATE += -lsicuind -lsicuucd -lsicudtd
- } else {
- LIBS_PRIVATE += -lsicuin -lsicuuc -lsicudt
- }
- } else {
- LIBS_PRIVATE += -licuin -licuuc -licudt
- }
-} else {
- LIBS_PRIVATE += -licui18n -licuuc -licudata
-}
diff --git a/src/3rdparty/mapbox-gl-native b/src/3rdparty/mapbox-gl-native
-Subproject 1c633072fcea7ad153ab6f8ec40dd72d83541ea
+Subproject 8c1be4ec01ef46bf453856531ebf53b48ce3dbe
diff --git a/src/imports/location/location.cpp b/src/imports/location/location.cpp
index 9c89d3b8..dbcb3662 100644
--- a/src/imports/location/location.cpp
+++ b/src/imports/location/location.cpp
@@ -180,6 +180,13 @@ public:
qmlRegisterUncreatableType<QDeclarativeGeoCameraCapabilities>(uri, major, minor, "CameraCapabilities"
, QStringLiteral("CameraCapabilities is not intended instantiable by developer."));
+ // Register the 5.11 types
+ minor = 11;
+ qmlRegisterType<QDeclarativeGeoWaypoint>(uri, major, minor, "Waypoint");
+
+ // Register the latest Qt version as QML type version
+ qmlRegisterModule(uri, QT_VERSION_MAJOR, QT_VERSION_MINOR);
+
//registrations below are version independent
qRegisterMetaType<QPlaceCategory>();
qRegisterMetaType<QPlace>();
diff --git a/src/imports/location/plugins.qmltypes b/src/imports/location/plugins.qmltypes
index e866cac7..db6c09f3 100644
--- a/src/imports/location/plugins.qmltypes
+++ b/src/imports/location/plugins.qmltypes
@@ -4,7 +4,7 @@ import QtQuick.tooling 1.2
// It is used for QML tooling purposes only.
//
// This file was auto-generated by:
-// 'qmlplugindump -nonrelocatable QtLocation 5.9'
+// 'qmlplugindump -nonrelocatable QtLocation 5.10'
Module {
dependencies: ["QtQuick 2.8"]
@@ -91,6 +91,19 @@ Module {
exportMetaObjectRevisions: [0]
}
Component {
+ name: "QDeclarativeGeoCameraCapabilities"
+ prototype: "QObject"
+ exports: ["QtLocation/CameraCapabilities 5.10"]
+ isCreatable: false
+ exportMetaObjectRevisions: [0]
+ Property { name: "minimumZoomLevel"; type: "double"; isReadonly: true }
+ Property { name: "maximumZoomLevel"; type: "double"; isReadonly: true }
+ Property { name: "minimumTilt"; type: "double"; isReadonly: true }
+ Property { name: "maximumTilt"; type: "double"; isReadonly: true }
+ Property { name: "minimumFieldOfView"; type: "double"; isReadonly: true }
+ Property { name: "maximumFieldOfView"; type: "double"; isReadonly: true }
+ }
+ Component {
name: "QDeclarativeGeoManeuver"
prototype: "QObject"
exports: [
@@ -223,6 +236,16 @@ Module {
Parameter { name: "ready"; type: "bool" }
}
Method {
+ name: "setBearing"
+ Parameter { name: "bearing"; type: "double" }
+ Parameter { name: "coordinate"; type: "QGeoCoordinate" }
+ }
+ Method {
+ name: "alignCoordinateToPoint"
+ Parameter { name: "coordinate"; type: "QGeoCoordinate" }
+ Parameter { name: "point"; type: "QPointF" }
+ }
+ Method {
name: "removeMapItem"
Parameter { name: "item"; type: "QDeclarativeGeoMapItemBase"; isPointer: true }
}
@@ -238,6 +261,14 @@ Module {
name: "removeMapItemGroup"
Parameter { name: "itemGroup"; type: "QDeclarativeGeoMapItemGroup"; isPointer: true }
}
+ Method {
+ name: "removeMapItemView"
+ Parameter { name: "itemView"; type: "QDeclarativeGeoMapItemView"; isPointer: true }
+ }
+ Method {
+ name: "addMapItemView"
+ Parameter { name: "itemView"; type: "QDeclarativeGeoMapItemView"; isPointer: true }
+ }
Method { name: "clearMapItems" }
Method {
name: "addMapParameter"
@@ -388,6 +419,13 @@ Module {
Property { name: "description"; type: "string"; isReadonly: true }
Property { name: "mobile"; type: "bool"; isReadonly: true }
Property { name: "night"; revision: 1; type: "bool"; isReadonly: true }
+ Property {
+ name: "cameraCapabilities"
+ type: "QDeclarativeGeoCameraCapabilities"
+ isReadonly: true
+ isPointer: true
+ }
+ Property { name: "metadata"; type: "QVariantMap"; isReadonly: true }
}
Component {
name: "QDeclarativeGeoRoute"
@@ -482,7 +520,8 @@ Module {
"TunnelFeature": 16,
"DirtRoadFeature": 32,
"ParksFeature": 64,
- "MotorPoolLaneFeature": 128
+ "MotorPoolLaneFeature": 128,
+ "TrafficFeature": 256
}
}
Enum {
@@ -711,7 +750,6 @@ Module {
Property {
name: "required"
type: "QDeclarativeGeoServiceProviderRequirements"
- isReadonly: true
isPointer: true
}
Property { name: "locales"; type: "QStringList" }
@@ -771,6 +809,7 @@ Module {
name: "valueChanged"
Parameter { name: "value"; type: "QVariant" }
}
+ Signal { name: "initialized" }
}
Component {
name: "QDeclarativeGeoServiceProviderRequirements"
@@ -1067,6 +1106,10 @@ Module {
name: "removeCoordinate"
Parameter { name: "index"; type: "int" }
}
+ Method {
+ name: "setPath"
+ Parameter { name: "path"; type: "QGeoPath" }
+ }
}
Component {
name: "QDeclarativeRatings"
diff --git a/src/imports/positioning/plugins.qmltypes b/src/imports/positioning/plugins.qmltypes
index 859736a1..d9791c6d 100644
--- a/src/imports/positioning/plugins.qmltypes
+++ b/src/imports/positioning/plugins.qmltypes
@@ -4,7 +4,7 @@ import QtQuick.tooling 1.2
// It is used for QML tooling purposes only.
//
// This file was auto-generated by:
-// 'qmlplugindump -nonrelocatable QtPositioning 5.9'
+// 'qmlplugindump -nonrelocatable QtPositioning 5.10'
Module {
dependencies: ["QtQuick 2.8"]
@@ -73,6 +73,12 @@ Module {
type: "QGeoPath"
Parameter { name: "value"; type: "QJSValue" }
}
+ Method { name: "polygon"; type: "QGeoPath" }
+ Method {
+ name: "polygon"
+ type: "QGeoPath"
+ Parameter { name: "value"; type: "QVariantList" }
+ }
Method {
name: "shapeToCircle"
type: "QGeoCircle"
@@ -88,6 +94,11 @@ Module {
type: "QGeoPath"
Parameter { name: "shape"; type: "QGeoShape" }
}
+ Method {
+ name: "shapeToPolygon"
+ type: "QGeoPolygon"
+ Parameter { name: "shape"; type: "QGeoShape" }
+ }
}
Component {
name: "QDeclarativeGeoAddress"
@@ -122,10 +133,9 @@ Module {
exports: [
"QtPositioning/Position 5.0",
"QtPositioning/Position 5.3",
- "QtPositioning/Position 5.4",
- "QtPositioning/Position 5.9"
+ "QtPositioning/Position 5.4"
]
- exportMetaObjectRevisions: [0, 1, 2, 2]
+ exportMetaObjectRevisions: [0, 1, 2]
Property { name: "latitudeValid"; type: "bool"; isReadonly: true }
Property { name: "longitudeValid"; type: "bool"; isReadonly: true }
Property { name: "altitudeValid"; type: "bool"; isReadonly: true }
@@ -209,7 +219,8 @@ Module {
"UnknownType": 0,
"RectangleType": 1,
"CircleType": 2,
- "PathType": 3
+ "PathType": 3,
+ "PolygonType": 4
}
}
Property { name: "type"; type: "ShapeType"; isReadonly: true }
diff --git a/src/imports/positioning/positioning.cpp b/src/imports/positioning/positioning.cpp
index 585445b5..1f7f9498 100644
--- a/src/imports/positioning/positioning.cpp
+++ b/src/imports/positioning/positioning.cpp
@@ -42,8 +42,8 @@
#include <QtPositioning/private/qdeclarativegeolocation_p.h>
#include <QtPositioning/private/qwebmercator_p.h>
-#include "qdeclarativepositionsource_p.h"
-#include "qdeclarativeposition_p.h"
+#include <QtPositioningQuick/private/qdeclarativepositionsource_p.h>
+#include <QtPositioningQuick/private/qdeclarativeposition_p.h>
#include "qquickgeocoordinateanimation_p.h"
#include "locationsingleton.h"
@@ -57,6 +57,7 @@
#include <QtPositioning/QGeoCircle>
#include <QtPositioning/QGeoPath>
#include <QtPositioning/QGeoLocation>
+#include <QtPositioning/private/qgeocoordinateobject_p.h>
#include <QtCore/QDebug>
@@ -565,6 +566,7 @@ public:
qRegisterMetaType<QGeoLocation>();
qRegisterMetaType<QGeoShape>();
QMetaType::registerEqualsComparator<QGeoShape>();
+ qRegisterMetaType<QGeoCoordinateObject *>();
qRegisterAnimationInterpolator<QGeoCoordinate>(q_coordinateInterpolator);
@@ -586,10 +588,8 @@ public:
minor = 4;
qmlRegisterType<QDeclarativePosition, 2>(uri, major, minor, "Position");
- // Register the 5.9 types
- // Introduction of 5.9 version; existing 5.4 exports become automatically available under 5.9
- minor = 9;
- qmlRegisterType<QDeclarativePosition, 2>(uri, major, minor, "Position");
+ // Register the latest Qt version as QML type version
+ qmlRegisterModule(uri, QT_VERSION_MAJOR, QT_VERSION_MINOR);
} else {
qDebug() << "Unsupported URI given to load positioning QML plugin: " << QLatin1String(uri);
}
diff --git a/src/imports/positioning/positioning.pro b/src/imports/positioning/positioning.pro
index 119c3dea..f2387282 100644
--- a/src/imports/positioning/positioning.pro
+++ b/src/imports/positioning/positioning.pro
@@ -1,18 +1,9 @@
-QT += quick-private positioning-private qml-private core-private
+QT += quick-private positioning-private positioningquick-private qml-private core-private
INCLUDEPATH *= $$PWD
-HEADERS += qdeclarativeposition_p.h \
- qdeclarativepositionsource_p.h \
- locationsingleton.h \
- qquickgeocoordinateanimation_p.h \
- qquickgeocoordinateanimation_p_p.h
-
-SOURCES += qdeclarativeposition.cpp \
- positioning.cpp \
- qdeclarativepositionsource.cpp \
- locationsingleton.cpp \
- qquickgeocoordinateanimation.cpp
+HEADERS += $$files(*.h)
+SOURCES += $$files(*.cpp)
load(qml_plugin)
diff --git a/src/location/configure.json b/src/location/configure.json
index 4de6e865..bfa3d6f2 100644
--- a/src/location/configure.json
+++ b/src/location/configure.json
@@ -37,7 +37,7 @@
"condition": [
"features.opengl",
"features.c++14",
- "!config.qnx && (!config.win32 || config.mingw)"
+ "!config.qnx && !config.intel_icc && (!config.win32 || config.mingw)"
],
"output": [ "privateFeature" ]
},
diff --git a/src/location/declarativemaps/locationvaluetypehelper.cpp b/src/location/declarativemaps/locationvaluetypehelper.cpp
index 4f39e0b4..5f75e225 100644
--- a/src/location/declarativemaps/locationvaluetypehelper.cpp
+++ b/src/location/declarativemaps/locationvaluetypehelper.cpp
@@ -35,11 +35,14 @@
****************************************************************************/
#include "locationvaluetypehelper_p.h"
+#include <QVariantMap>
QGeoCoordinate parseCoordinate(const QJSValue &value, bool *ok)
{
QGeoCoordinate c;
+ if (ok)
+ *ok = false;
if (value.isObject()) {
if (value.hasProperty(QStringLiteral("latitude")))
@@ -56,6 +59,33 @@ QGeoCoordinate parseCoordinate(const QJSValue &value, bool *ok)
return c;
}
+QGeoCoordinate parseCoordinate(const QVariant &value, bool *ok)
+{
+ QGeoCoordinate c;
+ if (ok)
+ *ok = false;
+
+ if (value.canConvert<QGeoCoordinate>()) {
+ c = value.value<QGeoCoordinate>();
+ if (ok)
+ *ok = true;
+ } else if (value.type() == QVariant::Map) {
+ const QVariantMap &map = value.toMap();
+
+ if (map.contains(QStringLiteral("latitude")))
+ c.setLatitude(map.value(QStringLiteral("latitude")).toDouble());
+ if (map.contains(QStringLiteral("longitude")))
+ c.setLongitude(map.value(QStringLiteral("longitude")).toDouble());
+ if (map.contains(QStringLiteral("altitude")))
+ c.setAltitude(map.value(QStringLiteral("altitude")).toDouble());
+
+ if (ok)
+ *ok = c.isValid(); // Not considering the case where the map is valid but containing NaNs.
+ }
+
+ return c;
+}
+
QGeoRectangle parseRectangle(const QJSValue &value, bool *ok)
{
QGeoRectangle r;
diff --git a/src/location/declarativemaps/locationvaluetypehelper_p.h b/src/location/declarativemaps/locationvaluetypehelper_p.h
index 50038e88..09f3ab06 100644
--- a/src/location/declarativemaps/locationvaluetypehelper_p.h
+++ b/src/location/declarativemaps/locationvaluetypehelper_p.h
@@ -49,11 +49,13 @@
//
#include <QJSValue>
+#include <QVariant>
#include <QGeoCoordinate>
#include <QGeoRectangle>
#include <QGeoCircle>
-QGeoCoordinate parseCoordinate(const QJSValue &value, bool *ok);
+QGeoCoordinate parseCoordinate(const QJSValue &value, bool *ok = nullptr);
+QGeoCoordinate parseCoordinate(const QVariant &value, bool *ok = nullptr);
QGeoRectangle parseRectangle(const QJSValue &value, bool *ok);
QGeoCircle parseCircle(const QJSValue &value, bool *ok);
diff --git a/src/location/declarativemaps/qdeclarativegeocodemodel.cpp b/src/location/declarativemaps/qdeclarativegeocodemodel.cpp
index 3e2a1aea..b64b2545 100644
--- a/src/location/declarativemaps/qdeclarativegeocodemodel.cpp
+++ b/src/location/declarativemaps/qdeclarativegeocodemodel.cpp
@@ -42,6 +42,7 @@
#include <QtPositioning/QGeoCircle>
#include <QtLocation/QGeoServiceProvider>
#include <QtLocation/QGeoCodingManager>
+#include <QtPositioning/QGeoPolygon>
QT_BEGIN_NAMESPACE
@@ -374,6 +375,8 @@ QVariant QDeclarativeGeocodeModel::bounds() const
return QVariant::fromValue(QGeoRectangle(boundingArea_));
else if (boundingArea_.type() == QGeoShape::CircleType)
return QVariant::fromValue(QGeoCircle(boundingArea_));
+ else if (boundingArea_.type() == QGeoShape::PolygonType)
+ return QVariant::fromValue(QGeoPolygon(boundingArea_));
else
return QVariant::fromValue(boundingArea_);
}
diff --git a/src/location/declarativemaps/qdeclarativegeomaneuver.cpp b/src/location/declarativemaps/qdeclarativegeomaneuver.cpp
index b1c67167..ef3639af 100644
--- a/src/location/declarativemaps/qdeclarativegeomaneuver.cpp
+++ b/src/location/declarativemaps/qdeclarativegeomaneuver.cpp
@@ -185,6 +185,36 @@ QGeoCoordinate QDeclarativeGeoManeuver::waypoint() const
}
/*!
+ \qmlproperty Object RouteManeuver::extendedAttributes
+
+ This property holds the extended attributes of the maneuver and is a map.
+ These attributes are plugin specific, and can be empty.
+
+ Consult the \l {Qt Location#Plugin References and Parameters}{plugin documentation}
+ for what attributes are supported and how they should be used.
+
+ Note, due to limitations of the QQmlPropertyMap, it is not possible
+ to declaratively specify the attributes in QML, assignment of attributes keys
+ and values can only be accomplished by JavaScript.
+
+ \since QtLocation 5.11
+*/
+QQmlPropertyMap *QDeclarativeGeoManeuver::extendedAttributes() const
+{
+ if (!m_extendedAttributes) {
+ QDeclarativeGeoManeuver *self = const_cast<QDeclarativeGeoManeuver *>(this);
+ self->m_extendedAttributes = new QQmlPropertyMap(self);
+ // Fill it
+ const QStringList keys = maneuver_.extendedAttributes().keys();
+ for (const QString &key: keys) {
+ self->m_extendedAttributes->insert(key,
+ maneuver_.extendedAttributes().value(key));
+ }
+ }
+ return m_extendedAttributes;
+}
+
+/*!
\qmlproperty bool RouteManeuver::waypointValid
This read-only property holds whether this \l waypoint, associated with this
diff --git a/src/location/declarativemaps/qdeclarativegeomaneuver_p.h b/src/location/declarativemaps/qdeclarativegeomaneuver_p.h
index 0e957a1f..f321c133 100644
--- a/src/location/declarativemaps/qdeclarativegeomaneuver_p.h
+++ b/src/location/declarativemaps/qdeclarativegeomaneuver_p.h
@@ -50,7 +50,7 @@
#include <QtLocation/private/qlocationglobal_p.h>
#include <QtLocation/qgeomaneuver.h>
-
+#include <QtQml/QQmlPropertyMap>
#include <QtPositioning/QGeoCoordinate>
#include <QObject>
@@ -71,6 +71,7 @@ class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoManeuver : public QObject
Q_PROPERTY(qreal distanceToNextInstruction READ distanceToNextInstruction CONSTANT)
Q_PROPERTY(QGeoCoordinate waypoint READ waypoint CONSTANT)
Q_PROPERTY(bool waypointValid READ waypointValid CONSTANT)
+ Q_PROPERTY(QObject *extendedAttributes READ extendedAttributes NOTIFY extendedAttributesChanged)
public:
enum Direction {
@@ -101,9 +102,15 @@ public:
int timeToNextInstruction() const;
qreal distanceToNextInstruction() const;
QGeoCoordinate waypoint() const;
+ QQmlPropertyMap *extendedAttributes() const;
+
+Q_SIGNALS:
+ void extendedAttributesChanged(); //in practice is never emitted since parameters cannot be re-assigned
+ //the declaration is needed to avoid warnings about non-notifyable properties
private:
QGeoManeuver maneuver_;
+ QQmlPropertyMap *m_extendedAttributes = nullptr;
};
QT_END_NAMESPACE
diff --git a/src/location/declarativemaps/qdeclarativegeomap.cpp b/src/location/declarativemaps/qdeclarativegeomap.cpp
index 9b19a0ac..34885f54 100644
--- a/src/location/declarativemaps/qdeclarativegeomap.cpp
+++ b/src/location/declarativemaps/qdeclarativegeomap.cpp
@@ -46,6 +46,7 @@
#include <QtPositioning/QGeoCircle>
#include <QtPositioning/QGeoRectangle>
#include <QtPositioning/QGeoPath>
+#include <QtPositioning/QGeoPolygon>
#include <QtQuick/QQuickWindow>
#include <QtQuick/QSGRectangleNode>
#include <QtQuick/private/qquickwindow_p.h>
@@ -1341,22 +1342,22 @@ QGeoShape QDeclarativeGeoMap::visibleRegion() const
return m_visibleRegion;
const QList<QDoubleVector2D> &visibleRegion = m_map->geoProjection().visibleRegion();
- QGeoPath path;
+ QGeoPolygon poly;
for (int i = 0; i < visibleRegion.size(); ++i) {
const QDoubleVector2D &c = visibleRegion.at(i);
// If a segment spans more than half of the map longitudinally, split in 2.
if (i && qAbs(visibleRegion.at(i-1).x() - c.x()) >= 0.5) { // This assumes a segment is never >= 1.0 (whole map span)
QDoubleVector2D extraPoint = (visibleRegion.at(i-1) + c) * 0.5;
- path.addCoordinate(m_map->geoProjection().wrappedMapProjectionToGeo(extraPoint));
+ poly.addCoordinate(m_map->geoProjection().wrappedMapProjectionToGeo(extraPoint));
}
- path.addCoordinate(m_map->geoProjection().wrappedMapProjectionToGeo(c));
+ poly.addCoordinate(m_map->geoProjection().wrappedMapProjectionToGeo(c));
}
if (visibleRegion.size() >= 2 && qAbs(visibleRegion.last().x() - visibleRegion.first().x()) >= 0.5) {
QDoubleVector2D extraPoint = (visibleRegion.last() + visibleRegion.first()) * 0.5;
- path.addCoordinate(m_map->geoProjection().wrappedMapProjectionToGeo(extraPoint));
+ poly.addCoordinate(m_map->geoProjection().wrappedMapProjectionToGeo(extraPoint));
}
- return path.boundingGeoRectangle();
+ return poly;
}
/*!
@@ -1480,6 +1481,8 @@ QQmlListProperty<QDeclarativeGeoMapType> QDeclarativeGeoMap::supportedMapTypes()
If the Plugin used for the Map does not support bearing, or if the map is tilted and \a coordinate happens
to be behind the camera, or if the map is not ready (see \l mapReady), calling this method will have no effect.
+ The release of this API with Qt 5.10 is a Technology Preview.
+
\since 5.10
*/
void QDeclarativeGeoMap::setBearing(qreal bearing, const QGeoCoordinate &coordinate)
@@ -1511,6 +1514,8 @@ void QDeclarativeGeoMap::setBearing(qreal bearing, const QGeoCoordinate &coordin
If the map is tilted, and \a coordinate happens to be behind the camera, or if the map is not ready
(see \l mapReady), calling this method will have no effect.
+ The release of this API with Qt 5.10 is a Technology Preview.
+
\sa center
\since 5.10
@@ -2266,7 +2271,7 @@ bool QDeclarativeGeoMap::sendTouchEvent(QTouchEvent *event)
auto touchPointGrabberItem = [touchDevice, windowPriv](const QTouchEvent::TouchPoint &point) -> QQuickItem* {
if (QQuickEventPoint *eventPointer = windowPriv->pointerEventInstance(touchDevice)->pointById(point.id()))
- return eventPointer->grabber();
+ return eventPointer->grabberItem();
return nullptr;
};
diff --git a/src/location/declarativemaps/qdeclarativegeomapitemview.cpp b/src/location/declarativemaps/qdeclarativegeomapitemview.cpp
index d8c19528..24ed6700 100644
--- a/src/location/declarativemaps/qdeclarativegeomapitemview.cpp
+++ b/src/location/declarativemaps/qdeclarativegeomapitemview.cpp
@@ -378,7 +378,7 @@ void QDeclarativeGeoMapItemView::setAutoFitViewport(const bool &fitViewport)
*/
void QDeclarativeGeoMapItemView::fitViewport()
{
- if (!map_ || !fitViewport_ || m_repopulating)
+ if (!map_ || !map_->mapReady() || !fitViewport_ || m_repopulating)
return;
if (map_->mapItems().size() > 0)
diff --git a/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp b/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp
index 0383c0c4..8066d917 100644
--- a/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp
+++ b/src/location/declarativemaps/qdeclarativegeoroutemodel.cpp
@@ -45,9 +45,63 @@
#include <QtQml/private/qqmlengine_p.h>
#include <QtLocation/QGeoRoutingManager>
#include <QtPositioning/QGeoRectangle>
+#include "qdeclarativegeomapparameter_p.h"
QT_BEGIN_NAMESPACE
+static bool compareFloats(qreal a, qreal b)
+{
+ return (qIsNaN(a) && qIsNaN(b))
+ || a == b;
+}
+
+static bool compareParameterList(const QList<QDeclarativeGeoMapParameter *> &a, const QList<QDeclarativeGeoMapParameter *> &b)
+{
+ if (a.size() != b.size())
+ return false;
+ if (a != b) {
+ for (int i = 0; i < a.size(); ++i) {
+ if (! (*a.at(i) == *b.at(i)))
+ return false;
+ }
+ }
+ return true;
+}
+
+static int findWaypoint(const QList<QDeclarativeGeoWaypoint *> &waypoints, const QDeclarativeGeoWaypoint *w)
+{
+ for (int i = waypoints.size() - 1; i >= 0; --i) {
+ if (waypoints.at(i) == w || *waypoints.at(i) == *w)
+ return i;
+ }
+ return -1;
+}
+
+static int findWaypoint(const QList<QDeclarativeGeoWaypoint *> &waypoints, const QGeoCoordinate &c)
+{
+ for (int i = waypoints.size() - 1; i >= 0; --i) {
+ if (waypoints.at(i)->coordinate() == c)
+ return i;
+ }
+ return -1;
+}
+
+static QList<QGeoCoordinate> waypointCoordinates(const QList<QDeclarativeGeoWaypoint *> &waypoints)
+{
+ QList<QGeoCoordinate> res;
+ for (const QDeclarativeGeoWaypoint *w: waypoints)
+ res << w->coordinate();
+ return res;
+}
+
+static QList<QVariantMap> waypointMetadata(const QList<QDeclarativeGeoWaypoint *> &waypoints)
+{
+ QList<QVariantMap> res;
+ for (QDeclarativeGeoWaypoint *w: waypoints)
+ res << w->metadata();
+ return res;
+}
+
/*!
\qmltype RouteModel
\instantiates QDeclarativeGeoRouteModel
@@ -653,7 +707,7 @@ void QDeclarativeGeoRouteModel::routingError(QGeoRouteReply *reply,
\brief The RouteQuery type is used to provide query parameters to a
RouteModel.
- A RouteQuery contains all the parameters necessary to make a request
+ A RouteQuery is used to pack all the parameters necessary to make a request
to a routing service, which can then populate the contents of a RouteModel.
These parameters describe key details of the route, such as \l waypoints to
@@ -665,6 +719,10 @@ void QDeclarativeGeoRouteModel::routingError(QGeoRouteReply *reply,
RouteModel's \l{RouteModel::query}{query} property, which can then begin
the retrieval process to populate the model.
+ Some plugins might allow or require specific parameters to operate.
+ In order to specify these plugin-specific parameters, MapParameter elements
+ can be nested inside a RouteQuery.
+
\section2 Example Usage
The following snipped shows an incomplete example of creating a RouteQuery
@@ -768,60 +826,93 @@ void QDeclarativeGeoRouteQuery::setNumberAlternativeRoutes(int numberAlternative
\qmlproperty list<coordinate> RouteQuery::waypoints
- The waypoint coordinates of the desired route.
+ The coordinates of the waypoints for the desired route.
The waypoints should be given in order from origin to destination.
Two or more coordinates are needed.
Waypoints can be set as part of the RouteQuery type declaration or
dynamically with the functions provided.
- \sa addWaypoint, removeWaypoint, clearWaypoints
+ When setting this property to a list of waypoints, each waypoint
+ can be either a \l coordinate or a \l Waypoint, interchangeably.
+ If a \l coordinate is passed, it will be internally converted to a
+ \l Waypoint.
+
+ This property, however, always contains a list of coordinates.
+
+ \sa waypointObjects, addWaypoint, removeWaypoint, clearWaypoints
*/
-QJSValue QDeclarativeGeoRouteQuery::waypoints()
+QVariantList QDeclarativeGeoRouteQuery::waypoints()
{
- QQmlContext *context = QQmlEngine::contextForObject(parent());
- QQmlEngine *engine = context->engine();
- QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(engine);
+ QVariantList res;
- QV4::Scope scope(v4);
- QV4::Scoped<QV4::ArrayObject> waypointArray(scope, v4->newArrayObject(request_.waypoints().length()));
- for (int i = 0; i < request_.waypoints().length(); ++i) {
- const QGeoCoordinate &c = request_.waypoints().at(i);
+ for (const auto &w : m_waypoints)
+ res << QVariant::fromValue(w->coordinate());
- QV4::ScopedValue cv(scope, v4->fromVariant(QVariant::fromValue(c)));
- waypointArray->putIndexed(i, cv);
- }
+ return res;
+}
+
+/*!
+ \qmlmethod list<Waypoint> QtLocation::RouteQuery::waypointObjects()
+
+ This method can be used to retrieve the list of Waypoint objects
+ relative to RouteQuery::waypoints.
- return QJSValue(v4, waypointArray.asReturnedValue());
+ \sa waypointObjects, addWaypoint, removeWaypoint, clearWaypoints
+*/
+QVariantList QDeclarativeGeoRouteQuery::waypointObjects()
+{
+ QVariantList res;
+
+ for (const auto &w : m_waypoints)
+ res << QVariant::fromValue(w);
+
+ return res;
}
-void QDeclarativeGeoRouteQuery::setWaypoints(const QJSValue &value)
+void QDeclarativeGeoRouteQuery::setWaypoints(const QVariantList &value)
{
- if (!value.isArray())
- return;
+ QList<QDeclarativeGeoWaypoint *> waypointList;
+ bool allWaypoints = true;
+
+ for (const auto &w: value) {
+ // First, test if this is already a QDeclarativeGeoWaypoint
+ // From QVariant to QObject *
+ QDeclarativeGeoWaypoint *waypoint = nullptr;
+ QObject *obj = qvariant_cast<QObject *>(w);
+ waypoint = qobject_cast<QDeclarativeGeoWaypoint *>(obj);
+
+ if (waypoint) {
+ waypointList << waypoint;
+ continue;
+ }
- QList<QGeoCoordinate> waypointList;
- quint32 length = value.property(QStringLiteral("length")).toUInt();
- for (quint32 i = 0; i < length; ++i) {
- bool ok;
- QGeoCoordinate c = parseCoordinate(value.property(i), &ok);
+ // if here, w is not a Waypoint, so either a QGeoCoordinate or a variant map, so a waypoint has to be instantiated.
+ allWaypoints = false;
- if (!ok || !c.isValid()) {
- qmlWarning(this) << "Unsupported waypoint type";
+ QGeoCoordinate c = parseCoordinate(w);
+ if (!c.isValid()) {
+ qmlWarning(this) << QStringLiteral("Invalid waypoint");
+ flushWaypoints(waypointList);
return;
}
- waypointList.append(c);
+ waypoint = new QDeclarativeGeoWaypoint(this);
+ waypoint->setCoordinate(c);
+ waypointList << waypoint;
+
}
- if (request_.waypoints() == waypointList)
+ if (allWaypoints && m_waypoints == waypointList)
return;
- request_.setWaypoints(waypointList);
+ flushWaypoints(m_waypoints);
+ m_waypoints = waypointList;
+ for (const QDeclarativeGeoWaypoint *w: qAsConst(m_waypoints))
+ connect(w, &QDeclarativeGeoWaypoint::waypointDetailsChanged, this, &QDeclarativeGeoRouteQuery::waypointChanged);
- emit waypointsChanged();
- emit queryDetailsChanged();
+ waypointChanged();
}
/*!
@@ -864,7 +955,7 @@ void QDeclarativeGeoRouteQuery::setExcludedAreas(const QJSValue &value)
QGeoRectangle r = parseRectangle(value.property(i), &ok);
if (!ok || !r.isValid()) {
- qmlWarning(this) << "Unsupported area type";
+ qmlWarning(this) << QStringLiteral("Unsupported area type");
return;
}
@@ -876,8 +967,10 @@ void QDeclarativeGeoRouteQuery::setExcludedAreas(const QJSValue &value)
request_.setExcludeAreas(excludedAreasList);
- emit excludedAreasChanged();
- emit queryDetailsChanged();
+ if (complete_) {
+ emit excludedAreasChanged();
+ emit queryDetailsChanged();
+ }
}
/*!
@@ -933,8 +1026,10 @@ void QDeclarativeGeoRouteQuery::removeExcludedArea(const QGeoRectangle &area)
excludedAreas.removeAt(index);
request_.setExcludeAreas(excludedAreas);
- emit excludedAreasChanged();
- emit queryDetailsChanged();
+ if (complete_) {
+ emit excludedAreasChanged();
+ emit queryDetailsChanged();
+ }
}
/*!
@@ -952,8 +1047,10 @@ void QDeclarativeGeoRouteQuery::clearExcludedAreas()
request_.setExcludeAreas(QList<QGeoRectangle>());
- emit excludedAreasChanged();
- emit queryDetailsChanged();
+ if (complete_) {
+ emit excludedAreasChanged();
+ emit queryDetailsChanged();
+ }
}
/*!
@@ -961,24 +1058,43 @@ void QDeclarativeGeoRouteQuery::clearExcludedAreas()
Appends a coordinate to the list of waypoints. Same coordinate
can be set multiple times.
+ The \a coordinate argument can be a \l coordinate or a \l Waypoint.
+ If a \l coordinate is used, it will be internally converted to a
+ \l Waypoint.
\sa removeWaypoint, clearWaypoints
*/
-void QDeclarativeGeoRouteQuery::addWaypoint(const QGeoCoordinate &waypoint)
+void QDeclarativeGeoRouteQuery::addWaypoint(const QVariant &waypoint)
{
- if (!waypoint.isValid()) {
- qmlWarning(this) << QStringLiteral("Not adding invalid waypoint.");
+ QDeclarativeGeoWaypoint *w = nullptr;
+ QObject *obj = qvariant_cast<QObject *>(waypoint);
+ w = qobject_cast<QDeclarativeGeoWaypoint *>(obj);
+
+ if (w) {
+ if (! w->isValid()) {
+ qmlWarning(this) << QStringLiteral("Invalid waypoint");
+ return;
+ }
+
+ m_waypoints << w;
+ connect(w, &QDeclarativeGeoWaypoint::waypointDetailsChanged, this, &QDeclarativeGeoRouteQuery::waypointChanged);
+ waypointChanged();
return;
}
- QList<QGeoCoordinate> waypoints = request_.waypoints();
- waypoints.append(waypoint);
- request_.setWaypoints(waypoints);
+ // if here, waypoint is not a Waypoint, so either a QGeoCoordinate or a variant map, so a waypoint has to be instantiated.
- if (complete_) {
- emit waypointsChanged();
- emit queryDetailsChanged();
+ QGeoCoordinate c = parseCoordinate(waypoint);
+ if (!c.isValid()) {
+ qmlWarning(this) << QStringLiteral("Invalid coordinate as waypoint");
+ return;
}
+
+ w = new QDeclarativeGeoWaypoint(this);
+ w->setCoordinate(c);
+ m_waypoints << w;
+ connect(w, &QDeclarativeGeoWaypoint::waypointDetailsChanged, this, &QDeclarativeGeoRouteQuery::waypointChanged);
+ waypointChanged();
}
/*!
@@ -990,22 +1106,49 @@ void QDeclarativeGeoRouteQuery::addWaypoint(const QGeoCoordinate &waypoint)
\sa addWaypoint, clearWaypoints
*/
-void QDeclarativeGeoRouteQuery::removeWaypoint(const QGeoCoordinate &waypoint)
+void QDeclarativeGeoRouteQuery::removeWaypoint(const QVariant &waypoint)
{
- QList<QGeoCoordinate> waypoints = request_.waypoints();
+ QDeclarativeGeoWaypoint *w = nullptr;
+ QObject *obj = qvariant_cast<QObject *>(waypoint);
+ w = qobject_cast<QDeclarativeGeoWaypoint *>(obj);
- int index = waypoints.lastIndexOf(waypoint);
- if (index == -1) {
- qmlWarning(this) << QStringLiteral("Cannot remove nonexistent waypoint.");
+ if (w) {
+ if (!w->isValid()) {
+ qmlWarning(this) << QStringLiteral("Invalid waypoint");
+ return;
+ }
+
+ int idx = findWaypoint(m_waypoints, w);
+ if (idx >= 0) {
+ QDeclarativeGeoWaypoint *toRemove = m_waypoints.takeAt(idx);
+ toRemove->disconnect(this);
+ if (toRemove->parent() == this)
+ delete toRemove;
+
+ waypointChanged();
+ } else {
+ qmlWarning(this) << QStringLiteral("Cannot remove nonexistent waypoint.");
+ }
return;
}
- waypoints.removeAt(index);
+ QGeoCoordinate c = parseCoordinate(waypoint);
+ if (!c.isValid()) {
+ qmlWarning(this) << QStringLiteral("Invalid coordinate as waypoint");
+ return;
+ }
- request_.setWaypoints(waypoints);
+ int idx = findWaypoint(m_waypoints, c);
+ if (idx >= 0) {
+ QDeclarativeGeoWaypoint *toRemove = m_waypoints.takeAt(idx);
+ toRemove->disconnect(this);
+ if (toRemove->parent() == this)
+ delete toRemove;
- emit waypointsChanged();
- emit queryDetailsChanged();
+ waypointChanged();
+ } else {
+ qmlWarning(this) << QStringLiteral("Cannot remove nonexistent waypoint.");
+ }
}
/*!
@@ -1017,13 +1160,21 @@ void QDeclarativeGeoRouteQuery::removeWaypoint(const QGeoCoordinate &waypoint)
*/
void QDeclarativeGeoRouteQuery::clearWaypoints()
{
- if (request_.waypoints().isEmpty())
+ if (m_waypoints.isEmpty())
return;
- request_.setWaypoints(QList<QGeoCoordinate>());
+ flushWaypoints(m_waypoints);
+ waypointChanged();
+}
- emit waypointsChanged();
- emit queryDetailsChanged();
+void QDeclarativeGeoRouteQuery::flushWaypoints(QList<QDeclarativeGeoWaypoint *> &waypoints)
+{
+ for (const QDeclarativeGeoWaypoint *w : qAsConst(waypoints)) {
+ w->disconnect(this);
+ if (w->parent() == this) // w has been created internally as a result of adding a QGeoCoordinate
+ delete w;
+ }
+ waypoints.clear();
}
/*!
@@ -1285,8 +1436,23 @@ void QDeclarativeGeoRouteQuery::setRouteOptimizations(QDeclarativeGeoRouteQuery:
/*!
\internal
*/
-QGeoRouteRequest QDeclarativeGeoRouteQuery::routeRequest() const
+QGeoRouteRequest QDeclarativeGeoRouteQuery::routeRequest()
{
+ if (m_extraParametersChanged) {
+ m_extraParametersChanged = false;
+ // Update extra params into request
+ const QList<QDeclarativeGeoMapParameter *> params = quickChildren<QDeclarativeGeoMapParameter>();
+ QMap<QString, QVariantMap> extraParameters;
+ for (const QDeclarativeGeoMapParameter *p: params)
+ extraParameters[p->type()] = p->toVariantMap();
+ request_.setExtraParameters(extraParameters);
+ }
+ if (m_waypointsChanged) {
+ m_waypointsChanged = false;
+ // Update waypoints and metadata into request
+ request_.setWaypoints(waypointCoordinates(m_waypoints));
+ request_.setWaypointsMetadata(waypointMetadata(m_waypoints));
+ }
return request_;
}
@@ -1298,10 +1464,385 @@ void QDeclarativeGeoRouteQuery::excludedAreaCoordinateChanged()
}
}
+void QDeclarativeGeoRouteQuery::extraParameterChanged()
+{
+ m_extraParametersChanged = true;
+ if (complete_) {
+ emit extraParametersChanged();
+ emit queryDetailsChanged();
+ }
+}
+
+void QDeclarativeGeoRouteQuery::waypointChanged()
+{
+ m_waypointsChanged = true;
+ if (complete_) {
+ emit waypointsChanged();
+ emit queryDetailsChanged();
+ }
+}
+
+void QDeclarativeGeoRouteQuery::append(QQmlListProperty<QObject> *p, QObject *v)
+{
+ QDeclarativeGeoRouteQuery *query = static_cast<QDeclarativeGeoRouteQuery*>(p->object);
+ query->m_children.append(v);
+
+ QDeclarativeGeoMapParameter *param = qobject_cast<QDeclarativeGeoMapParameter *>(v);
+ if (param) {
+ query->m_extraParametersChanged = true;
+ query->connect(param, &QGeoMapParameter::propertyUpdated,
+ query, &QDeclarativeGeoRouteQuery::extraParameterChanged);
+ if (query->complete_) {
+ emit query->extraParametersChanged();
+ emit query->queryDetailsChanged();
+ }
+ }
+}
+
+int QDeclarativeGeoRouteQuery::count(QQmlListProperty<QObject> *p)
+{
+ return static_cast<QDeclarativeGeoRouteQuery*>(p->object)->m_children.count();
+}
+
+QObject *QDeclarativeGeoRouteQuery::at(QQmlListProperty<QObject> *p, int idx)
+{
+ return static_cast<QDeclarativeGeoRouteQuery*>(p->object)->m_children.at(idx);
+}
+
+void QDeclarativeGeoRouteQuery::clear(QQmlListProperty<QObject> *p)
+{
+ QDeclarativeGeoRouteQuery *query = static_cast<QDeclarativeGeoRouteQuery*>(p->object);
+ for (auto kid : qAsConst(query->m_children)) {
+ auto val = qobject_cast<QDeclarativeGeoMapParameter *>(kid);
+ if (val) {
+ val->disconnect(val, nullptr, query, nullptr);
+ query->m_extraParametersChanged = true;
+ }
+ }
+ query->m_children.clear();
+ if (query->m_extraParametersChanged && query->complete_) {
+ emit query->extraParametersChanged();
+ emit query->queryDetailsChanged();
+ }
+}
+
+QQmlListProperty<QObject> QDeclarativeGeoRouteQuery::declarativeChildren()
+{
+ return QQmlListProperty<QObject>(this, nullptr,
+ &QDeclarativeGeoRouteQuery::append,
+ &QDeclarativeGeoRouteQuery::count,
+ &QDeclarativeGeoRouteQuery::at,
+ &QDeclarativeGeoRouteQuery::clear);
+}
+
void QDeclarativeGeoRouteQuery::doCoordinateChanged()
{
m_excludedAreaCoordinateChanged = false;
- emit queryDetailsChanged();
+ if (complete_)
+ emit queryDetailsChanged();
+}
+
+/*!
+ \qmltype Waypoint
+ \instantiates QDeclarativeGeoWaypoint
+ \inqmlmodule QtLocation
+ \ingroup qml-QtLocation5-routing
+ \since Qt Location 5.11
+
+ \brief The Waypoint type provides a mean to specify a waypoint in a \l RouteQuery
+ in a more detailed way than by using a simple \l coordinate.
+
+ A Waypoint is a type that allows to specify properties of a waypoint in a \l RouteQuery,
+ such as the waypoint coordinate, or the angle of approach to the waypoint.
+
+ Additional information that are backend-specific can be specified by nesting \l MapParameter
+ elements.
+
+ Changing properties of the waypoint or of its nested MapParameteters will cause the containing
+ \l RouteQuery to emit the queryDetailsChanged signal.
+
+ \section2 Example Usage
+
+ The following snippet is two-part, showing firstly the declaration of
+ objects, and secondly a short piece of procedural code using it. We set
+ the routeModel's \l{autoUpdate} property to false, and call \l{update} once
+ the query is set up, to avoid useless extra requests halfway through the
+ set up of the query.
+
+ \code
+ Plugin {
+ id: aPlugin
+ name: "osm"
+ }
+
+ Waypoint {
+ id: waypointStart
+ coordinate: ...
+ bearing: ...
+ }
+ Waypoint {
+ id: waypointFinish
+ coordinate: ...
+ bearing: ...
+ }
+
+ RouteQuery {
+ id: aQuery
+ Component.onCompleted: {
+ travelModes = RouteQuery.CarTravel
+ addWaypoint(waypointStart)
+ var aWaypoint = Qt.createQmlObject ('import QtLocation 5.11; Waypoint { ... }', ...)
+ addWaypoint(aWaypoint)
+ addWaypoint(waypointFinish)
+ }
+ }
+
+ RouteModel {
+ id: routeModel
+ plugin: aPlugin
+ query: aQuery
+ autoUpdate: true
+ }
+ \endcode
+
+ \sa RouteQuery
+*/
+
+
+/*
+ *
+ At the time of adding this class (2017.11), 3 routing services are natively supported in Qt: Esri, Here and OSRM.
+ Waypoint documentation for each of these:
+ Esri: http://resources.arcgis.com/en/help/arcgis-rest-api/index.html#//02r300000036000000 , called "stop"
+ HERE: https://developer.here.com/documentation/routing/topics/resource-param-type-waypoint.html
+ OSRM: https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md , under Request Options
+ *
+ */
+
+
+static QGeoCoordinate convertWaypointToCoordinate(const QDeclarativeGeoWaypoint *value)
+{
+ return QGeoCoordinate(value);
+}
+
+struct WaypointVariantConversions
+{
+ WaypointVariantConversions()
+ {
+ QMetaType::registerConverter<QDeclarativeGeoWaypoint *, QGeoCoordinate>(convertWaypointToCoordinate);
+ }
+};
+
+Q_GLOBAL_STATIC(WaypointVariantConversions, initWaypointConversions)
+
+
+QDeclarativeGeoWaypoint::QDeclarativeGeoWaypoint(QObject *parent) : QGeoCoordinateObject(parent)
+{
+ initWaypointConversions();
+ connect(this, &QGeoCoordinateObject::coordinateChanged,
+ this, &QDeclarativeGeoWaypoint::waypointDetailsChanged);
+}
+
+QDeclarativeGeoWaypoint::~QDeclarativeGeoWaypoint()
+{
+
+}
+
+bool QDeclarativeGeoWaypoint::operator==(const QDeclarativeGeoWaypoint &other) const
+{
+ const QList<QDeclarativeGeoMapParameter *> params = quickChildren<QDeclarativeGeoMapParameter>();
+ const QList<QDeclarativeGeoMapParameter *> otherParams = other.quickChildren<QDeclarativeGeoMapParameter>();
+
+ return coordinate() == other.coordinate() &&
+ compareFloats(m_bearing, other.bearing()) &&
+ compareParameterList(params, otherParams);
+}
+
+/*!
+ \qmlproperty coordinate Waypoint::coordinate
+
+ The waypoint's coordinate. The default value is undefined.
+*/
+
+
+/*!
+ \qmlproperty real Waypoint::latitude
+
+ The latitude of the waypoint's coordinate. The default value is NaN.
+ Changing this property will affect the \l Waypoint::coordinate property as well.
+*/
+qreal QDeclarativeGeoWaypoint::latitude() const
+{
+ return m_coordinate.latitude();
+}
+
+void QDeclarativeGeoWaypoint::setLatitude(qreal latitude)
+{
+ if (compareFloats(latitude, m_coordinate.latitude()))
+ return;
+
+ m_coordinate.setLatitude(latitude);
+ if (m_complete) {
+ emit coordinateChanged();
+ emit waypointDetailsChanged();
+ }
+}
+
+/*!
+ \qmlproperty real Waypoint::longitude
+
+ The longitude of the waypoint's coordinate. The default value is NaN.
+ Changing this property will affect the \l Waypoint::coordinate property as well.
+*/
+qreal QDeclarativeGeoWaypoint::longitude() const
+{
+ return m_coordinate.longitude();
+}
+
+void QDeclarativeGeoWaypoint::setLongitude(qreal longitude)
+{
+ if (compareFloats(longitude, m_coordinate.longitude()))
+ return;
+
+ m_coordinate.setLongitude(longitude);
+ if (m_complete) {
+ emit coordinateChanged();
+ emit waypointDetailsChanged();
+ }
+}
+
+/*!
+ \qmlproperty real Waypoint::altitude
+
+ The altitude of the waypoint's coordinate. The default value is NaN.
+ Changing this property will affect the \l Waypoint::coordinate property as well.
+*/
+qreal QDeclarativeGeoWaypoint::altitude() const
+{
+ return m_coordinate.altitude();
+}
+
+void QDeclarativeGeoWaypoint::setAltitude(qreal altitude)
+{
+ if (compareFloats(altitude, m_coordinate.altitude()))
+ return;
+
+ m_coordinate.setAltitude(altitude);
+ if (m_complete) {
+ emit coordinateChanged();
+ emit waypointDetailsChanged();
+ }
+}
+
+bool QDeclarativeGeoWaypoint::isValid() const
+{
+ return m_coordinate.isValid();
+}
+
+/*!
+ \qmlproperty real Waypoint::bearing
+
+ The bearing specifying the angle of approach of the waypoint, that is the bearing with which the waypoint is to be approached.
+ This information may be used by the provider to filter the road segment the waypoint will be placed on, and,
+ depending on the provider and the \l {QGeoRouteRequest::TravelMode} {travel mode} used, to restrict the maneuvers
+ allowed at the waypoint, potentially making the provider calculating and returning a different route.
+
+ If set to NaN, this value will not be considered.
+
+ The default value is NaN.
+*/
+qreal QDeclarativeGeoWaypoint::bearing() const
+{
+ return m_bearing;
+}
+
+void QDeclarativeGeoWaypoint::setBearing(qreal bearing)
+{
+ if (compareFloats(bearing, m_bearing))
+ return;
+
+ m_bearing = bearing;
+
+ // Bearing is actually packed into QGeoRouteRequest::waypointMetadata() together with the extra parameters
+ m_metadataChanged = true;
+ if (m_complete) {
+ emit bearingChanged();
+ emit waypointDetailsChanged();
+ }
+}
+
+QVariantMap QDeclarativeGeoWaypoint::metadata()
+{
+ if (m_metadataChanged) {
+ m_metadataChanged = false;
+ m_metadata.clear();
+ // Update metadata
+ const QList<QDeclarativeGeoMapParameter *> params = quickChildren<QDeclarativeGeoMapParameter>();
+ QVariantMap extraParameters;
+ for (const QDeclarativeGeoMapParameter *p: params)
+ extraParameters[p->type()] = p->toVariantMap();
+ m_metadata[QStringLiteral("extra")] = extraParameters;
+ m_metadata[QStringLiteral("bearing")] = m_bearing;
+ }
+ return m_metadata;
+}
+
+void QDeclarativeGeoWaypoint::extraParameterChanged()
+{
+ m_metadataChanged = true;
+ if (m_complete) {
+ emit extraParametersChanged();
+ emit waypointDetailsChanged();
+ }
+}
+
+void QDeclarativeGeoWaypoint::append(QQmlListProperty<QObject> *p, QObject *v)
+{
+ QDeclarativeGeoWaypoint *waypoint = static_cast<QDeclarativeGeoWaypoint*>(p->object);
+ waypoint->m_children.append(v);
+
+ QDeclarativeGeoMapParameter *param = qobject_cast<QDeclarativeGeoMapParameter *>(v);
+ if (param) {
+ waypoint->connect(param, &QGeoMapParameter::propertyUpdated,
+ waypoint, &QDeclarativeGeoWaypoint::extraParameterChanged);
+ waypoint->extraParameterChanged();
+ }
+}
+
+int QDeclarativeGeoWaypoint::count(QQmlListProperty<QObject> *p)
+{
+ return static_cast<QDeclarativeGeoWaypoint*>(p->object)->m_children.count();
+}
+
+QObject *QDeclarativeGeoWaypoint::at(QQmlListProperty<QObject> *p, int idx)
+{
+ return static_cast<QDeclarativeGeoWaypoint*>(p->object)->m_children.at(idx);
+}
+
+void QDeclarativeGeoWaypoint::clear(QQmlListProperty<QObject> *p)
+{
+ QDeclarativeGeoWaypoint *waypoint = static_cast<QDeclarativeGeoWaypoint*>(p->object);
+ for (auto kid : qAsConst(waypoint->m_children)) {
+ auto val = qobject_cast<QDeclarativeGeoMapParameter *>(kid);
+ if (val) {
+ val->disconnect(waypoint);
+ waypoint->m_metadataChanged = true;
+ }
+ }
+ waypoint->m_children.clear();
+ if (waypoint->m_metadataChanged && waypoint->m_complete) {
+ emit waypoint->extraParametersChanged();
+ emit waypoint->waypointDetailsChanged();
+ }
+}
+
+QQmlListProperty<QObject> QDeclarativeGeoWaypoint::declarativeChildren()
+{
+ return QQmlListProperty<QObject>(this, nullptr,
+ &QDeclarativeGeoWaypoint::append,
+ &QDeclarativeGeoWaypoint::count,
+ &QDeclarativeGeoWaypoint::at,
+ &QDeclarativeGeoWaypoint::clear);
}
QT_END_NAMESPACE
diff --git a/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h b/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h
index 18486ac8..5d8d1803 100644
--- a/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h
+++ b/src/location/declarativemaps/qdeclarativegeoroutemodel_p.h
@@ -53,6 +53,7 @@
#include <QtPositioning/QGeoCoordinate>
#include <QtPositioning/QGeoRectangle>
+#include <QtPositioning/private/qgeocoordinateobject_p.h>
#include <qgeorouterequest.h>
#include <qgeoroutereply.h>
@@ -185,6 +186,90 @@ private:
RouteError error_;
};
+
+
+// purpose of this class is to be convertible to a QGeoCoordinate (through QGeoWaypoint), but also
+// to behave like it, so that in QML source compatibility would be preserved. This is, however, not possible to achieve at the present.
+class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoWaypoint : public QGeoCoordinateObject, public QQmlParserStatus
+{
+ Q_OBJECT
+
+ Q_PROPERTY(double latitude READ latitude WRITE setLatitude STORED false)
+ Q_PROPERTY(double longitude READ longitude WRITE setLongitude STORED false)
+ Q_PROPERTY(double altitude READ altitude WRITE setAltitude STORED false)
+ Q_PROPERTY(bool isValid READ isValid STORED false)
+
+ Q_PROPERTY(qreal bearing READ bearing WRITE setBearing NOTIFY bearingChanged)
+ Q_PROPERTY(QQmlListProperty<QObject> quickChildren READ declarativeChildren DESIGNABLE false)
+ Q_CLASSINFO("DefaultProperty", "quickChildren")
+
+public:
+ QDeclarativeGeoWaypoint(QObject *parent = 0);
+ virtual ~QDeclarativeGeoWaypoint();
+
+ bool operator==(const QDeclarativeGeoWaypoint &other) const;
+
+ qreal latitude() const;
+ void setLatitude(qreal latitude);
+
+ qreal longitude() const;
+ void setLongitude(qreal longitude);
+
+ qreal altitude() const;
+ void setAltitude(qreal altitude);
+
+ bool isValid() const;
+
+ qreal bearing() const;
+ void setBearing(qreal bearing);
+
+ template <typename T = QObject>
+ QList<T*> quickChildren() const
+ {
+ QList<T*> res;
+ for (auto kid : qAsConst(m_children)) {
+ auto val = qobject_cast<T*>(kid);
+ if (val)
+ res.push_back(val);
+ }
+ return res;
+ }
+
+ QVariantMap metadata();
+
+Q_SIGNALS:
+ void completed();
+ void waypointDetailsChanged();
+ void bearingChanged();
+ void extraParametersChanged();
+
+private Q_SLOTS:
+ void extraParameterChanged();
+
+protected:
+ // From QQmlParserStatus
+ void classBegin() override {}
+ void componentComplete() override { m_complete = true; emit completed(); }
+
+ // For quickChildren
+ static void append(QQmlListProperty<QObject> *p, QObject *v);
+ static int count(QQmlListProperty<QObject> *p);
+ static QObject *at(QQmlListProperty<QObject> *p, int idx);
+ static void clear(QQmlListProperty<QObject> *p);
+ QQmlListProperty<QObject> declarativeChildren();
+ QList<QObject*> m_children;
+
+ // other data members
+ bool m_metadataChanged = false;
+ bool m_complete = false;
+
+ qreal m_bearing = Q_QNAN;
+ QVariantMap m_metadata;
+};
+
+
+
+
class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoRouteQuery : public QObject, public QQmlParserStatus
{
Q_OBJECT
@@ -204,9 +289,11 @@ class Q_LOCATION_PRIVATE_EXPORT QDeclarativeGeoRouteQuery : public QObject, publ
Q_PROPERTY(RouteOptimizations routeOptimizations READ routeOptimizations WRITE setRouteOptimizations NOTIFY routeOptimizationsChanged)
Q_PROPERTY(SegmentDetail segmentDetail READ segmentDetail WRITE setSegmentDetail NOTIFY segmentDetailChanged)
Q_PROPERTY(ManeuverDetail maneuverDetail READ maneuverDetail WRITE setManeuverDetail NOTIFY maneuverDetailChanged)
- Q_PROPERTY(QJSValue waypoints READ waypoints WRITE setWaypoints NOTIFY waypointsChanged)
+ Q_PROPERTY(QVariantList waypoints READ waypoints WRITE setWaypoints NOTIFY waypointsChanged)
Q_PROPERTY(QJSValue excludedAreas READ excludedAreas WRITE setExcludedAreas NOTIFY excludedAreasChanged)
Q_PROPERTY(QList<int> featureTypes READ featureTypes NOTIFY featureTypesChanged)
+ Q_PROPERTY(QQmlListProperty<QObject> quickChildren READ declarativeChildren DESIGNABLE false)
+ Q_CLASSINFO("DefaultProperty", "quickChildren")
Q_INTERFACES(QQmlParserStatus)
public:
@@ -218,7 +305,7 @@ public:
void classBegin() {}
void componentComplete();
- QGeoRouteRequest routeRequest() const;
+ QGeoRouteRequest routeRequest();
enum TravelMode {
CarTravel = QGeoRouteRequest::CarTravel,
@@ -279,16 +366,18 @@ public:
QList<int> featureTypes();
- QJSValue waypoints();
- void setWaypoints(const QJSValue &value);
+ QVariantList waypoints();
+ Q_INVOKABLE QVariantList waypointObjects();
+ void setWaypoints(const QVariantList &value);
// READ functions for list properties
QJSValue excludedAreas() const;
void setExcludedAreas(const QJSValue &value);
- Q_INVOKABLE void addWaypoint(const QGeoCoordinate &waypoint);
- Q_INVOKABLE void removeWaypoint(const QGeoCoordinate &waypoint);
+ Q_INVOKABLE void addWaypoint(const QVariant &w);
+ Q_INVOKABLE void removeWaypoint(const QVariant &waypoint);
Q_INVOKABLE void clearWaypoints();
+ void flushWaypoints(QList<QDeclarativeGeoWaypoint *> &waypoints);
Q_INVOKABLE void addExcludedArea(const QGeoRectangle &area);
Q_INVOKABLE void removeExcludedArea(const QGeoRectangle &area);
@@ -314,6 +403,18 @@ public:
void setRouteOptimizations(RouteOptimizations optimization);
RouteOptimizations routeOptimizations() const;
+ template <typename T = QObject>
+ QList<T*> quickChildren() const
+ {
+ QList<T*> res;
+ for (auto kid : qAsConst(m_children)) {
+ auto val = qobject_cast<T*>(kid);
+ if (val)
+ res.push_back(val);
+ }
+ return res;
+ }
+
Q_SIGNALS:
void numberAlternativeRoutesChanged();
void travelModesChanged();
@@ -327,9 +428,21 @@ Q_SIGNALS:
void segmentDetailChanged();
void queryDetailsChanged();
+ void extraParametersChanged();
private Q_SLOTS:
void excludedAreaCoordinateChanged();
+ void extraParameterChanged();
+ void waypointChanged();
+
+protected:
+ static void append(QQmlListProperty<QObject> *p, QObject *v);
+ static int count(QQmlListProperty<QObject> *p);
+ static QObject *at(QQmlListProperty<QObject> *p, int idx);
+ static void clear(QQmlListProperty<QObject> *p);
+
+ QQmlListProperty<QObject> declarativeChildren();
+ QList<QObject*> m_children;
private:
Q_INVOKABLE void doCoordinateChanged();
@@ -337,9 +450,13 @@ private:
QGeoRouteRequest request_;
bool complete_;
bool m_excludedAreaCoordinateChanged;
-
+ bool m_extraParametersChanged = false;
+ bool m_waypointsChanged = false;
+ QList<QDeclarativeGeoWaypoint *> m_waypoints;
};
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(QDeclarativeGeoWaypoint*)
+
#endif
diff --git a/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp b/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp
index 48f66423..7460a376 100644
--- a/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp
+++ b/src/location/declarativemaps/qdeclarativepolygonmapitem.cpp
@@ -286,10 +286,10 @@ void QGeoMapPolygonGeometry::updateScreenPoints(const QGeoMap &map)
if (e.isMoveTo() || i == ppi.elementCount() - 1
|| (qAbs(e.x - poly.front()[0]) < 0.1
&& qAbs(e.y - poly.front()[1]) < 0.1)) {
- Point p = { e.x, e.y };
+ Point p = {{ e.x, e.y }};
poly.push_back( p );
} else if (e.isLineTo()) {
- Point p = { e.x, e.y };
+ Point p = {{ e.x, e.y }};
poly.push_back( p );
} else {
qWarning("Unhandled element type in polygon painterpath");
@@ -374,6 +374,7 @@ void QDeclarativePolygonMapItem::setMap(QDeclarativeGeoMap *quickMap, QGeoMap *m
This property holds the ordered list of coordinates which
define the polygon.
+ Having less than 3 different coordinates in the path results in undefined behavior.
\sa addCoordinate, removeCoordinate
*/
diff --git a/src/location/declarativemaps/qquickgeomapgesturearea.cpp b/src/location/declarativemaps/qquickgeomapgesturearea.cpp
index b1878f00..2f095ee0 100644
--- a/src/location/declarativemaps/qquickgeomapgesturearea.cpp
+++ b/src/location/declarativemaps/qquickgeomapgesturearea.cpp
@@ -552,7 +552,7 @@ QQuickGeoMapGestureArea::~QQuickGeoMapGestureArea()
\qmlproperty enumeration QtLocation::MapGestureArea::acceptedGestures
This property holds the gestures that will be active. By default
- the zoom, pan and flick gestures are enabled.
+ all gestures are enabled.
\list
\li MapGestureArea.NoGesture - Don't support any additional gestures (value: 0x0000).
diff --git a/src/location/declarativeplaces/qdeclarativesearchmodelbase.cpp b/src/location/declarativeplaces/qdeclarativesearchmodelbase.cpp
index 4dfdd25d..92e298d3 100644
--- a/src/location/declarativeplaces/qdeclarativesearchmodelbase.cpp
+++ b/src/location/declarativeplaces/qdeclarativesearchmodelbase.cpp
@@ -45,6 +45,7 @@
#include <QtLocation/QPlaceSearchRequest>
#include <QtLocation/QPlaceSearchReply>
#include <QtPositioning/QGeoCircle>
+#include <QtPositioning/QGeoPolygon>
QT_BEGIN_NAMESPACE
@@ -89,6 +90,8 @@ QVariant QDeclarativeSearchModelBase::searchArea() const
return QVariant::fromValue(QGeoRectangle(s));
else if (s.type() == QGeoShape::CircleType)
return QVariant::fromValue(QGeoCircle(s));
+ else if (s.type() == QGeoShape::PolygonType)
+ return QVariant::fromValue(QGeoPolygon(s));
else
return QVariant::fromValue(s);
}
diff --git a/src/location/doc/qtlocation.qdocconf b/src/location/doc/qtlocation.qdocconf
index 58eeaef7..464e8e76 100644
--- a/src/location/doc/qtlocation.qdocconf
+++ b/src/location/doc/qtlocation.qdocconf
@@ -43,6 +43,8 @@ sourcedirs += .. \
examplesinstallpath = location
+manifestmeta.highlighted.names = "QtLocation/Map Viewer (QML)"
+
exampledirs += ../../../examples/location \
snippets/
diff --git a/src/location/doc/snippets/cpp/cppqml.cpp b/src/location/doc/snippets/cpp/cppqml.cpp
index 48a50071..43fcdf94 100644
--- a/src/location/doc/snippets/cpp/cppqml.cpp
+++ b/src/location/doc/snippets/cpp/cppqml.cpp
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtLocation module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/snippets/cpp/main.cpp b/src/location/doc/snippets/cpp/main.cpp
index 1cc1184b..4904db83 100644
--- a/src/location/doc/snippets/cpp/main.cpp
+++ b/src/location/doc/snippets/cpp/main.cpp
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtLocation module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/snippets/declarative/content/Cell.qml b/src/location/doc/snippets/declarative/content/Cell.qml
index 0391e0b6..7d7e07bc 100644
--- a/src/location/doc/snippets/declarative/content/Cell.qml
+++ b/src/location/doc/snippets/declarative/content/Cell.qml
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Mobility Components.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/snippets/declarative/declarative-location.qml b/src/location/doc/snippets/declarative/declarative-location.qml
index 8eb18e2a..2cdb8fe4 100644
--- a/src/location/doc/snippets/declarative/declarative-location.qml
+++ b/src/location/doc/snippets/declarative/declarative-location.qml
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Mobility Components.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/snippets/declarative/maps.qml b/src/location/doc/snippets/declarative/maps.qml
index 3378ee06..e5770c97 100644
--- a/src/location/doc/snippets/declarative/maps.qml
+++ b/src/location/doc/snippets/declarative/maps.qml
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/snippets/declarative/places.qml b/src/location/doc/snippets/declarative/places.qml
index 7dab804c..ce6bda25 100644
--- a/src/location/doc/snippets/declarative/places.qml
+++ b/src/location/doc/snippets/declarative/places.qml
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/snippets/declarative/places_loader.qml b/src/location/doc/snippets/declarative/places_loader.qml
index a52a4b04..8422ad5c 100644
--- a/src/location/doc/snippets/declarative/places_loader.qml
+++ b/src/location/doc/snippets/declarative/places_loader.qml
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/snippets/declarative/plugin.qml b/src/location/doc/snippets/declarative/plugin.qml
index 44282102..8f4dacae 100644
--- a/src/location/doc/snippets/declarative/plugin.qml
+++ b/src/location/doc/snippets/declarative/plugin.qml
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/snippets/declarative/routing.qml b/src/location/doc/snippets/declarative/routing.qml
index 643722bf..ae564704 100644
--- a/src/location/doc/snippets/declarative/routing.qml
+++ b/src/location/doc/snippets/declarative/routing.qml
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/snippets/places/main.cpp b/src/location/doc/snippets/places/main.cpp
index 8820fbc4..ab34a3cd 100644
--- a/src/location/doc/snippets/places/main.cpp
+++ b/src/location/doc/snippets/places/main.cpp
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtLocation module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/snippets/places/requesthandler.h b/src/location/doc/snippets/places/requesthandler.h
index 04b1b055..e5ee0d00 100644
--- a/src/location/doc/snippets/places/requesthandler.h
+++ b/src/location/doc/snippets/places/requesthandler.h
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtLocation module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/location/doc/src/cpp-qml.qdoc b/src/location/doc/src/cpp-qml.qdoc
index f20e1479..b8a49fa5 100644
--- a/src/location/doc/src/cpp-qml.qdoc
+++ b/src/location/doc/src/cpp-qml.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/maps.qdoc b/src/location/doc/src/maps.qdoc
index 759394e2..d929b125 100644
--- a/src/location/doc/src/maps.qdoc
+++ b/src/location/doc/src/maps.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/places.qdoc b/src/location/doc/src/places.qdoc
index 72e31c9c..9c01fba7 100644
--- a/src/location/doc/src/places.qdoc
+++ b/src/location/doc/src/places.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/plugins/itemsoverlay.qdoc b/src/location/doc/src/plugins/itemsoverlay.qdoc
index 7a2d1dec..ddb4de99 100644
--- a/src/location/doc/src/plugins/itemsoverlay.qdoc
+++ b/src/location/doc/src/plugins/itemsoverlay.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/plugins/mapbox.qdoc b/src/location/doc/src/plugins/mapbox.qdoc
index 8f83ae55..3933b107 100644
--- a/src/location/doc/src/plugins/mapbox.qdoc
+++ b/src/location/doc/src/plugins/mapbox.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2014 Canonical Ltd.
-** Contact: http://www.qt.io/licensing/
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
@@ -66,6 +66,10 @@ The following table lists optional parameters that can be passed to the Mapbox p
\li Parameter
\li Description
\row
+ \li mapbox.enterprise
+ \li Boolean representing whether the access token comes from a
+ \l{https://www.mapbox.com/enterprise}{Mapbox Enterprise} account.
+\row
\li mapbox.mapping.map_id, mapbox.map_id (\b deprecated)
\li \l{https://www.mapbox.com/help/define-map-id/}{ID} of the Mapbox map to show. An example ID is "examples.map-zr0njcqy".
If this parameter is present, the specified map type will be used by default, unless another is selected.
@@ -149,5 +153,19 @@ The following table lists optional parameters that can be passed to the Mapbox p
\tt{OneNeighbourLayer} only prefetches the one layer closest to the current zoom level.
Finally, \tt{NoPrefetching} allows to disable the prefetching, so only tiles that are visible will be fetched.
Note that, depending on the active map type, this hint might be ignored.
+\row
+ \li mapbox.routing.use_mapbox_text_instructions
+ \li Whether to use the instruction text that came with the response from the server (true) or the
+ text generated by the plugin. The default value is true.
+ Note that if instructions in a language that is not directly supported by Mapbox are needed (see
+ \l{https://www.mapbox.com/api-documentation/#instructions-languages}{here} for the supported languages),
+ it is possible to use the \l{Qt Linguist} to translate QtLocation to the desired language, and set this parameter to
+ false in order to use the translated built-in instructions.
\endtable
+
+\section1 Extra routing attributes
+
+When using this plugin, the RouteManeuver objects in the returned route may contain additional extended attributes (see \l RouteManeuver::extendedAttributes),
+where available.
+These attributes are described in detail in the official \l{https://www.mapbox.com/api-documentation/#stepmaneuver-object}{Mapbox direction API documentation}.
*/
diff --git a/src/location/doc/src/plugins/mapboxgl.qdoc b/src/location/doc/src/plugins/mapboxgl.qdoc
index 4084e4c6..8ad6a9c2 100644
--- a/src/location/doc/src/plugins/mapboxgl.qdoc
+++ b/src/location/doc/src/plugins/mapboxgl.qdoc
@@ -3,7 +3,7 @@
** Copyright (C) 2017 The Qt Company Ltd.
** Copyright (C) 2017 Mapbox, Inc.
** Copyright (C) 2014 Canonical Ltd.
-** Contact: http://www.qt.io/licensing/
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -13,8 +13,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -22,7 +22,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
@@ -60,7 +60,7 @@ and tiles hosted by Mapbox. To create a Mapbox account visit \l{https://www.mapb
Qt Location Mapbox GL Plugin has the following support for platforms:
\list
- \li Microsoft Windows (win32) - Supported, requires MinGW 5.0+ and ANGLE as OpenGL backend
+ \li Microsoft Windows (win32) - Supported, requires MinGW 5.0+
\li Linux X11 - Supported, requires GCC 4.9+
\li macOS - Supported
\li Android - Supported
@@ -109,6 +109,12 @@ The following table lists optional parameters that can be passed to the Mapbox p
but the offline database must be populated using the \l {https://github.com/mapbox/mapbox-gl-native/blob/master/bin/offline.cpp}
{offline tool}. The offline database will work alongside with the ambient cache in the same file.
Make sure to comply with Mapbox Terms of Service before creating an offline database.
+
+ \b {Note:} The map tile cache file name must be "mapboxgl.db". When using the offline tool, the default
+ output is "offline.db". For using the generated output from the offline tool, you must move that to the
+ proper directory, and rename it as "mapboxgl.db". The offline tool also provides the "--output"
+ parameter for specifying the name of the generated output.
+
\row
\li mapboxgl.mapping.cache.memory
\li Whether or not the cache should be in-memory only. Valid values are \b true and \b false. The default
diff --git a/src/location/doc/src/plugins/nokia.qdoc b/src/location/doc/src/plugins/nokia.qdoc
index 30fd43f1..79bd728f 100644
--- a/src/location/doc/src/plugins/nokia.qdoc
+++ b/src/location/doc/src/plugins/nokia.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/plugins/osm.qdoc b/src/location/doc/src/plugins/osm.qdoc
index c65c4abb..dc0bb256 100644
--- a/src/location/doc/src/plugins/osm.qdoc
+++ b/src/location/doc/src/plugins/osm.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2015 Aaron McCarthy <mccarthy.aaron@gmail.com>
-** Contact: http://www.qt.io/licensing/
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/plugins/places-backend.qdoc b/src/location/doc/src/plugins/places-backend.qdoc
index b6de60e3..9187531e 100644
--- a/src/location/doc/src/plugins/places-backend.qdoc
+++ b/src/location/doc/src/plugins/places-backend.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/qml-maps.qdoc b/src/location/doc/src/qml-maps.qdoc
index 72cf6ee9..87dd2412 100644
--- a/src/location/doc/src/qml-maps.qdoc
+++ b/src/location/doc/src/qml-maps.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/qtlocation-changes.qdoc b/src/location/doc/src/qtlocation-changes.qdoc
index 1330412d..458c9e99 100644
--- a/src/location/doc/src/qtlocation-changes.qdoc
+++ b/src/location/doc/src/qtlocation-changes.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/qtlocation-cpp.qdoc b/src/location/doc/src/qtlocation-cpp.qdoc
index 82ac766e..c2c29b34 100644
--- a/src/location/doc/src/qtlocation-cpp.qdoc
+++ b/src/location/doc/src/qtlocation-cpp.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/qtlocation-examples.qdoc b/src/location/doc/src/qtlocation-examples.qdoc
index 052db15b..02938c0e 100644
--- a/src/location/doc/src/qtlocation-examples.qdoc
+++ b/src/location/doc/src/qtlocation-examples.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/qtlocation-geoservices.qdoc b/src/location/doc/src/qtlocation-geoservices.qdoc
index 008f98a8..cc67e231 100644
--- a/src/location/doc/src/qtlocation-geoservices.qdoc
+++ b/src/location/doc/src/qtlocation-geoservices.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/qtlocation-qml.qdoc b/src/location/doc/src/qtlocation-qml.qdoc
index 37d21dce..c0879d2d 100644
--- a/src/location/doc/src/qtlocation-qml.qdoc
+++ b/src/location/doc/src/qtlocation-qml.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/doc/src/qtlocation.qdoc b/src/location/doc/src/qtlocation.qdoc
index 5a3fb937..96564ecb 100644
--- a/src/location/doc/src/qtlocation.qdoc
+++ b/src/location/doc/src/qtlocation.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/location/maps/qgeofiletilecache.cpp b/src/location/maps/qgeofiletilecache.cpp
index d40ad825..df89c889 100644
--- a/src/location/maps/qgeofiletilecache.cpp
+++ b/src/location/maps/qgeofiletilecache.cpp
@@ -88,6 +88,7 @@ QGeoCachedTileDisk::~QGeoCachedTileDisk()
QGeoFileTileCache::QGeoFileTileCache(const QString &directory, QObject *parent)
: QAbstractGeoTileCache(parent), directory_(directory), minTextureUsage_(0), extraTextureUsage_(0)
,costStrategyDisk_(ByteSize), costStrategyMemory_(ByteSize), costStrategyTexture_(ByteSize)
+ ,isDiskCostSet_(false), isMemoryCostSet_(false), isTextureCostSet_(false)
{
}
@@ -120,21 +121,21 @@ void QGeoFileTileCache::init()
QDir::root().mkpath(directory_);
// default values
- if (!diskCache_.maxCost()) { // If setMaxDiskUsage has not been called yet
+ if (!isDiskCostSet_) { // If setMaxDiskUsage has not been called yet
if (costStrategyDisk_ == ByteSize)
setMaxDiskUsage(50 * 1024 * 1024);
else
setMaxDiskUsage(1000);
}
- if (!memoryCache_.maxCost()) { // If setMaxMemoryUsage has not been called yet
+ if (!isMemoryCostSet_) { // If setMaxMemoryUsage has not been called yet
if (costStrategyMemory_ == ByteSize)
setMaxMemoryUsage(3 * 1024 * 1024);
else
setMaxMemoryUsage(100);
}
- if (!textureCache_.maxCost()) { // If setExtraTextureUsage has not been called yet
+ if (!isTextureCostSet_) { // If setExtraTextureUsage has not been called yet
if (costStrategyTexture_ == ByteSize)
setExtraTextureUsage(6 * 1024 * 1024);
else
@@ -240,6 +241,7 @@ void QGeoFileTileCache::printStats()
void QGeoFileTileCache::setMaxDiskUsage(int diskUsage)
{
diskCache_.setMaxCost(diskUsage);
+ isDiskCostSet_ = true;
}
int QGeoFileTileCache::maxDiskUsage() const
@@ -255,6 +257,7 @@ int QGeoFileTileCache::diskUsage() const
void QGeoFileTileCache::setMaxMemoryUsage(int memoryUsage)
{
memoryCache_.setMaxCost(memoryUsage);
+ isMemoryCostSet_ = true;
}
int QGeoFileTileCache::maxMemoryUsage() const
@@ -271,6 +274,7 @@ void QGeoFileTileCache::setExtraTextureUsage(int textureUsage)
{
extraTextureUsage_ = textureUsage;
textureCache_.setMaxCost(minTextureUsage_ + extraTextureUsage_);
+ isTextureCostSet_ = true;
}
void QGeoFileTileCache::setMinTextureUsage(int textureUsage)
@@ -384,12 +388,7 @@ void QGeoFileTileCache::insert(const QGeoTileSpec &spec,
if (areas & QAbstractGeoTileCache::DiskCache) {
QString filename = tileSpecToFilename(spec, format, directory_);
- QFile file(filename);
- file.open(QIODevice::WriteOnly);
- file.write(bytes);
- file.close();
-
- addToDiskCache(spec, filename);
+ addToDiskCache(spec, filename, bytes);
}
if (areas & QAbstractGeoTileCache::MemoryCache) {
@@ -491,6 +490,27 @@ QSharedPointer<QGeoCachedTileDisk> QGeoFileTileCache::addToDiskCache(const QGeoT
return td;
}
+bool QGeoFileTileCache::addToDiskCache(const QGeoTileSpec &spec, const QString &filename, const QByteArray &bytes)
+{
+ QSharedPointer<QGeoCachedTileDisk> td(new QGeoCachedTileDisk);
+ td->spec = spec;
+ td->filename = filename;
+ td->cache = this;
+
+ int cost = 1;
+ if (costStrategyDisk_ == ByteSize)
+ cost = bytes.size();
+
+ if (diskCache_.insert(spec, td, cost)) {
+ QFile file(filename);
+ file.open(QIODevice::WriteOnly);
+ file.write(bytes);
+ file.close();
+ return true;
+ }
+ return false;
+}
+
void QGeoFileTileCache::addToMemoryCache(const QGeoTileSpec &spec, const QByteArray &bytes, const QString &format)
{
if (isTileBogus(bytes))
diff --git a/src/location/maps/qgeofiletilecache_p.h b/src/location/maps/qgeofiletilecache_p.h
index e319e2a2..1712a9e3 100644
--- a/src/location/maps/qgeofiletilecache_p.h
+++ b/src/location/maps/qgeofiletilecache_p.h
@@ -147,6 +147,7 @@ protected:
QString directory() const;
QSharedPointer<QGeoCachedTileDisk> addToDiskCache(const QGeoTileSpec &spec, const QString &filename);
+ bool addToDiskCache(const QGeoTileSpec &spec, const QString &filename, const QByteArray &bytes);
void addToMemoryCache(const QGeoTileSpec &spec, const QByteArray &bytes, const QString &format);
QSharedPointer<QGeoTileTexture> addToTextureCache(const QGeoTileSpec &spec, const QImage &image);
QSharedPointer<QGeoTileTexture> getFromMemory(const QGeoTileSpec &spec);
@@ -167,6 +168,9 @@ protected:
CostStrategy costStrategyDisk_;
CostStrategy costStrategyMemory_;
CostStrategy costStrategyTexture_;
+ bool isDiskCostSet_;
+ bool isMemoryCostSet_;
+ bool isTextureCostSet_;
};
QT_END_NAMESPACE
diff --git a/src/location/maps/qgeomaneuver.cpp b/src/location/maps/qgeomaneuver.cpp
index 9d6a4bf0..fb019130 100644
--- a/src/location/maps/qgeomaneuver.cpp
+++ b/src/location/maps/qgeomaneuver.cpp
@@ -293,6 +293,26 @@ QGeoCoordinate QGeoManeuver::waypoint() const
QGeoManeuver::QGeoManeuver(const QSharedDataPointer<QGeoManeuverPrivate> &dd)
: d_ptr(dd) {}
+/*!
+ Sets the extended attributes associated with this maneuver.
+
+ \since QtLocation 5.11
+*/
+void QGeoManeuver::setExtendedAttributes(const QVariantMap &extendedAttributes)
+{
+ d_ptr->setValid(true);
+ d_ptr->setExtendedAttributes(extendedAttributes);
+}
+
+/*!
+ Returns the extended attributes associated with this maneuver.
+
+ \since QtLocation 5.11
+*/
+QVariantMap QGeoManeuver::extendedAttributes() const
+{
+ return d_ptr->extendedAttributes();
+}
/*******************************************************************************
*******************************************************************************/
@@ -409,6 +429,16 @@ void QGeoManeuverPrivate::setWaypoint(const QGeoCoordinate &waypoint)
Q_UNUSED(waypoint)
}
+QVariantMap QGeoManeuverPrivate::extendedAttributes() const
+{
+ return QVariantMap();
+}
+
+void QGeoManeuverPrivate::setExtendedAttributes(const QVariantMap &extendedAttributes)
+{
+ Q_UNUSED(extendedAttributes)
+}
+
/*******************************************************************************
@@ -517,4 +547,14 @@ void QGeoManeuverPrivateDefault::setWaypoint(const QGeoCoordinate &waypoint)
m_waypoint = waypoint;
}
+QVariantMap QGeoManeuverPrivateDefault::extendedAttributes() const
+{
+ return m_extendedAttributes;
+}
+
+void QGeoManeuverPrivateDefault::setExtendedAttributes(const QVariantMap &extendedAttributes)
+{
+ m_extendedAttributes = extendedAttributes;
+}
+
QT_END_NAMESPACE
diff --git a/src/location/maps/qgeomaneuver.h b/src/location/maps/qgeomaneuver.h
index 1e4bff24..76c5421e 100644
--- a/src/location/maps/qgeomaneuver.h
+++ b/src/location/maps/qgeomaneuver.h
@@ -39,6 +39,7 @@
#include <QtCore/qshareddata.h>
#include <QtLocation/qlocationglobal.h>
+#include <QVariantMap>
QT_BEGIN_NAMESPACE
@@ -95,9 +96,13 @@ public:
void setWaypoint(const QGeoCoordinate &coordinate);
QGeoCoordinate waypoint() const;
+ void setExtendedAttributes(const QVariantMap &extendedAttributes);
+ QVariantMap extendedAttributes() const;
+
protected:
QGeoManeuver(const QSharedDataPointer<QGeoManeuverPrivate> &dd);
+private:
QSharedDataPointer<QGeoManeuverPrivate> d_ptr;
};
diff --git a/src/location/maps/qgeomaneuver_p.h b/src/location/maps/qgeomaneuver_p.h
index e17bf880..8f2e7eca 100644
--- a/src/location/maps/qgeomaneuver_p.h
+++ b/src/location/maps/qgeomaneuver_p.h
@@ -91,6 +91,9 @@ public:
virtual QGeoCoordinate waypoint() const;
virtual void setWaypoint(const QGeoCoordinate &waypoint);
+ virtual QVariantMap extendedAttributes() const;
+ virtual void setExtendedAttributes(const QVariantMap &extendedAttributes);
+
protected:
virtual bool equals(const QGeoManeuverPrivate &other) const;
};
@@ -127,6 +130,9 @@ public:
virtual QGeoCoordinate waypoint() const override;
virtual void setWaypoint(const QGeoCoordinate &waypoint) override;
+ virtual QVariantMap extendedAttributes() const override;
+ virtual void setExtendedAttributes(const QVariantMap &extendedAttributes) override;
+
bool m_valid;
QString m_id;
QGeoCoordinate m_position;
@@ -135,6 +141,7 @@ public:
int m_timeToNextInstruction;
qreal m_distanceToNextInstruction;
QGeoCoordinate m_waypoint;
+ QVariantMap m_extendedAttributes;
};
QT_END_NAMESPACE
diff --git a/src/location/maps/qgeomapparameter.cpp b/src/location/maps/qgeomapparameter.cpp
index b8f9561f..b1d6f060 100644
--- a/src/location/maps/qgeomapparameter.cpp
+++ b/src/location/maps/qgeomapparameter.cpp
@@ -37,6 +37,8 @@
#include "qgeomapparameter_p.h"
#include <QtCore/QVariant>
+#include <QDebug>
+#include <QMetaProperty>
QT_BEGIN_NAMESPACE
@@ -45,10 +47,25 @@ QGeoMapParameter::QGeoMapParameter(QObject *parent) : QObject(parent)
}
+QGeoMapParameter::QGeoMapParameter(const QList<QPair<QLatin1String, QVariant> > &properties, QObject *parent) : QObject(parent)
+{
+ for (const auto &p: properties) {
+ if (p.first == QLatin1String("type"))
+ setType(p.second.toString());
+ else
+ updateProperty(p.first.data(), p.second);
+ }
+}
+
QGeoMapParameter::~QGeoMapParameter()
{
}
+bool QGeoMapParameter::operator==(const QGeoMapParameter &other) const
+{
+ return (other.toVariantMap() == toVariantMap());
+}
+
QString QGeoMapParameter::type() const
{
return m_type;
@@ -70,5 +87,16 @@ void QGeoMapParameter::updateProperty(const char *propertyName, QVariant value)
emit propertyUpdated(this, propertyName);
}
+QVariantMap QGeoMapParameter::toVariantMap() const
+{
+ QVariantMap res;
+ const QMetaObject *metaObj = metaObject();
+ for (int i = 2; i < metaObj->propertyCount(); ++i) { // 0 is objectName, 1 is type, we want to skip both of them here.
+ const char *propName = metaObj->property(i).name();
+ res[QLatin1String(propName)] = property(propName);
+ }
+ return res;
+}
+
QT_END_NAMESPACE
diff --git a/src/location/maps/qgeomapparameter_p.h b/src/location/maps/qgeomapparameter_p.h
index bc39c14a..413b420e 100644
--- a/src/location/maps/qgeomapparameter_p.h
+++ b/src/location/maps/qgeomapparameter_p.h
@@ -52,6 +52,7 @@
#include <QObject>
#include <QString>
#include <QtLocation/private/qlocationglobal_p.h>
+#include <QVariantMap>
QT_BEGIN_NAMESPACE
@@ -62,13 +63,18 @@ class Q_LOCATION_PRIVATE_EXPORT QGeoMapParameter : public QObject
Q_PROPERTY(QString type READ type WRITE setType)
public:
explicit QGeoMapParameter(QObject *parent = 0);
+ QGeoMapParameter(const QList<QPair<QLatin1String, QVariant>> &properties, QObject *parent = 0);
virtual ~QGeoMapParameter();
- QString type() const;
- void setType(const QString &type);
+ bool operator==(const QGeoMapParameter &other) const;
+
+ virtual QString type() const;
+ virtual void setType(const QString &type);
void updateProperty(const char *propertyName, QVariant value);
+ QVariantMap toVariantMap() const;
+
Q_SIGNALS:
void propertyUpdated(QGeoMapParameter *param, const char *propertyName);
diff --git a/src/location/maps/qgeoprojection.cpp b/src/location/maps/qgeoprojection.cpp
index 218d806b..1df174fb 100644
--- a/src/location/maps/qgeoprojection.cpp
+++ b/src/location/maps/qgeoprojection.cpp
@@ -236,6 +236,9 @@ QDoubleVector2D QGeoProjectionWebMercator::itemPositionToWrappedMapProjection(co
/* Default implementations */
QGeoCoordinate QGeoProjectionWebMercator::itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport) const
{
+ if (qIsNaN(pos.x()) || qIsNaN(pos.y()))
+ return QGeoCoordinate();
+
if (clipToViewport) {
int w = m_viewportWidth;
int h = m_viewportHeight;
@@ -253,7 +256,14 @@ QGeoCoordinate QGeoProjectionWebMercator::itemPositionToCoordinate(const QDouble
QDoubleVector2D QGeoProjectionWebMercator::coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport) const
{
- QDoubleVector2D pos = wrappedMapProjectionToItemPosition(wrapMapProjection(geoToMapProjection(coordinate)));
+ if (!coordinate.isValid())
+ return QDoubleVector2D(qQNaN(), qQNaN());
+
+ QDoubleVector2D wrappedProjection = wrapMapProjection(geoToMapProjection(coordinate));
+ if (!isProjectable(wrappedProjection))
+ return QDoubleVector2D(qQNaN(), qQNaN());
+
+ QDoubleVector2D pos = wrappedMapProjectionToItemPosition(wrappedProjection);
if (clipToViewport) {
int w = m_viewportWidth;
@@ -350,10 +360,10 @@ QDoubleVector2D QGeoProjectionWebMercator::viewportToWrappedMapProjection(const
pos *= QDoubleVector2D(m_halfWidth, m_halfHeight);
QDoubleVector3D p = m_centerNearPlane;
- p -= m_up * pos.y();
- p -= m_side * pos.x();
+ p += m_up * pos.y();
+ p += m_side * pos.x();
- QDoubleVector3D ray = p - m_eye;
+ QDoubleVector3D ray = m_eye - p;
ray.normalize();
return (xyPlane.lineIntersection(m_eye, ray, s) / m_sideLength).toVector2D();
@@ -472,7 +482,7 @@ void QGeoProjectionWebMercator::setupCamera()
m_quickItemTransformation = m_transformation;
m_transformation.scale(m_sideLength, m_sideLength, 1.0);
- m_centerNearPlane = m_eye + m_viewNormalized;
+ m_centerNearPlane = m_eye - m_viewNormalized;
m_centerNearPlaneMercator = m_eyeMercator - m_viewNormalized * m_nearPlaneMercator;
// The method does not support tilting angles >= 90.0 or < 0.
diff --git a/src/location/maps/qgeorouteparserosrmv5.cpp b/src/location/maps/qgeorouteparserosrmv5.cpp
index 75daefda..e47901b7 100644
--- a/src/location/maps/qgeorouteparserosrmv5.cpp
+++ b/src/location/maps/qgeorouteparserosrmv5.cpp
@@ -782,7 +782,7 @@ static QGeoManeuver::InstructionDirection instructionDirection(const QJsonObject
else if (modifier == QLatin1String("slight right"))
return QGeoManeuver::DirectionLightRight;
else if (modifier == QLatin1String("uturn"))
- return QGeoManeuver::DirectionUTurnRight;
+ return QGeoManeuver::DirectionUTurnLeft; // This should rather be country-specific. In UK, f.ex. one should rather UTurn Right
else if (modifier == QLatin1String("left"))
return QGeoManeuver::DirectionLeft;
else if (modifier == QLatin1String("sharp left"))
@@ -793,8 +793,10 @@ static QGeoManeuver::InstructionDirection instructionDirection(const QJsonObject
return QGeoManeuver::NoDirection;
}
-static QGeoRouteSegment parseStep(const QJsonObject &step) {
- // OSRM Instructions documentation: https://github.com/Project-OSRM/osrm-text-instructions/blob/master/instructions.json
+static QGeoRouteSegment parseStep(const QJsonObject &step, bool useServerText) {
+ // OSRM Instructions documentation: https://github.com/Project-OSRM/osrm-text-instructions
+ // This goes on top of OSRM: https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md
+ // Mapbox however, includes this in the reply, under "instruction".
QGeoRouteSegment segment;
if (!step.value(QLatin1String("maneuver")).isObject())
return segment;
@@ -808,6 +810,10 @@ static QGeoRouteSegment parseStep(const QJsonObject &step) {
if (!maneuver.value(QLatin1String("location")).isArray())
return segment;
+ QString instruction_text;
+ if (maneuver.value(QLatin1String("instruction")).isString())
+ instruction_text = maneuver.value(QLatin1String("instruction")).toString();
+
double time = step.value(QLatin1String("duration")).toDouble();
double distance = step.value(QLatin1String("distance")).toDouble();
@@ -825,10 +831,18 @@ static QGeoRouteSegment parseStep(const QJsonObject &step) {
geoManeuver.setDirection(instructionDirection(maneuver));
geoManeuver.setDistanceToNextInstruction(distance);
geoManeuver.setTimeToNextInstruction(time);
- geoManeuver.setInstructionText(instructionText(step, maneuver, geoManeuver.direction()));
+ geoManeuver.setInstructionText((useServerText && !instruction_text.isEmpty()) ? instruction_text : instructionText(step, maneuver, geoManeuver.direction()));
geoManeuver.setPosition(coord);
geoManeuver.setWaypoint(coord);
+ QVariantMap extraAttributes;
+ static const QStringList extras { "bearing_before", "bearing_after", "instruction", "type", "modifier" };
+ for (const QString &e: extras) {
+ if (maneuver.find(e) != maneuver.end())
+ extraAttributes.insert(e, maneuver.value(e).toVariant());
+ }
+ geoManeuver.setExtendedAttributes(extraAttributes);
+
segment.setDistance(distance);
segment.setPath(path);
segment.setTravelTime(time);
@@ -845,6 +859,9 @@ public:
QGeoRouteReply::Error parseReply(QList<QGeoRoute> &routes, QString &errorString, const QByteArray &reply) const Q_DECL_OVERRIDE;
QUrl requestUrl(const QGeoRouteRequest &request, const QString &prefix) const Q_DECL_OVERRIDE;
+
+ bool m_useServerText = false;
+ QString m_accessToken;
};
QGeoRouteParserOsrmV5Private::QGeoRouteParserOsrmV5Private() : QGeoRouteParserPrivate()
@@ -906,7 +923,7 @@ QGeoRouteReply::Error QGeoRouteParserOsrmV5Private::parseReply(QList<QGeoRoute>
error = true;
break;
}
- QGeoRouteSegment segment = parseStep(s.toObject());
+ QGeoRouteSegment segment = parseStep(s.toObject(), m_useServerText);
if (segment.isValid()) {
segments.append(segment);
} else {
@@ -950,10 +967,23 @@ QUrl QGeoRouteParserOsrmV5Private::requestUrl(const QGeoRouteRequest &request, c
{
QString routingUrl = prefix;
int notFirst = 0;
- foreach (const QGeoCoordinate &c, request.waypoints()) {
- if (notFirst)
+ QString bearings;
+ const QList<QVariantMap> metadata = request.waypointsMetadata();
+ const QList<QGeoCoordinate> waypoints = request.waypoints();
+ for (int i = 0; i < waypoints.size(); i++) {
+ const QGeoCoordinate &c = waypoints.at(i);
+ if (notFirst) {
routingUrl.append(QLatin1Char(';'));
+ bearings.append(QLatin1Char(';'));
+ }
routingUrl.append(QString::number(c.longitude())).append(QLatin1Char(',')).append(QString::number(c.latitude()));
+ if (metadata.size() > i) {
+ const QVariantMap &meta = metadata.at(i);
+ if (meta.contains(QStringLiteral("bearing"))) {
+ qreal bearing = meta.value(QStringLiteral("bearing")).toDouble();
+ bearings.append(QString::number(int(bearing))).append(QLatin1Char(',')).append(QStringLiteral("90")); // 90 is the angle of maneuver allowed.
+ }
+ }
++notFirst;
}
@@ -963,16 +993,27 @@ QUrl QGeoRouteParserOsrmV5Private::requestUrl(const QGeoRouteRequest &request, c
query.addQueryItem(QStringLiteral("steps"), QStringLiteral("true"));
query.addQueryItem(QStringLiteral("geometries"), QStringLiteral("polyline"));
query.addQueryItem(QStringLiteral("alternatives"), QStringLiteral("true"));
+ query.addQueryItem(QStringLiteral("bearings"), bearings);
+ if (!m_accessToken.isEmpty())
+ query.addQueryItem(QStringLiteral("access_token"), m_accessToken);
url.setQuery(query);
return url;
}
-QGeoRouteParserOsrmV5::QGeoRouteParserOsrmV5(QObject *parent) : QGeoRouteParser(*new QGeoRouteParserOsrmV5Private(), parent)
+QGeoRouteParserOsrmV5::QGeoRouteParserOsrmV5(QObject *parent, bool useServerText) : QGeoRouteParser(*new QGeoRouteParserOsrmV5Private(), parent)
{
+ Q_D(QGeoRouteParserOsrmV5);
+ d->m_useServerText = useServerText;
}
QGeoRouteParserOsrmV5::~QGeoRouteParserOsrmV5()
{
}
+void QGeoRouteParserOsrmV5::setAccessToken(const QString &token)
+{
+ Q_D(QGeoRouteParserOsrmV5);
+ d->m_accessToken = token;
+}
+
QT_END_NAMESPACE
diff --git a/src/location/maps/qgeorouteparserosrmv5_p.h b/src/location/maps/qgeorouteparserosrmv5_p.h
index d2c59165..c6ad0367 100644
--- a/src/location/maps/qgeorouteparserosrmv5_p.h
+++ b/src/location/maps/qgeorouteparserosrmv5_p.h
@@ -60,9 +60,11 @@ class Q_LOCATION_PRIVATE_EXPORT QGeoRouteParserOsrmV5 : public QGeoRouteParser
Q_DECLARE_PRIVATE(QGeoRouteParserOsrmV5)
public:
- QGeoRouteParserOsrmV5(QObject *parent = Q_NULLPTR);
+ QGeoRouteParserOsrmV5(QObject *parent = Q_NULLPTR, bool useServerText = false);
virtual ~QGeoRouteParserOsrmV5();
+ void setAccessToken(const QString &token);
+
private:
Q_DISABLE_COPY(QGeoRouteParserOsrmV5)
};
diff --git a/src/location/maps/qgeorouterequest.cpp b/src/location/maps/qgeorouterequest.cpp
index a1b32d85..ab0a3109 100644
--- a/src/location/maps/qgeorouterequest.cpp
+++ b/src/location/maps/qgeorouterequest.cpp
@@ -296,6 +296,27 @@ QList<QGeoCoordinate> QGeoRouteRequest::waypoints() const
}
/*!
+ Sets \a waypoint metadata as the metadata for the waypoints set in this request.
+ The metadata are intended as one QVariantMap per waypoint, given in the same order as
+ the waypoints.
+
+ The content of the QVariantMap is somehow backend-specific, but properties that can be specified using
+ \l Waypoint elements in QML can be assumed to be named and to work the same way across plugins, where supported.
+*/
+void QGeoRouteRequest::setWaypointsMetadata(const QList<QVariantMap> &waypointMetadata)
+{
+ d_ptr->waypointMetadata = waypointMetadata;
+}
+
+/*!
+ Returns the metadata for the waypoints in this request.
+*/
+QList<QVariantMap> QGeoRouteRequest::waypointsMetadata() const
+{
+ return d_ptr->waypointMetadata;
+}
+
+/*!
Sets \a areas as excluded areas that the route must not cross.
*/
void QGeoRouteRequest::setExcludeAreas(const QList<QGeoRectangle> &areas)
@@ -446,6 +467,27 @@ QGeoRouteRequest::ManeuverDetail QGeoRouteRequest::maneuverDetail() const
return d_ptr->maneuverDetail;
}
+/*!
+ Sets the extra parameters for the route request.
+ The format of the extra parameters is plugin specific, and documented per plugin.
+
+ \since 5.11
+*/
+void QGeoRouteRequest::setExtraParameters(const QMap<QString, QVariantMap> &extraParameters)
+{
+ d_ptr->extraParameters = extraParameters;
+}
+
+/*!
+ Returns the extra parameters set for this route request.
+
+ \since 5.11
+*/
+QMap<QString, QVariantMap> QGeoRouteRequest::extraParameters() const
+{
+ return d_ptr->extraParameters;
+}
+
/*******************************************************************************
*******************************************************************************/
@@ -460,26 +502,30 @@ QGeoRouteRequestPrivate::QGeoRouteRequestPrivate()
QGeoRouteRequestPrivate::QGeoRouteRequestPrivate(const QGeoRouteRequestPrivate &other)
: QSharedData(other),
waypoints(other.waypoints),
+ waypointMetadata(other.waypointMetadata),
excludeAreas(other.excludeAreas),
numberAlternativeRoutes(other.numberAlternativeRoutes),
travelModes(other.travelModes),
featureWeights(other.featureWeights),
routeOptimization(other.routeOptimization),
segmentDetail(other.segmentDetail),
- maneuverDetail(other.maneuverDetail) {}
+ maneuverDetail(other.maneuverDetail),
+ extraParameters(other.extraParameters) {}
QGeoRouteRequestPrivate::~QGeoRouteRequestPrivate() {}
bool QGeoRouteRequestPrivate::operator ==(const QGeoRouteRequestPrivate &other) const
{
return ((waypoints == other.waypoints)
+ && (waypointMetadata == other.waypointMetadata)
&& (excludeAreas == other.excludeAreas)
&& (numberAlternativeRoutes == other.numberAlternativeRoutes)
&& (travelModes == other.travelModes)
&& (featureWeights == other.featureWeights)
&& (routeOptimization == other.routeOptimization)
&& (segmentDetail == other.segmentDetail)
- && (maneuverDetail == other.maneuverDetail));
+ && (maneuverDetail == other.maneuverDetail)
+ && (extraParameters == other.extraParameters));
}
QT_END_NAMESPACE
diff --git a/src/location/maps/qgeorouterequest.h b/src/location/maps/qgeorouterequest.h
index cf89d13d..2c34479b 100644
--- a/src/location/maps/qgeorouterequest.h
+++ b/src/location/maps/qgeorouterequest.h
@@ -119,6 +119,9 @@ public:
void setWaypoints(const QList<QGeoCoordinate> &waypoints);
QList<QGeoCoordinate> waypoints() const;
+ void setWaypointsMetadata(const QList<QVariantMap> &waypointMetadata);
+ QList<QVariantMap> waypointsMetadata() const;
+
void setExcludeAreas(const QList<QGeoRectangle> &areas);
QList<QGeoRectangle> excludeAreas() const;
@@ -146,6 +149,9 @@ public:
void setManeuverDetail(ManeuverDetail maneuverDetail);
ManeuverDetail maneuverDetail() const;
+ void setExtraParameters(const QMap<QString, QVariantMap> &extraParameters);
+ QMap<QString, QVariantMap> extraParameters() const;
+
private:
QExplicitlySharedDataPointer<QGeoRouteRequestPrivate> d_ptr;
};
diff --git a/src/location/maps/qgeorouterequest_p.h b/src/location/maps/qgeorouterequest_p.h
index ea0b1428..7b3a8499 100644
--- a/src/location/maps/qgeorouterequest_p.h
+++ b/src/location/maps/qgeorouterequest_p.h
@@ -54,6 +54,7 @@
#include <QSharedData>
#include <QDateTime>
#include <QMap>
+#include <QVariantMap>
QT_BEGIN_NAMESPACE
@@ -67,6 +68,7 @@ public:
bool operator ==(const QGeoRouteRequestPrivate &other) const;
QList<QGeoCoordinate> waypoints;
+ QList<QVariantMap> waypointMetadata;
QList<QGeoRectangle> excludeAreas;
int numberAlternativeRoutes;
QGeoRouteRequest::TravelModes travelModes;
@@ -75,6 +77,7 @@ public:
QGeoRouteRequest::RouteOptimizations routeOptimization;
QGeoRouteRequest::SegmentDetail segmentDetail;
QGeoRouteRequest::ManeuverDetail maneuverDetail;
+ QMap<QString, QVariantMap> extraParameters;
};
QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/esri/geocodingmanagerengine_esri.cpp b/src/plugins/geoservices/esri/geocodingmanagerengine_esri.cpp
index fcdc5962..976c51cf 100644
--- a/src/plugins/geoservices/esri/geocodingmanagerengine_esri.cpp
+++ b/src/plugins/geoservices/esri/geocodingmanagerengine_esri.cpp
@@ -118,8 +118,8 @@ QGeoCodeReply *GeoCodingManagerEngineEsri::geocode(const QString &address, int l
query.addQueryItem(QStringLiteral("f"), QStringLiteral("json"));
query.addQueryItem(QStringLiteral("outFields"), "*");
- if (bounds.type() == QGeoShape::RectangleType)
- query.addQueryItem(QStringLiteral("searchExtent"), boundingBoxToLtrb(bounds));
+ if (bounds.type() != QGeoShape::UnknownType)
+ query.addQueryItem(QStringLiteral("searchExtent"), boundingBoxToLtrb(bounds.boundingGeoRectangle()));
if (limit != -1)
query.addQueryItem(QStringLiteral("maxLocations"), QString::number(limit));
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/LICENSE.txt b/src/plugins/geoservices/mapbox/maki-4.0.0/LICENSE.txt
new file mode 100644
index 00000000..670154e3
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/LICENSE.txt
@@ -0,0 +1,116 @@
+CC0 1.0 Universal
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator and
+subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for the
+purpose of contributing to a commons of creative, cultural and scientific
+works ("Commons") that the public can reliably and without fear of later
+claims of infringement build upon, modify, incorporate in other works, reuse
+and redistribute as freely as possible in any form whatsoever and for any
+purposes, including without limitation commercial purposes. These owners may
+contribute to the Commons to promote the ideal of a free culture and the
+further production of creative, cultural and scientific works, or to gain
+reputation or greater distribution for their Work in part through the use and
+efforts of others.
+
+For these and/or other purposes and motivations, and without any expectation
+of additional consideration or compensation, the person associating CC0 with a
+Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
+and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
+and publicly distribute the Work under its terms, with knowledge of his or her
+Copyright and Related Rights in the Work and the meaning and intended legal
+effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not limited
+to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display, communicate,
+ and translate a Work;
+
+ ii. moral rights retained by the original author(s) and/or performer(s);
+
+ iii. publicity and privacy rights pertaining to a person's image or likeness
+ depicted in a Work;
+
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+
+ v. rights protecting the extraction, dissemination, use and reuse of data in
+ a Work;
+
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation thereof,
+ including any amended or successor version of such directive); and
+
+ vii. other similar, equivalent or corresponding rights throughout the world
+ based on applicable law or treaty, and any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of,
+applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
+unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
+and Related Rights and associated claims and causes of action, whether now
+known or unknown (including existing as well as future claims and causes of
+action), in the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time
+extensions), (iii) in any current or future medium and for any number of
+copies, and (iv) for any purpose whatsoever, including without limitation
+commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
+the Waiver for the benefit of each member of the public at large and to the
+detriment of Affirmer's heirs and successors, fully intending that such Waiver
+shall not be subject to revocation, rescission, cancellation, termination, or
+any other legal or equitable action to disrupt the quiet enjoyment of the Work
+by the public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be
+judged legally invalid or ineffective under applicable law, then the Waiver
+shall be preserved to the maximum extent permitted taking into account
+Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
+is so judged Affirmer hereby grants to each affected person a royalty-free,
+non transferable, non sublicensable, non exclusive, irrevocable and
+unconditional license to exercise Affirmer's Copyright and Related Rights in
+the Work (i) in all territories worldwide, (ii) for the maximum duration
+provided by applicable law or treaty (including future time extensions), (iii)
+in any current or future medium and for any number of copies, and (iv) for any
+purpose whatsoever, including without limitation commercial, advertising or
+promotional purposes (the "License"). The License shall be deemed effective as
+of the date CC0 was applied by Affirmer to the Work. Should any part of the
+License for any reason be judged legally invalid or ineffective under
+applicable law, such partial invalidity or ineffectiveness shall not
+invalidate the remainder of the License, and in such case Affirmer hereby
+affirms that he or she will not (i) exercise any of his or her remaining
+Copyright and Related Rights in the Work or (ii) assert any associated claims
+and causes of action with respect to the Work, in either case contrary to
+Affirmer's express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+
+ b. Affirmer offers the Work as-is and makes no representations or warranties
+ of any kind concerning the Work, express, implied, statutory or otherwise,
+ including without limitation warranties of title, merchantability, fitness
+ for a particular purpose, non infringement, or the absence of latent or
+ other defects, accuracy, or the present or absence of errors, whether or not
+ discoverable, all to the greatest extent permissible under applicable law.
+
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without limitation
+ any person's Copyright and Related Rights in the Work. Further, Affirmer
+ disclaims responsibility for obtaining any necessary consents, permissions
+ or other rights required for any use of the Work.
+
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to this
+ CC0 or use of the Work.
+
+For more information, please see
+<http://creativecommons.org/publicdomain/zero/1.0/>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/aerialway.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/aerialway.svg
new file mode 100644
index 00000000..3997c5c9
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/aerialway.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M13,5H8V2.6c0.1854-0.1047,0.3325-0.2659,0.42-0.46L13.5,1.5C13.7761,1.5,14,1.2761,14,1s-0.2239-0.5-0.5-0.5L8.28,1.15
+ C8.0954,0.9037,7.8077,0.7562,7.5,0.75C7.0963,0.752,6.7334,0.9966,6.58,1.37L1.5,2C1.2239,2,1,2.2239,1,2.5S1.2239,3,1.5,3
+ l5.22-0.65C6.7967,2.4503,6.8917,2.5351,7,2.6V5H2C1.4477,5,1,5.4477,1,6v7c0,0.5523,0.4477,1,1,1h11c0.5523,0,1-0.4477,1-1V6
+ C14,5.4477,13.5523,5,13,5z M7,11H3V7h4V11z M12,11H8V7h4V11z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/airfield.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/airfield.svg
new file mode 100644
index 00000000..0c96da62
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/airfield.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="airfield-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path5" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccsccccccccccccccsc" d="M6.8182,0.6818H4.7727
+ C4.0909,0.6818,4.0909,0,4.7727,0h5.4545c0.6818,0,0.6818,0.6818,0,0.6818H8.1818c0,0,0.8182,0.5909,0.8182,1.9545V4h6v2L9,8l-0.5,5
+ l2.5,1.3182V15H4v-0.6818L6.5,13L6,8L0,6V4h6V2.6364C6,1.2727,6.8182,0.6818,6.8182,0.6818z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/airport.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/airport.svg
new file mode 100644
index 00000000..75c31b36
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/airport.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="airport-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path7712-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccccsccc" d="M15,6.8182L15,8.5l-6.5-1
+ l-0.3182,4.7727L11,14v1l-3.5-0.6818L4,15v-1l2.8182-1.7273L6.5,7.5L0,8.5V6.8182L6.5,4.5v-3c0,0,0-1.5,1-1.5s1,1.5,1,1.5v2.8182
+ L15,6.8182z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/alcohol-shop.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/alcohol-shop.svg
new file mode 100644
index 00000000..f61dd9ae
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/alcohol-shop.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M14,4h-4v3.44l0,0c0,0,0,0,0,0.06c0.003,0.9096,0.6193,1.7026,1.5,1.93V13H11c-0.2761,0-0.5,0.2239-0.5,0.5
+ S10.7239,14,11,14h2c0.2761,0,0.5-0.2239,0.5-0.5S13.2761,13,13,13h-0.5V9.43c0.8807-0.2274,1.497-1.0204,1.5-1.93c0,0,0,0,0-0.06
+ l0,0V4z M13,7.5c0,0.5523-0.4477,1-1,1s-1-0.4477-1-1V5h2V7.5z M5.5,2.5V2C5.7761,2,6,1.7761,6,1.5S5.7761,1,5.5,1V0.5
+ C5.5,0.2239,5.2761,0,5,0H4C3.7239,0,3.5,0.2239,3.5,0.5V1C3.2239,1,3,1.2239,3,1.5S3.2239,2,3.5,2v0.5C3.5,3.93,1,5.57,1,7v6
+ c0,0.5523,0.4477,1,1,1h5c0.5318-0.0465,0.9535-0.4682,1-1V7C8,5.65,5.5,3.85,5.5,2.5z M4.5,12C3.1193,12,2,10.8807,2,9.5
+ S3.1193,7,4.5,7S7,8.1193,7,9.5S5.8807,12,4.5,12z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/america-football.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/america-football.svg
new file mode 100644
index 00000000..31003eaf
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/america-football.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M7.53,3C3.09,3,1,7.5,1,7.5S3.09,12,7.53,12S14,7.5,14,7.5S12,3,7.53,3z M11,7v1.5C11,8.7761,10.7761,9,10.5,9
+ S10,8.7761,10,8.5V8H8v0.5C8,8.7761,7.7761,9,7.5,9S7,8.7761,7,8.5V8H5v0.5C5,8.7761,4.7761,9,4.5,9S4,8.7761,4,8.5v-2
+ C4,6.2239,4.2239,6,4.5,6S5,6.2239,5,6.5V7h2V6.5C7,6.2239,7.2239,6,7.5,6S8,6.2239,8,6.5V7h2V6.5C10,6.2239,10.2239,6,10.5,6
+ S11,6.2239,11,6.5V7z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/amusement-park.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/amusement-park.svg
new file mode 100644
index 00000000..4841cb4c
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/amusement-park.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="amusement-park-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path5082" d="M7.5,0C3.919,0,1,2.919,1,6.5c0,2.3161,1.2251,4.3484,3.0566,5.5H4l-1,2h9l-1-2h-0.0566
+ C12.7749,10.8484,14,8.8161,14,6.5C14,2.919,11.081,0,7.5,0z M7.375,1.5059v3.5c-0.3108,0.026-0.6057,0.1482-0.8438,0.3496
+ L4.0566,2.8809C4.9243,2.0555,6.0851,1.5376,7.375,1.5059z M7.625,1.5059c1.2899,0.0317,2.4507,0.5496,3.3184,1.375L8.4688,5.3555
+ c-0.0007-0.0007-0.0013-0.0013-0.002-0.002C8.229,5.1532,7.9348,5.0317,7.625,5.0059V1.5059z M3.8809,3.0566l2.4746,2.4746
+ c-0.0007,0.0007-0.0013,0.0013-0.002,0.002C6.1532,5.771,6.0317,6.0652,6.0059,6.375h-3.5
+ C2.5376,5.0851,3.0555,3.9243,3.8809,3.0566z M11.1191,3.0566c0.8254,0.8676,1.3433,2.0285,1.375,3.3184h-3.5
+ c-0.026-0.3108-0.1482-0.6057-0.3496-0.8438L11.1191,3.0566z M2.5059,6.625h3.5c0.026,0.3108,0.1482,0.6057,0.3496,0.8438
+ L3.8809,9.9434C3.0555,9.0757,2.5376,7.9149,2.5059,6.625z M8.9941,6.625h3.5c-0.0317,1.2899-0.5496,2.4507-1.375,3.3184
+ L8.6445,7.4688c0.0007-0.0007,0.0013-0.0013,0.002-0.002C8.8468,7.229,8.9683,6.9348,8.9941,6.625z M6.5312,7.6445
+ c0.0007,0.0007,0.0013,0.0013,0.002,0.002C6.6716,7.7624,6.8297,7.8524,7,7.9121v3.5625c-1.1403-0.1124-2.1606-0.6108-2.9434-1.3555
+ L6.5312,7.6445z M8.4688,7.6445l2.4746,2.4746c-0.7828,0.7447-1.803,1.243-2.9434,1.3555V7.9121
+ C8.1711,7.852,8.33,7.7613,8.4688,7.6445z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/aquarium.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/aquarium.svg
new file mode 100644
index 00000000..1a5c6452
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/aquarium.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg2" inkscape:version="0.91 r13725" sodipodi:docname="aquarium-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path style="fill:#010101;" d="M10.9,11.6c-0.3-0.6-0.3-2.3,0-2.8c0.4-0.6,3.4,1.4,3.4,1.4c0.9,0.4,0.9-6.1,0-5.7
+ c0,0-3.1,2.1-3.4,1.4c-0.3-0.7-0.3-2.1,0-2.8C11.2,2.5,15,2.4,15,2.4C15,1.7,12.1,1,10.9,1S8.4,1.1,6.8,1.8C5.2,2.4,3.9,3.4,2.7,4.6
+ S0,8.2,0,8.9s1.5,2.8,3.7,3.7s3.3,1.1,4.5,1.3c1.1,0.1,2.6,0,3.9-0.3c1-0.2,2.9-0.7,2.9-1.1C15,12.3,11.2,12.2,10.9,11.6z M4.5,9.3
+ C3.7,9.3,3,8.6,3,7.8s0.7-1.5,1.5-1.5S6,7,6,7.8S5.3,9.3,4.5,9.3z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/art-gallery.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/art-gallery.svg
new file mode 100644
index 00000000..aed0ca29
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/art-gallery.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M10.71,4L7.85,1.15C7.6555,0.9539,7.339,0.9526,7.1429,1.1471C7.1419,1.1481,7.141,1.149,7.14,1.15L4.29,4H1.5
+ C1.2239,4,1,4.2239,1,4.5v9C1,13.7761,1.2239,14,1.5,14h12c0.2761,0,0.5-0.2239,0.5-0.5v-9C14,4.2239,13.7761,4,13.5,4H10.71z
+ M7.5,2.21L9.29,4H5.71L7.5,2.21z M13,13H2V5h11V13z M5,8C4.4477,8,4,7.5523,4,7s0.4477-1,1-1s1,0.4477,1,1S5.5523,8,5,8z M12,12
+ H4.5L6,9l1.25,2.5L9.5,7L12,12z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/attraction.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/attraction.svg
new file mode 100644
index 00000000..1345b6ff
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/attraction.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="attraction-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect7143" d="M6,2C5.446,2,5.2478,2.5045,5,3L4.5,4h-2C1.669,4,1,4.669,1,5.5v5C1,11.331,1.669,12,2.5,12h10
+ c0.831,0,1.5-0.669,1.5-1.5v-5C14,4.669,13.331,4,12.5,4h-2L10,3C9.75,2.5,9.554,2,9,2H6z M2.5,5C2.7761,5,3,5.2239,3,5.5
+ S2.7761,6,2.5,6S2,5.7761,2,5.5S2.2239,5,2.5,5z M7.5,5c1.6569,0,3,1.3431,3,3s-1.3431,3-3,3s-3-1.3431-3-3S5.8431,5,7.5,5z
+ M7.5,6.5C6.6716,6.5,6,7.1716,6,8l0,0c0,0.8284,0.6716,1.5,1.5,1.5l0,0C8.3284,9.5,9,8.8284,9,8l0,0C9,7.1716,8.3284,6.5,7.5,6.5
+ L7.5,6.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/bakery.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/bakery.svg
new file mode 100644
index 00000000..28d8081d
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/bakery.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="bakery-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path5230" inkscape:connector-curvature="0" sodipodi:nodetypes="ccssccccsccsccscsccscc" d="M5.2941,4.3824L6,9.5
+ c0,0,0,1,1,1h1c1,0,1-1,1-1l0.7059-5.1176C9.7059,3,7.5,3,7.5,3S5.291,3,5.2941,4.3824z M3.5,5C2,5,2,6,2,6l1,4h1.5
+ c0.755,0,0.7941-0.7647,0.7941-0.7647L4.5,5H3.5z M1.5,7.5c0,0-0.6176-0.0294-1.0588,0.4118C0,8.3529,0,8.7941,0,8.7941V11h0.8824
+ C2,11,2,10,2,10L1.5,7.5z"/>
+<path id="path5230-2" inkscape:connector-curvature="0" sodipodi:nodetypes="sccsccscsccscc" d="M11.5,5C13,5,13,6,13,6l-1,4h-1.5
+ c-0.755,0-0.7941-0.7647-0.7941-0.7647L10.5,5H11.5z M13.5,7.5c0,0,0.6176-0.0294,1.0588,0.4118C15,8.3529,15,8.7941,15,8.7941V11
+ h-0.8824C13,11,13,10,13,10L13.5,7.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/bank.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/bank.svg
new file mode 100644
index 00000000..1efa9edd
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/bank.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="bank-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect5668" d="M1,3C0.446,3,0,3.446,0,4v7c0,0.554,0.446,1,1,1h13c0.554,0,1-0.446,1-1V4c0-0.554-0.446-1-1-1H1z M1,4h1.5
+ C2.7761,4,3,4.2239,3,4.5S2.7761,5,2.5,5S2,4.7761,2,4.5L1.5,5C1.7761,5,2,5.2239,2,5.5S1.7761,6,1.5,6S1,5.7761,1,5.5V4z M7.5,4
+ C8.8807,4,10,5.567,10,7.5l0,0C10,9.433,8.8807,11,7.5,11S5,9.433,5,7.5S6.1193,4,7.5,4z M12.5,4H14v1.5C14,5.7761,13.7761,6,13.5,6
+ S13,5.7761,13,5.5S13.2239,5,13.5,5L13,4.5C13,4.7761,12.7761,5,12.5,5S12,4.7761,12,4.5S12.2239,4,12.5,4z M7.5,5.5
+ c-0.323,0-0.5336,0.1088-0.6816,0.25h1.3633C8.0336,5.6088,7.823,5.5,7.5,5.5z M6.625,6C6.5795,6.091,6.5633,6.1711,6.5449,6.25
+ h1.9102C8.4367,6.1711,8.4205,6.091,8.375,6H6.625z M6.5,6.5v0.25h2V6.5H6.5z M6.5,7v0.25h2V7H6.5z M6.5,7.5v0.25h2V7.5H6.5z M6.5,8
+ L6.25,8.25h2L8.5,8H6.5z M6,8.5c0,0,0.0353,0.1024,0.1016,0.25H8.375L8,8.5H6z M1.5,9C1.7761,9,2,9.2239,2,9.5S1.7761,10,1.5,10
+ L2,10.5C2,10.2239,2.2239,10,2.5,10S3,10.2239,3,10.5S2.7761,11,2.5,11H1V9.5C1,9.2239,1.2239,9,1.5,9z M6.2383,9
+ C6.2842,9.0856,6.3144,9.159,6.375,9.25h2.2676C8.7092,9.1121,8.75,9,8.75,9H6.2383z M13.5,9C13.7761,9,14,9.2239,14,9.5V11h-1.5
+ c-0.2761,0-0.5-0.2239-0.5-0.5s0.2239-0.5,0.5-0.5s0.5,0.2239,0.5,0.5l0.5-0.5C13.2239,10,13,9.7761,13,9.5S13.2239,9,13.5,9z
+ M6.5664,9.5c0.0786,0.0912,0.1647,0.1763,0.2598,0.25h1.4199C8.3462,9.6727,8.4338,9.5883,8.5,9.5H6.5664z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/bar.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/bar.svg
new file mode 100644
index 00000000..6333311a
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/bar.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="bar-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path4" inkscape:connector-curvature="0" sodipodi:nodetypes="sccsccsccszccccz" d="M7.5,1c-2,0-7,0.25-6.5,0.75L7,8v4
+ c0,1-3,0.5-3,2h7c0-1.5-3-1-3-2V8l6-6.25C14.5,1.25,9.5,1,7.5,1z M7.5,2c2.5,0,4.75,0.25,4.75,0.25L11.5,3h-8L2.75,2.25
+ C2.75,2.25,5,2,7.5,2z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/barrier.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/barrier.svg
new file mode 100644
index 00000000..1a0eb4de
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/barrier.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>barrier-15</title>
+ <path d="M13,3H2A1,1,0,0,0,1,4v6a1,1,0,0,0,1,1H3v2.5a.5.5,0,0,0,1,0V13h7v.5a.5.5,0,0,0,1,0V11h1a1,1,0,0,0,1-1V4A1,1,0,0,0,13,3Zm0,1V6L11,4ZM9.5,4,13,7.5V10L7,4Zm-4,6L2,6.5V4l6,6ZM2,10V8l2,2Zm9,2H4V11h7Zm-.207-2H9.5l-6-6h2l6,6Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/baseball.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/baseball.svg
new file mode 100644
index 00000000..572bc0b2
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/baseball.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M10,3.5C10,4.3284,9.3284,5,8.5,5S7,4.3284,7,3.5S7.6716,2,8.5,2S10,2.6716,10,3.5z M7,0.28C7,0.1254,6.8746,0,6.72,0
+ c0,0,0,0,0,0C6.6221,0.0262,6.5348,0.0821,6.47,0.16L4,4.59C3.9941,4.6331,3.9941,4.6769,4,4.72C4,4.8746,4.1254,5,4.28,5
+ c0.1015-0.0243,0.1926-0.0803,0.26-0.16L7,0.41C7.006,0.3669,7.006,0.3231,7,0.28z M12.9,14.2L12.9,14.2L10,6.39l0,0
+ C9.9526,6.1627,9.7522,5.9999,9.52,6h-5c-0.2761,0-0.5,0.2239-0.5,0.5S4.2439,7,4.52,7H7l1.45,2.51l-4.27,4.61l0,0
+ C4.0659,14.2132,3.9998,14.3527,4,14.5C4,14.7761,4.2239,15,4.5,15c0.1224-0.0006,0.2401-0.047,0.33-0.13l0,0l4.45-4.15l2.76,4l0,0
+ c0.0895,0.1592,0.2574,0.2584,0.44,0.26c0.2796,0.0002,0.5092-0.2207,0.52-0.5C12.9958,14.3787,12.961,14.281,12.9,14.2z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/basketball.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/basketball.svg
new file mode 100644
index 00000000..eb98a246
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/basketball.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M9,3.5C9,4.3284,8.3284,5,7.5,5S6,4.3284,6,3.5S6.6716,2,7.5,2S9,2.6716,9,3.5z M14,1c-0.5523,0-1,0.4477-1,1s0.4477,1,1,1
+ s1-0.4477,1-1S14.5523,1,14,1z M11.89,13.19L9,9.58V6.5h0.5c0.1669-0.0018,0.3214-0.0885,0.41-0.23l0,0l1.94-2.42l0,0l0.06-0.08l0,0
+ C11.9661,3.6909,11.9974,3.5969,12,3.5c-0.0038-0.2761-0.2308-0.4968-0.5069-0.493C11.3597,3.0088,11.2326,3.0639,11.14,3.16l0,0
+ L9.26,5.5H5.5C5.3632,5.5018,5.233,5.5596,5.14,5.66l0,0l-2,2.54l0,0C3.0599,8.2807,3.0104,8.3868,3,8.5C3,8.7761,3.2239,9,3.5,9
+ c0.1669-0.0018,0.3214-0.0885,0.41-0.23l0,0L5.74,6.5H6v3.08l-2.89,3.61l0,0c-0.0692,0.0849-0.1079,0.1905-0.11,0.3
+ c0,0.2761,0.2239,0.5,0.5,0.5c0.1669-0.0018,0.3214-0.0885,0.41-0.23l0,0l3-3.77h1.15l3,3.77l0,0
+ c0.0886,0.1415,0.2431,0.2282,0.41,0.23c0.2761,0,0.5-0.2239,0.5-0.5c-0.0021-0.1095-0.0408-0.2151-0.11-0.3l0,0H11.89z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/bbq.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/bbq.svg
new file mode 100644
index 00000000..3865e7e5
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/bbq.svg
@@ -0,0 +1,17 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>grill-15</title>
+<path d="M9.32,7.655C10.8782,7.108,11.9471,5.6506,12,4H3c0.053,1.6299,1.0978,3.0728,2.63,3.631L4.923,9.044
+ c-1.3571-0.2355-2.6482,0.6737-2.8837,2.0308s0.6737,2.6482,2.0308,2.8837C4.9927,14.1187,5.9273,13.7485,6.49,13h4.223l0.335,0.717
+ c0.0836,0.1735,0.2594,0.2836,0.452,0.283c0.0733,0.0003,0.1457-0.0158,0.212-0.047c0.2497-0.117,0.3575-0.4141,0.241-0.664
+ L9.32,7.655z M4.5,12.75c-0.6904,0-1.25-0.5596-1.25-1.25s0.5596-1.25,1.25-1.25s1.25,0.5596,1.25,1.25
+ C5.7484,12.1897,5.1897,12.7484,4.5,12.75z M6.95,12c0.2066-1.007-0.2268-2.0374-1.091-2.594L6.6,7.923
+ c0.577,0.1042,1.168,0.1042,1.745,0l1.9,4.07L6.95,12z M4.75,1C4.6119,1,4.5,1.1119,4.5,1.25c0,0.5-0.5,0.5-0.5,0.5c-1,0-1,1-1,1
+ C3,2.8881,3.1119,3,3.25,3S3.5,2.8881,3.5,2.75c0-0.5,0.5-0.5,0.5-0.5c1,0,1-1,1-1C5,1.1119,4.8881,1,4.75,1z M6.75,1
+ C6.6119,1,6.5,1.1119,6.5,1.25c0,0.5-0.5,0.5-0.5,0.5c-1,0-1,1-1,1C5,2.8881,5.1119,3,5.25,3S5.5,2.8881,5.5,2.75
+ c0-0.5,0.5-0.5,0.5-0.5c1,0,1-1,1-1C7,1.1119,6.8881,1,6.75,1z M8.75,1C8.6119,1,8.5,1.1119,8.5,1.25c0,0.5-0.5,0.5-0.5,0.5
+ c-1,0-1,1-1,1C7,2.8881,7.1119,3,7.25,3S7.5,2.8881,7.5,2.75c0-0.5,0.5-0.5,0.5-0.5c1,0,1-1,1-1C9,1.1119,8.8881,1,8.75,1z M10.75,1
+ c-0.1381,0-0.25,0.1119-0.25,0.25c0,0.5-0.5,0.5-0.5,0.5c-1,0-1,1-1,1C9,2.8881,9.1119,3,9.25,3S9.5,2.8881,9.5,2.75
+ c0-0.5,0.5-0.5,0.5-0.5c1,0,1-1,1-1C11,1.1119,10.8881,1,10.75,1z M12.75,1c-0.1381,0-0.25,0.1119-0.25,0.25c0,0.5-0.5,0.5-0.5,0.5
+ c-1,0-1,1-1,1C11,2.8881,11.1119,3,11.25,3s0.25-0.1119,0.25-0.25c0-0.5,0.5-0.5,0.5-0.5c1,0,1-1,1-1C13,1.1119,12.8881,1,12.75,1z"
+ />
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/beer.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/beer.svg
new file mode 100644
index 00000000..04fbce58
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/beer.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M12,5V2c0,0-1-1-4.5-1S3,2,3,2v3c0.0288,1.3915,0.3706,2.7586,1,4c0.6255,1.4348,0.6255,3.0652,0,4.5c0,0,0,1,3.5,1
+ s3.5-1,3.5-1c-0.6255-1.4348-0.6255-3.0652,0-4.5C11.6294,7.7586,11.9712,6.3915,12,5z M7.5,13.5
+ c-0.7966,0.035-1.5937-0.0596-2.36-0.28c0.203-0.7224,0.304-1.4696,0.3-2.22h4.12c-0.004,0.7504,0.097,1.4976,0.3,2.22
+ C9.0937,13.4404,8.2966,13.535,7.5,13.5z M7.5,5C6.3136,5.0299,5.1306,4.8609,4,4.5v-2C5.131,2.1411,6.3137,1.9722,7.5,2
+ C8.6863,1.9722,9.869,2.1411,11,2.5v2C9.8694,4.8609,8.6864,5.0299,7.5,5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/bicycle-share.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/bicycle-share.svg
new file mode 100644
index 00000000..15fbbe27
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/bicycle-share.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="bike-share-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<sodipodi:namedview bordercolor="#666666" borderopacity="1" gridtolerance="10" guidetolerance="10" id="namedview3364" inkscape:current-layer="svg4619" inkscape:cx="0.18747857" inkscape:cy="7.9979934" inkscape:document-units="px" inkscape:object-nodes="true" inkscape:object-paths="true" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:snap-bbox="true" inkscape:snap-intersection-paths="true" inkscape:snap-smooth-nodes="true" inkscape:window-height="755" inkscape:window-maximized="0" inkscape:window-width="1280" inkscape:window-x="0" inkscape:window-y="23" inkscape:zoom="1" objecttolerance="10" pagecolor="#ffffff" showgrid="false">
+ <inkscape:grid color="#ff0000" empspacing="2" id="grid3368" opacity="0.1254902" spacingx="0.5" spacingy="0.5" type="xygrid">
+ </inkscape:grid>
+</sodipodi:namedview>
+<path id="circle4604" inkscape:connector-curvature="0" sodipodi:nodetypes="sssssccccccccccccccccccccssssssssssssssssssss" d="
+ M10,1C9.4477,1,9,1.4477,9,2c0,0.5523,0.4477,1,1,1s1-0.4477,1-1C11,1.4477,10.5523,1,10,1z M8.1445,2.9941
+ c-0.13,0.0005-0.2547,0.0517-0.3477,0.1426l-2.6406,2.5c-0.2256,0.2128-0.2051,0.5775,0.043,0.7637L7,7.75v2.75
+ c-0.01,0.6762,1.0096,0.6762,1,0v-3c0.0003-0.1574-0.0735-0.3057-0.1992-0.4004L7.0332,6.5234l1.818-1.7212l0.7484,0.9985
+ C9.6943,5.9265,9.8426,6.0003,10,6h1.5c0.6761,0.01,0.6761-1.0096,0-1h-1.25L9.5,4L8.9004,3.1992
+ C8.8103,3.0756,8.6685,3,8.5156,2.9941H8.1445z M3,7c-1.6569,0-3,1.3432-3,3s1.3431,3,3,3s3-1.3432,3-3S4.6569,7,3,7z M12,7
+ c-1.6569,0-3,1.3432-3,3s1.3431,3,3,3s3-1.3432,3-3S13.6569,7,12,7z M3,8c1.1046,0,2,0.8954,2,2s-0.8954,2-2,2s-2-0.8954-2-2
+ S1.8954,8,3,8z M12,8c1.1046,0,2,0.8954,2,2s-0.8954,2-2,2s-2-0.8954-2-2S10.8954,8,12,8z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/bicycle.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/bicycle.svg
new file mode 100644
index 00000000..4e7cf646
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/bicycle.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="bicycle-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<sodipodi:namedview bordercolor="#666666" borderopacity="1" gridtolerance="10" guidetolerance="10" id="namedview3364" inkscape:current-layer="svg4619" inkscape:cx="4.6281545" inkscape:cy="10.703675" inkscape:document-units="px" inkscape:object-nodes="true" inkscape:object-paths="true" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:snap-bbox="true" inkscape:snap-intersection-paths="true" inkscape:snap-smooth-nodes="true" inkscape:window-height="755" inkscape:window-maximized="0" inkscape:window-width="1280" inkscape:window-x="0" inkscape:window-y="23" inkscape:zoom="128" objecttolerance="10" pagecolor="#ffffff" showgrid="true">
+ <inkscape:grid color="#ff0000" empspacing="2" id="grid3368" opacity="0.1254902" spacingx="0.5" spacingy="0.5" type="xygrid">
+ </inkscape:grid>
+</sodipodi:namedview>
+<path id="path4668" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccsssscccsssscccccsccccsssscssscccccc" d="
+ M7.5,2c-0.6761-0.01-0.6761,1.0096,0,1H9v1.2656l-2.8027,2.334L5.2226,4H5.5c0.6761,0.01,0.6761-1.0096,0-1h-2
+ c-0.6761-0.01-0.6761,1.0096,0,1h0.6523L5.043,6.375C4.5752,6.1424,4.0559,6,3.5,6C1.5729,6,0,7.5729,0,9.5S1.5729,13,3.5,13
+ S7,11.4271,7,9.5c0-0.6699-0.2003-1.2911-0.5293-1.8242L9.291,5.3262l0.4629,1.1602C8.7114,7.0937,8,8.2112,8,9.5
+ c0,1.9271,1.5729,3.5,3.5,3.5S15,11.4271,15,9.5S13.4271,6,11.5,6c-0.2831,0-0.5544,0.0434-0.8184,0.1074L10,4.4023V2.5
+ c0-0.2761-0.2239-0.5-0.5-0.5H7.5z M3.5,7c0.5923,0,1.1276,0.2119,1.5547,0.5527l-1.875,1.5625
+ c-0.5109,0.4273,0.1278,1.1945,0.6406,0.7695l1.875-1.5625C5.8835,8.674,6,9.0711,6,9.5C6,10.8866,4.8866,12,3.5,12S1,10.8866,1,9.5
+ S2.1133,7,3.5,7L3.5,7z M11.5,7C12.8866,7,14,8.1134,14,9.5S12.8866,12,11.5,12S9,10.8866,9,9.5c0-0.877,0.4468-1.6421,1.125-2.0879
+ l0.9102,2.2734c0.246,0.6231,1.1804,0.2501,0.9297-0.3711l-0.9082-2.2695C11.2009,7.0193,11.3481,7,11.5,7L11.5,7z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/blood-bank.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/blood-bank.svg
new file mode 100644
index 00000000..b1a1b11a
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/blood-bank.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<title>blood-bank-15</title>
+<path d="M11.2,7.1L11.2,7.1L7.5,2L3.8,7.1h0C3.3,7.8,3,8.7,3,9.6C3,12,5,14,7.5,14c0,0,0,0,0,0C10,14,12,12,12,9.6c0,0,0,0,0,0
+ C12,8.7,11.7,7.8,11.2,7.1z M10,10H8v2H7v-2H5V9h2V7h1v2h2V10z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/buddhism.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/buddhism.svg
new file mode 100644
index 00000000..83b222c4
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/buddhism.svg
@@ -0,0 +1,24 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="15px" height="15px" viewBox="0 0 15 15">
+<path d="M13.4978,6.9989h-0.5329c-0.09997-1.10708-0.53528-2.15731-1.2478-3.0105l0.378-0.3784
+ c0.19605-0.19447,0.19733-0.51105,0.00286-0.7071C11.90698,2.71037,11.59733,2.70518,11.4,2.8912l0,0l-0.0123,0.0123L11.01,3.2815
+ c-0.85331-0.71298-1.90385-1.14864-3.0113-1.2488V1.5c0-0.27614-0.22386-0.5-0.5-0.5s-0.5,0.22386-0.5,0.5v0.5327
+ C5.8916,2.13306,4.84144,2.56871,3.9884,3.2815L3.61,2.9C3.41007,2.70952,3.09358,2.71717,2.9031,2.9171
+ c-0.184,0.19312-0.184,0.49668,0,0.6898l0.3784,0.3775C2.56787,4.83856,2.13216,5.89031,2.0327,6.9989H1.5
+ c-0.27614,0-0.5,0.22386-0.5,0.5s0.22386,0.5,0.5,0.5h0.5327c0.09987,1.10695,0.535,2.15711,1.2473,3.0103l-0.3779,0.3779
+ c-0.19538,0.19514-0.19557,0.51173-0.00043,0.70711c0.19053,0.19076,0.49798,0.19611,0.69503,0.01209L3.609,12.094l0.3779-0.3779
+ c0.8533,0.71312,1.90395,1.1488,3.0115,1.2488v0.5329c0,0.27614,0.22386,0.5,0.5,0.5s0.5-0.22386,0.5-0.5v-0.5329
+ c1.10719-0.10026,2.15744-0.53592,3.0105-1.2488l0.3779,0.3779c0.19514,0.19538,0.51173,0.19557,0.70711,0.00043
+ c0.19076-0.19053,0.19611-0.49798,0.01209-0.69503l-0.0123-0.0123l0,0l-0.3779-0.3779c0.71283-0.8531,1.14848-1.90333,1.2488-3.0105
+ h0.5329c0.27609-0.00544,0.49549-0.23366,0.49006-0.50975C13.98227,7.22064,13.76611,7.00435,13.4978,6.9989z M7.9987,3.0505
+ c0.83871,0.09248,1.63383,0.42154,2.2926,0.9488l-2.15,2.15c-0.04663-0.0218-0.09436-0.04116-0.143-0.058V3.0505H7.9987z
+ M6.9987,3.0505V6.091c-0.04864,0.01684-0.09637,0.0362-0.143,0.058l-2.15-2.15c0.65897-0.52726,1.45431-0.85622,2.2932-0.9485
+ H6.9987z M3.9987,4.7062l2.15,2.15c-0.0218,0.04663-0.04116,0.09436-0.058,0.143H3.0505
+ c0.09243-0.83886,0.42154-1.63413,0.9489-2.293L3.9987,4.7062z M3.0505,7.9987H6.091c0.01687,0.04863,0.03623,0.09636,0.058,0.143
+ l-2.15,2.15C3.47173,9.63281,3.14276,8.83753,3.0505,7.9987z M6.9989,11.9471c-0.83871-0.09248-1.63383-0.42154-2.2926-0.9488
+ l2.15-2.15c0.04663,0.0218,0.09436,0.04116,0.143,0.058v3.0405L6.9989,11.9471z M7.9989,11.9471V8.9066
+ c0.04864-0.01683,0.09638-0.03619,0.143-0.058l2.15,2.15c-0.65895,0.5273-1.4543,0.85627-2.2932,0.9485H7.9989z M10.9989,10.2914
+ l-2.15-2.15c0.02177-0.04664,0.04113-0.09437,0.058-0.143h3.0415c-0.09276,0.83901-0.42232,1.6343-0.9502,2.293H10.9989z
+ M8.9066,6.9989c-0.01684-0.04864-0.0362-0.09637-0.058-0.143l2.15-2.15c0.52726,0.65877,0.85632,1.45389,0.9488,2.2926H8.9066
+ V6.9989z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/building-alt1.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/building-alt1.svg
new file mode 100644
index 00000000..e9ff5abc
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/building-alt1.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<title>buildings</title>
+<path d="M11,13.5v-9C11,4.2,10.8,4,10.5,4H9V1L5,2.1v11.4H2V14h11v-0.5H11z M7,13.5V3h1v10.5H7z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/building.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/building.svg
new file mode 100644
index 00000000..3c12da77
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/building.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M3,2v11h5v-3h3v3h1V2H3z M7,12H4v-2h3V12z M7,9H4V7h3V9z M7,6H4V4h3V6z M11,9H8V7h3V9z M11,6H8V4h3V6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/bus.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/bus.svg
new file mode 100644
index 00000000..49dca840
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/bus.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="bus-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path8043" d="M4,0C2.6364,0,1,0.7433,1,2.7461v5.4531V12c0,0,0,1,1,1v1c0,0,0,1,1,1s1-1,1-1v-1h7v1c0,0,0,1,1,1s1-1,1-1v-1
+ c0,0,1,0,1-1V2.7461C14,0.7006,12.764,0,11.4004,0H4z M4.25,1.5h6.5C10.8885,1.5,11,1.6115,11,1.75S10.8885,2,10.75,2h-6.5
+ C4.1115,2,4,1.8885,4,1.75S4.1115,1.5,4.25,1.5z M3,3h9c1,0,1,0.9668,1,0.9668V7c0,0,0,1-1,1H3C2,8,2,7,2,7V4C2,4,2,3,3,3z M3,10
+ c0.5523,0,1,0.4477,1,1s-0.4477,1-1,1s-1-0.4477-1-1S2.4477,10,3,10z M12,10c0.5523,0,1,0.4477,1,1s-0.4477,1-1,1s-1-0.4477-1-1
+ S11.4477,10,12,10z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/cafe.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/cafe.svg
new file mode 100644
index 00000000..d333ac80
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/cafe.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M12,5h-2V3H2v4c0.0133,2.2091,1.8149,3.9891,4.024,3.9758C7.4345,10.9673,8.7362,10.2166,9.45,9H12c1.1046,0,2-0.8954,2-2
+ S13.1046,5,12,5z M12,8H9.86C9.9487,7.6739,9.9958,7.3379,10,7V6h2c0.5523,0,1,0.4477,1,1S12.5523,8,12,8z M10,12.5
+ c0,0.2761-0.2239,0.5-0.5,0.5h-7C2.2239,13,2,12.7761,2,12.5S2.2239,12,2.5,12h7C9.7761,12,10,12.2239,10,12.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/campsite.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/campsite.svg
new file mode 100644
index 00000000..74cbe9fd
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/campsite.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="campsite-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect3335" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccccc" style="fill:#010101;" d="M7,1.5
+ l-5.5,9H1c-1,0-1,1-1,1v1c0,0,0,1,1,1h13c1,0,1-1,1-1v-1c0,0,0-1-1-1h-0.5L8,1.5C7.8,1.1,7.2,1.1,7,1.5z M7.5,5l3.2,5.5H4.2L7.5,5z"
+ />
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/car.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/car.svg
new file mode 100644
index 00000000..9e08b702
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/car.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M14,7c-0.004-0.6904-0.4787-1.2889-1.15-1.45l-1.39-3.24l0,0l0,0l0,0C11.3833,2.1233,11.2019,2.001,11,2H4
+ C3.8124,2.0034,3.6425,2.1115,3.56,2.28l0,0l0,0l0,0L2.15,5.54C1.475,5.702,0.9994,6.3059,1,7v3.5h1v1c0,0.5523,0.4477,1,1,1
+ s1-0.4477,1-1v-1h7v1c0,0.5523,0.4477,1,1,1s1-0.4477,1-1v-1h1V7z M4.3,3h6.4l1.05,2.5h-8.5L4.3,3z M3,9C2.4477,9,2,8.5523,2,8
+ s0.4477-1,1-1s1,0.4477,1,1S3.5523,9,3,9z M12,9c-0.5523,0-1-0.4477-1-1s0.4477-1,1-1s1,0.4477,1,1S12.5523,9,12,9z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/castle.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/castle.svg
new file mode 100644
index 00000000..f3994d8d
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/castle.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M11,4H4C3.4477,4,3,3.5523,3,3V0.5C3,0.2239,3.2239,0,3.5,0S4,0.2239,4,0.5V2h1V1c0-0.5523,0.4477-1,1-1s1,0.4477,1,1v1h1V1
+ c0-0.5523,0.4477-1,1-1s1,0.4477,1,1v1h1V0.5C11,0.2239,11.2239,0,11.5,0S12,0.2239,12,0.5V3C12,3.5523,11.5523,4,11,4z M14,14.5
+ c0,0.2761-0.2239,0.5-0.5,0.5h-12C1.2239,15,1,14.7761,1,14.5S1.2239,14,1.5,14H2c0.5523,0,1-0.4477,1-1c0,0,1-6,1-7
+ c0-0.5523,0.4477-1,1-1h5c0.5523,0,1,0.4477,1,1c0,1,1,7,1,7c0,0.5523,0.4477,1,1,1h0.5c0.2723-0.0001,0.4946,0.2178,0.5,0.49V14.5z
+ M9,10.5C9,9.6716,8.3284,9,7.5,9S6,9.6716,6,10.5V14h3V10.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/cemetery.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/cemetery.svg
new file mode 100644
index 00000000..8ae91032
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/cemetery.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M11.46,12h-0.68L12,3.55c0.0175-0.2867-0.2008-0.5332-0.4874-0.5507C11.4884,2.9979,11.4641,2.9981,11.44,3h-1.18
+ c0-0.92-1.23-2-2.75-2S4.77,2.08,4.77,3H3.54C3.253,2.9885,3.0111,3.2117,2.9995,3.4987C2.9988,3.5158,2.999,3.5329,3,3.55L4.2,12
+ H3.55C3.2609,11.9886,3.0162,12.2112,3,12.5V14h9v-1.51C11.9839,12.2067,11.7435,11.9886,11.46,12z M4.5,5h6v1h-6V5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/cinema.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/cinema.svg
new file mode 100644
index 00000000..b38733e3
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/cinema.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M14,7.5v2c0,0.2761-0.2239,0.5-0.5,0.5S13,9.7761,13,9.5c0,0,0.06-0.5-1-0.5h-1v2.5c0,0.2761-0.2239,0.5-0.5,0.5h-8
+ C2.2239,12,2,11.7761,2,11.5v-4C2,7.2239,2.2239,7,2.5,7h8C10.7761,7,11,7.2239,11,7.5V8h1c1.06,0,1-0.5,1-0.5
+ C13,7.2239,13.2239,7,13.5,7S14,7.2239,14,7.5z M4,3C2.8954,3,2,3.8954,2,5s0.8954,2,2,2s2-0.8954,2-2S5.1046,3,4,3z M4,6
+ C3.4477,6,3,5.5523,3,5s0.4477-1,1-1s1,0.4477,1,1S4.5523,6,4,6z M8.5,2C7.1193,2,6,3.1193,6,4.5S7.1193,7,8.5,7S11,5.8807,11,4.5
+ S9.8807,2,8.5,2z M8.5,6C7.6716,6,7,5.3284,7,4.5S7.6716,3,8.5,3S10,3.6716,10,4.5S9.3284,6,8.5,6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/circle-stroked.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/circle-stroked.svg
new file mode 100644
index 00000000..92997dde
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/circle-stroked.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="circle-stroked-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path8564-5-6-4" inkscape:connector-curvature="0" d="M7.5,0C11.6422,0,15,3.3578,15,7.5S11.6422,15,7.5,15
+ S0,11.6422,0,7.5S3.3578,0,7.5,0z M7.5,1.6666c-3.2217,0-5.8333,2.6117-5.8333,5.8334S4.2783,13.3334,7.5,13.3334
+ s5.8333-2.6117,5.8333-5.8334S10.7217,1.6666,7.5,1.6666z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/circle.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/circle.svg
new file mode 100644
index 00000000..cf07ba4c
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/circle.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M14,7.5c0,3.5899-2.9101,6.5-6.5,6.5S1,11.0899,1,7.5S3.9101,1,7.5,1S14,3.9101,14,7.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/city.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/city.svg
new file mode 100644
index 00000000..08cb18e1
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/city.svg
@@ -0,0 +1,14 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="15px" height="15px" viewBox="0 0 15 15">
+<path d="M13.6368,3.9994h-1.6387V1.3608C11.99804,1.16148,11.83642,0.99994,11.6371,1l0,0h-0.278
+ c-0.19932,0-0.3609,0.16158-0.3609,0.3609l0,0v2.6385H9.36c-0.19932,0-0.3609,0.16158-0.3609,0.3609l0,0l0,0v5.6381h-3.637
+ c-0.20042,0-0.3629,0.16248-0.3629,0.3629v3.2745c0.00055,0.20003,0.16287,0.3619,0.3629,0.3619h8.2747
+ c0.19932,0,0.3609-0.16158,0.3609-0.3609l0,0V4.36c0-0.19932-0.16158-0.3609-0.3609-0.3609l0,0L13.6368,3.9994z M6.9989,11.9981h-1
+ v-1h1V11.9981z M8.9989,11.9981h-1v-1h1V11.9981z M10.9989,11.9981h-1v-1h1V11.9981z M10.9989,9.9981h-1v-1h1V9.9981z
+ M10.9989,7.9981h-1v-1h1V7.9981z M10.9989,5.9981h-1v-1h1V5.9981z M12.9989,11.9971h-1v-1h1V11.9971z M12.9989,9.9971h-1v-1h1
+ V9.9971z M12.9989,7.9971h-1v-1h1V7.9971z M12.9989,5.9971h-1v-1h1V5.9971z M7.9987,1.3608C7.99864,1.16152,7.83708,1,7.6378,1H5.36
+ C5.16068,1,4.9991,1.16158,4.9991,1.3609l0,0V3H3.36C3.16138,3.00049,3.00049,3.16138,3,3.36l0,0v0.6394H1.3608
+ C1.16164,3.99945,1.00017,4.16084,1,4.36l0,0v9.2765c0,0.19932,0.16158,0.3609,0.3609,0.3609h2.6385V8.9986h3.9993V1.3608z
+ M3,11.9981H2v-1h1V11.9981z M3,9.9981H2v-1h1V9.9981z M3,7.9981H2v-1h1V7.9981z M3,5.9981H2v-1h1V5.9981z M5,7.9981H4v-1h1V7.9981z
+ M5,5.9981H4v-1h1V5.9981z M7,7.9981H6v-1h1V7.9981z M7,5.9981H6v-1h1V5.9981z M7,3.9981H6V3h1v1V3.9981z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/clothing-store.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/clothing-store.svg
new file mode 100644
index 00000000..63fb1abf
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/clothing-store.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="clothing-store-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect4181-0-0" inkscape:connector-curvature="0" inkscape:export-filename="/Users/MapBox/Desktop/clothing-store.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" sodipodi:nodetypes="cccccccccccccc" d="
+ M3.5,1L0,4v3h2.9L3,14h9V7h3V4l-3.5-3H10L7.5,5L5,1H3.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/college.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/college.svg
new file mode 100644
index 00000000..f584f737
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/college.svg
@@ -0,0 +1,5 @@
+<svg id="svg4619" xmlns="http://www.w3.org/2000/svg" width="15px" height="15px" viewBox="0 0 15 15">
+<path d="M7.5,1L0,4.5l2,0.9v1.7C1.4,7.3,1,7.9,1,8.5s0.4,1.2,1,1.4V10l-0.9,2.1
+ C0.8,13,1,14,2.5,14s1.7-1,1.4-1.9L3,10c0.6-0.3,1-0.8,1-1.5S3.6,7.3,3,7.1V5.9L7.5,8L15,4.5L7.5,1z M11.9,7.5l-4.5,2L5,8.4v0.1
+ c0,0.7-0.3,1.3-0.8,1.8l0.6,1.4v0.1C4.9,12.2,5,12.6,4.9,13c0.7,0.3,1.5,0.5,2.5,0.5c3.3,0,4.5-2,4.5-3L11.9,7.5L11.9,7.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/commercial.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/commercial.svg
new file mode 100644
index 00000000..316a578e
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/commercial.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M14,7H1c0.0881-1.3829,0.427-2.7383,1-4h11C13.5731,4.2617,13.9119,5.6171,14,7z M3,8h9v6h-1V9H8v5H3V8z M4,11h3V9H4V11z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/cricket.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/cricket.svg
new file mode 100644
index 00000000..80230cbd
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/cricket.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M8,1.5C8,2.3284,7.3284,3,6.5,3S5,2.3284,5,1.5S5.6716,0,6.5,0S8,0.6716,8,1.5z M10.88,7.18L10.88,7.18l-2-2l0,0l0,0
+ C8.7815,5.0616,8.6339,4.9952,8.48,5H3.75C3.3736,4.9915,3.0508,5.2669,3,5.64l0,0l-1,7.7l0,0c-0.0068,0.0464-0.0068,0.0936,0,0.14
+ c0,0.2761,0.2239,0.5,0.5,0.5c0.2251,0.0153,0.4315-0.1251,0.5-0.34l0,0l1.2-3.89l0,0l0.26-0.83l0.4,0.44l0,0L6,10.6v2.9
+ C6,13.7761,6.2239,14,6.5,14S7,13.7761,7,13.5v-3l0,0l0,0c-0.0081-0.0788-0.0356-0.1544-0.08-0.22l0,0L5.48,8.5l1-2.5h1.71l2,1.84
+ l0,0c0.0928,0.1077,0.2278,0.1697,0.37,0.17C10.8163,7.9791,11.007,7.7581,11,7.5C10.9997,7.3824,10.9571,7.2688,10.88,7.18z
+ M14,11.27c-0.4142,0-0.75,0.3358-0.75,0.75s0.3358,0.75,0.75,0.75s0.75-0.3358,0.75-0.75S14.4142,11.27,14,11.27z M10.76,9.74V9
+ c0-0.1381-0.1119-0.25-0.25-0.25S10.26,8.8619,10.26,9v0.74c-0.1522,0.0855-0.2474,0.2455-0.25,0.42v3.34
+ c0,0.2761,0.2239,0.5,0.5,0.5s0.5-0.2239,0.5-0.5v-3.34C11.0074,9.9855,10.9122,9.8255,10.76,9.74z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/cross.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/cross.svg
new file mode 100644
index 00000000..7d302d80
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/cross.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M2.64,1.27L7.5,6.13l4.84-4.84C12.5114,1.1076,12.7497,1.0029,13,1c0.5523,0,1,0.4477,1,1
+ c0.0047,0.2478-0.093,0.4866-0.27,0.66L8.84,7.5l4.89,4.89c0.1648,0.1612,0.2615,0.3796,0.27,0.61c0,0.5523-0.4477,1-1,1
+ c-0.2577,0.0107-0.508-0.0873-0.69-0.27L7.5,8.87l-4.85,4.85C2.4793,13.8963,2.2453,13.9971,2,14c-0.5523,0-1-0.4477-1-1
+ c-0.0047-0.2478,0.093-0.4866,0.27-0.66L6.16,7.5L1.27,2.61C1.1052,2.4488,1.0085,2.2304,1,2c0-0.5523,0.4477-1,1-1
+ C2.2404,1.0029,2.4701,1.0998,2.64,1.27z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/dam.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/dam.svg
new file mode 100644
index 00000000..a9be122c
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/dam.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M13.94,9.5c0,0.2761-0.2239,0.5-0.5,0.5l0,0c-0.259,0.0219-0.4994,0.1439-0.67,0.34c-0.2714,0.2887-0.6175,0.4964-1,0.6
+ c-0.6115,0.1816-1.2734,0.0424-1.76-0.37l-0.39-0.35c-0.2976-0.3038-0.7851-0.3087-1.0889-0.0111
+ C8.5274,10.2126,8.5237,10.2163,8.52,10.22c-0.14,0.12-0.27,0.25-0.42,0.37c-0.7278,0.5784-1.7663,0.5489-2.46-0.07L5.3,10.19
+ l-0.1-0.06l0.3,1.22l0.49,2c0.0829,0.2634-0.0634,0.5441-0.3267,0.6271C5.6105,13.9937,5.5553,14.0014,5.5,14h-4
+ C1.2239,14,1,13.7761,1,13.5v-12C1,1.2239,1.2239,1,1.5,1h1.1c0.2346-0.0011,0.4384,0.1611,0.49,0.39L4,5.06V5.2
+ c0.6569-0.314,1.4361-0.2205,2,0.24c0.16,0.13,0.31,0.28,0.47,0.41c0.2847,0.2546,0.7153,0.2546,1,0c0.16-0.13,0.31-0.28,0.47-0.41
+ c0.7076-0.5968,1.7424-0.5968,2.45,0c0.15,0.13,0.29,0.27,0.44,0.39c0.2847,0.2546,0.7153,0.2546,1,0l0.47-0.41
+ c0.3163-0.2672,0.7159-0.4157,1.13-0.42l0,0c0.2761,0,0.5,0.2239,0.5,0.5S13.7061,6,13.43,6l0,0
+ c-0.259,0.0219-0.4994,0.1439-0.67,0.34c-0.2714,0.2887-0.6175,0.4964-1,0.6C11.1485,7.1216,10.4866,6.9824,10,6.57L9.67,6.23
+ C9.3724,5.9262,8.8849,5.9213,8.5811,6.2189C8.5774,6.2226,8.5737,6.2263,8.57,6.23C8.43,6.35,8.3,6.48,8.15,6.6
+ C7.4222,7.1784,6.3837,7.1489,5.69,6.53L5.3,6.19c-0.2847-0.2546-0.7153-0.2546-1,0L4.24,6.24L4.93,9
+ C5.3226,9.029,5.6965,9.1793,6,9.43c0.16,0.13,0.31,0.28,0.47,0.41c0.2847,0.2546,0.7153,0.2546,1,0c0.16-0.13,0.31-0.28,0.47-0.41
+ c0.7076-0.5968,1.7424-0.5968,2.45,0c0.15,0.13,0.29,0.27,0.44,0.39c0.2847,0.2546,0.7153,0.2546,1,0l0.47-0.41
+ c0.3177-0.2636,0.7172-0.4085,1.13-0.41l0,0c0.2761-0.0055,0.5044,0.2138,0.5099,0.4899C13.94,9.4933,13.94,9.4966,13.94,9.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/danger.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/danger.svg
new file mode 100644
index 00000000..e0036920
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/danger.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M13.94,14.68c-0.0749,0.194-0.262,0.3215-0.47,0.32c-0.0595,0.0107-0.1205,0.0107-0.18,0L7.5,12.56L1.7,15
+ c-0.2572,0.1005-0.5472-0.0266-0.6476-0.2838C1.0516,14.7141,1.0508,14.7121,1.05,14.71c-0.1291-0.2441-0.0358-0.5467,0.2084-0.6757
+ C1.2845,14.0205,1.3118,14.009,1.34,14l4.85-2l-4.85-2C1.0758,9.9197,0.9267,9.6404,1.007,9.3762s0.3596-0.4133,0.6238-0.333
+ C1.6545,9.0504,1.6776,9.0594,1.7,9.07l5.8,2.41l5.8-2.41c0.2494-0.1185,0.5477-0.0124,0.6662,0.237
+ c0.1185,0.2494,0.0124,0.5477-0.237,0.6662C13.7068,9.9839,13.6837,9.9928,13.66,10L8.8,12l4.85,2
+ c0.2607,0.091,0.3983,0.3761,0.3074,0.6368C13.9523,14.6515,13.9465,14.6659,13.94,14.68z M12,4.23v0.45
+ c-0.0021,0.2129-0.0722,0.4196-0.2,0.59C11.2414,5.8883,10.6399,6.4664,10,7v1.16c0.0015,0.208-0.126,0.3951-0.32,0.47L7.52,9.5
+ H7.45L5.28,8.63C5.1016,8.5428,4.9917,8.3584,5,8.16V7C4.3528,6.4675,3.7446,5.8893,3.18,5.27C3.0593,5.0972,2.9963,4.8907,3,4.68
+ V4.23C3.1669,2.0117,4.8974,0.2307,7.11,0h0.36l0,0h0.39C10.0862,0.2131,11.8348,1.9997,12,4.23z M6,4c0-0.5523-0.4477-1-1-1
+ S4,3.4477,4,4s0.4477,1,1,1S6,4.5523,6,4z M7,7c0-0.2761-0.2239-0.5-0.5-0.5S6,6.7239,6,7v0.5C6,7.7761,6.2239,8,6.5,8
+ S7,7.7761,7,7.5V7z M9,7c0-0.2761-0.2239-0.5-0.5-0.5S8,6.7239,8,7v0.5C8,7.7761,8.2239,8,8.5,8S9,7.7761,9,7.5V7z M11,4
+ c0-0.5523-0.4477-1-1-1S9,3.4477,9,4s0.4477,1,1,1S11,4.5523,11,4z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/defibrillator.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/defibrillator.svg
new file mode 100644
index 00000000..559174ff
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/defibrillator.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>defibrillator-15</title>
+ <path d="M1.55,6.3381C-0.8368,1.7416,5.18-1.3228,7.502,3.2737c2.3215-4.5965,8.3387-1.5322,5.9523,3.0644-0.0869.1671-.2028,0.3456-0.3114,0.5212H11.335L9.5205,4.1377A0.6252,0.6252,0,0,0,8.42,4.2524l-1.6484,4.12-1.33-1.33A0.6254,0.6254,0,0,0,5,6.8594H1.8611C1.7525,6.6837,1.6366,6.5052,1.55,6.3381ZM11,8.1094a0.6263,0.6263,0,0,1-.5205-0.2783L9.1387,5.82,7.58,9.7168a0.6245,0.6245,0,0,1-.4546.38A0.6047,0.6047,0,0,1,7,10.1094a0.6251,0.6251,0,0,1-.4419-0.1826L4.7412,8.1094H2.7358a42.67,42.67,0,0,0,4.46,4.6732,0.4642,0.4642,0,0,0,.6222,0,43.26,43.26,0,0,0,4.4505-4.6732H11Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/dentist.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/dentist.svg
new file mode 100644
index 00000000..743f9071
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/dentist.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M4.36,14c-1,0-0.56-2.67-0.86-5c-0.1-0.76-1-1.49-1.12-2.06C2,5,1.39,1.44,3.66,1S6,3,7.54,3s1.57-2.36,3.85-2
+ s1.59,3.9,1.29,5.9c-0.1,0.45-1.1,1.48-1.18,2.06c-0.33,2.4,0.32,5-0.8,5c-0.93,0-1.32-2.72-2-4.5C8.43,8.63,8.06,8,7.54,8
+ C6,8,5.75,14,4.36,14z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/doctor.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/doctor.svg
new file mode 100644
index 00000000..da88245e
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/doctor.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M5.5,7C4.1193,7,3,5.8807,3,4.5l0,0v-2C3,2.2239,3.2239,2,3.5,2H4c0.2761,0,0.5-0.2239,0.5-0.5S4.2761,1,4,1H3.5
+ C2.6716,1,2,1.6716,2,2.5v2c0.0013,1.1466,0.5658,2.2195,1.51,2.87l0,0C4.4131,8.1662,4.9514,9.297,5,10.5C5,12.433,6.567,14,8.5,14
+ s3.5-1.567,3.5-3.5V9.93c1.0695-0.2761,1.7126-1.367,1.4365-2.4365C13.1603,6.424,12.0695,5.7809,11,6.057
+ C9.9305,6.3332,9.2874,7.424,9.5635,8.4935C9.7454,9.198,10.2955,9.7481,11,9.93v0.57c0,1.3807-1.1193,2.5-2.5,2.5S6,11.8807,6,10.5
+ c0.0511-1.2045,0.5932-2.3356,1.5-3.13l0,0C8.4404,6.7172,9.001,5.6448,9,4.5v-2C9,1.6716,8.3284,1,7.5,1H7
+ C6.7239,1,6.5,1.2239,6.5,1.5S6.7239,2,7,2h0.5C7.7761,2,8,2.2239,8,2.5v2l0,0C8,5.8807,6.8807,7,5.5,7 M11.5,9
+ c-0.5523,0-1-0.4477-1-1s0.4477-1,1-1s1,0.4477,1,1S12.0523,9,11.5,9z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/dog-park.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/dog-park.svg
new file mode 100644
index 00000000..63735f9d
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/dog-park.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="svg2"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="dog-park-15.svg"
+ x="0px"
+ y="0px"
+ width="15px"
+ height="15px"
+ viewBox="0 0 15 15"
+ style="enable-background:new 0 0 15 15;"
+ xml:space="preserve"><metadata
+ id="metadata13"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs11" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1899"
+ inkscape:window-height="779"
+ id="namedview9"
+ showgrid="false"
+ inkscape:zoom="15.733333"
+ inkscape:cx="-1.1122881"
+ inkscape:cy="7.5"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" /><g
+ id="g3"><path
+ style="fill:#010101;"
+ d="M 10.300781 1.2207031 C 9.9144812 1.2207031 9.6 1.2 9.5 2 L 9.0996094 4.5214844 L 11.5 6.5 L 13.5 6.5 C 14.9 6.5 15 5.5410156 15 5.5410156 L 13.099609 3.3222656 C 12.399609 2.6222656 11.7 2.5 11 2.5 L 11 2 C 11 2 11.067481 1.2206031 10.300781 1.2207031 z M 4.75 1.5 C 4.75 1.5 3.7992187 1.5206031 3.1992188 1.7207031 C 2.5992187 1.9207031 2 2.6210938 2 3.6210938 L 2 7.5214844 C 2 9.2214844 1.3 9.5 1 9.5 C 1 9.5 0 9.5214844 0 10.521484 L 0 12.720703 C 0 12.720703 0.00078125 13.521484 0.80078125 13.521484 L 1 13.521484 L 1.5 13.521484 L 2 13.521484 L 2 13.021484 L 2 12.822266 C 2 12.422266 1.8 12.221094 1.5 12.121094 L 1.5 11.021484 C 2.5 11.021484 2.6 10.820703 3 10.720703 L 3.5507812 12.917969 C 3.6507813 13.217969 3.7507813 13.417578 4.0507812 13.517578 L 5.0507812 13.517578 L 6 13.5 L 6 12.699219 C 6 12.022819 5 12 5 12 L 5 9.5 L 8.5 9.5 L 9.1992188 12.121094 C 9.5992188 13.521094 10.5 13.5 10.5 13.5 L 11 13.5 L 12 13.5 L 12 12.699219 C 12 11.987419 11 12 11 12 L 11.099609 7.921875 L 8 5.5 L 3.5 5.5 L 3.5 3.5 C 3.5 3.1 3.7765 3.0053 4 3 C 4.4941 2.9882 4.75 3 4.75 3 C 5.1642 3 5.5 2.6642 5.5 2.25 C 5.5 1.8358 5.1642 1.5 4.75 1.5 z M 11.75 4 C 11.8881 4 12 4.1119 12 4.25 C 12 4.3881 11.8881 4.5 11.75 4.5 C 11.6119 4.5 11.5 4.3881 11.5 4.25 C 11.5 4.1119 11.6119 4 11.75 4 z "
+ id="path5" /></g></svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/drinking-water.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/drinking-water.svg
new file mode 100644
index 00000000..e3b4e00d
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/drinking-water.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>drinking-water-15</title>
+ <path d="M6,1A2,2,0,0,0,4,3V6.5a0.5,0.5,0,0,0,.5.5h2A0.5,0.5,0,0,0,7,6.5v-2A0.5,0.5,0,0,1,7.5,4H14V1H6Z"/>
+ <path d="M7,15H4a0.5,0.5,0,0,1-.48-0.38L2,8.62A0.5,0.5,0,0,1,2.5,8h6A0.5,0.5,0,0,1,9,8.62l-1.5,6A0.5,0.5,0,0,1,7,15ZM3.65,11l3.71,0L7.86,9H3.14Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/embassy.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/embassy.svg
new file mode 100644
index 00000000..bc3ea298
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/embassy.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M6.65,2C5.43,2,4.48,3.38,4.11,3.82C4.0365,3.9102,3.9975,4.0237,4,4.14v4.4C3.9884,8.7827,4.1758,8.9889,4.4185,9.0005
+ C4.528,9.0057,4.6355,8.9699,4.72,8.9c0.4665-0.6264,1.1589-1.0461,1.93-1.17C8.06,7.73,8.6,9,10.07,9
+ c0.9948-0.0976,1.9415-0.4756,2.73-1.09c0.1272-0.0934,0.2016-0.2422,0.2-0.4V2.45c0.0275-0.2414-0.1459-0.4595-0.3874-0.487
+ C12.5332,1.954,12.4527,1.9668,12.38,2c-0.6813,0.5212-1.4706,0.8834-2.31,1.06C8.6,3.08,8.12,2,6.65,2z M2.5,3
+ c-0.5523,0-1-0.4477-1-1s0.4477-1,1-1s1,0.4477,1,1S3.0523,3,2.5,3z M3,4v9.48c0,0.2761-0.2239,0.5-0.5,0.5S2,13.7561,2,13.48V4
+ c0-0.2761,0.2239-0.5,0.5-0.5S3,3.7239,3,4z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/emergency-phone.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/emergency-phone.svg
new file mode 100644
index 00000000..8b25a3a6
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/emergency-phone.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>emergency-phone-15</title>
+ <path d="M7.875,11.49a.51.51,0,0,0,.72,0l.72-.72,2.18,2.16-.37.37a2.24,2.24,0,0,1-1.44.7H8.24a2.24,2.24,0,0,1-1.45-.7L1.72,8.23A2.24,2.24,0,0,1,1,6.78V5.33a2.24,2.24,0,0,1,.72-1.45l.36-.36L4.26,5.69l-.73.73a.51.51,0,0,0,0,.72Zm4.72.38a1,1,0,0,0,.036-1.414h0l-.036-.036-.72-.72a1,1,0,0,0-1.414-.036h0l-.036.036ZM5.315,4.62a1,1,0,0,0,.036-1.414h0L4.595,2.45a1,1,0,0,0-1.414-.036h0L3.14,2.45ZM10,2V4H8V5h2V7h1V5h2V4H11V2Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/entrance-alt1.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/entrance-alt1.svg
new file mode 100644
index 00000000..ec98d6fd
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/entrance-alt1.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>entrance-alt1-15</title>
+ <path d="M6.554,9.639a.5.5,0,0,0,.707.707L9.928,7.669a.25.25,0,0,0,0-.354h0L7.261,4.639a.5.5,0,0,0-.707.707L8.2,7H1.5a.5.5,0,0,0,0,1H8.2ZM12,1H5.5a.5.5,0,0,0,0,1h6a.5.5,0,0,1,.5.5v10a.5.5,0,0,1-.5.5H5.25a.5.5,0,0,0,0,1H12a1,1,0,0,0,1-1V2A1,1,0,0,0,12,1Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/entrance.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/entrance.svg
new file mode 100644
index 00000000..39cf2c38
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/entrance.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M7,6.5v-1c0-0.5523-0.4477-1-1-1s-1,0.4477-1,1v3L7,6.5z M4.65,10.56L5,3c0-0.5523,0.4477-1,1-1s1,0.4477,1,1S6.5523,4,6,4
+ S5,3.5523,5,3L4.65,10.56z"/>
+<path d="M14,6L14,6c0,0.5523-0.4477,1-1,1h-1.58c-0.2658-0.0015-0.5213,0.1028-0.71,0.29l-5.42,5.42
+ c-0.1863,0.1847-0.4377,0.2889-0.7,0.29H2c-0.5523,0-1-0.4477-1-1l0,0c0-0.5523,0.4477-1,1-1h1.59
+ c0.2623-0.0011,0.5137-0.1053,0.7-0.29l5.42-5.42C9.8987,5.1028,10.1542,4.9985,10.42,5H13C13.5523,5,14,5.4477,14,6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/farm.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/farm.svg
new file mode 100644
index 00000000..b051c235
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/farm.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>farm-15</title>
+ <path d="M8,7L5,5,2,7,1,9v4H3V11H7v2H9V9ZM6,9H4V7H6V9Zm8,4H11V3.5a1.5,1.5,0,0,1,3,0V13Z" fill="#010101"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/fast-food.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/fast-food.svg
new file mode 100644
index 00000000..56a74d52
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/fast-food.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M14,8c0,0.5523-0.4477,1-1,1H2C1.4477,9,1,8.5523,1,8s0.4477-1,1-1h11C13.5523,7,14,7.4477,14,8z M3.5,10H2
+ c0,1.6569,1.3431,3,3,3h5c1.6569,0,3-1.3431,3-3H3.5z M3,6H2V4c0-1.1046,0.8954-2,2-2h7c1.1046,0,2,0.8954,2,2v2H3z M11,4.5
+ C11,4.7761,11.2239,5,11.5,5S12,4.7761,12,4.5S11.7761,4,11.5,4S11,4.2239,11,4.5z M9,3.5C9,3.7761,9.2239,4,9.5,4S10,3.7761,10,3.5
+ S9.7761,3,9.5,3S9,3.2239,9,3.5z M7,4.5C7,4.7761,7.2239,5,7.5,5S8,4.7761,8,4.5S7.7761,4,7.5,4S7,4.2239,7,4.5z M5,3.5
+ C5,3.7761,5.2239,4,5.5,4S6,3.7761,6,3.5S5.7761,3,5.5,3S5,3.2239,5,3.5z M3,4.5C3,4.7761,3.2239,5,3.5,5S4,4.7761,4,4.5
+ S3.7761,4,3.5,4S3,4.2239,3,4.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/fence.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/fence.svg
new file mode 100644
index 00000000..eba92a7f
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/fence.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>fence-15</title>
+ <path d="M13.5,10H13V7h.5a.5.5,0,0,0,0-1H13V4l-.286-.573a.249.249,0,0,0-.424-.006L12,4V6H11V4l-.286-.573a.249.249,0,0,0-.424-.006L10,4V6H9V4l-.286-.573a.249.249,0,0,0-.424-.006L8,4V6H7V4l-.286-.573a.249.249,0,0,0-.424-.006L6,4V6H5V4l-.286-.573a.249.249,0,0,0-.424-.006L4,4V6H3V4l-.286-.573a.249.249,0,0,0-.424-.006L2,4V6H1.5a.5.5,0,0,0,0,1H2v3H1.5a.5.5,0,0,0,0,1H2v1.5a.5.5,0,0,0,1,0V11H4v1.5a.5.5,0,0,0,1,0V11H6v1.5a.5.5,0,0,0,1,0V11H8v1.5a.5.5,0,0,0,1,0V11h1v1.5a.5.5,0,0,0,1,0V11h1v1.5a.5.5,0,0,0,1,0V11h.5a.5.5,0,0,0,0-1ZM3,10V7H4v3Zm2,0V7H6v3Zm2,0V7H8v3Zm2,0V7h1v3Zm2,0V7h1v3Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/ferry.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/ferry.svg
new file mode 100644
index 00000000..4f1c1591
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/ferry.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M5.33,11c0.6745,0.009,1.3262,0.245,1.85,0.67l0.26,0.23h0.05l0.31-0.28c0.9817-0.8115,2.379-0.8846,3.44-0.18L13.5,7L12,6
+ V2.45c-0.0466-0.8-0.6989-1.4305-1.5-1.45H10c0.0343-0.518-0.3579-0.9657-0.8759-1C9.0828-0.0027,9.0413-0.0027,9,0H6
+ C5.482-0.0343,5.0343,0.3579,5,0.8759C4.9973,0.9172,4.9973,0.9587,5,1H4.5C3.6989,1.0195,3.0466,1.65,3,2.45V6L1.5,7l2.25,4.53
+ C4.2143,11.2041,4.7631,11.02,5.33,11z M4,2.45c0.0105-0.2594,0.2293-0.4611,0.4886-0.4506C4.4924,1.9996,4.4962,1.9998,4.5,2h6
+ c0.259-0.0171,0.4829,0.1789,0.5,0.4379c0.0014,0.0207,0.0014,0.0414,0,0.0621v3l-3.5-2L4,5.45C4,5.45,4,2.45,4,2.45z M14,13v1
+ c-0.2626,0.0194-0.5069,0.1416-0.68,0.34c-0.2717,0.2883-0.6178,0.4959-1,0.6c-0.6147,0.1815-1.2795,0.0425-1.77-0.37l-0.39-0.35
+ c-0.3043-0.3026-0.7957-0.3026-1.1,0c-0.14,0.12-0.27,0.25-0.42,0.37c-0.7328,0.5856-1.7814,0.556-2.48-0.07l-0.39-0.35
+ c-0.2864-0.2502-0.7136-0.2502-1,0c-0.19,0.15-0.36,0.32-0.55,0.47c-0.7043,0.5215-1.6732,0.4968-2.35-0.06l-0.31-0.27
+ C1.4153,14.1443,1.2172,14.0346,1,14v-1c0.2585-0.032,0.5205,0.0169,0.75,0.14c0.2782,0.1722,0.5424,0.3661,0.79,0.58
+ c0.2051,0.2235,0.5147,0.319,0.81,0.25c0.1125-0.0333,0.2177-0.0876,0.31-0.16c0.16-0.12,0.29-0.26,0.45-0.39
+ c0.7106-0.5888,1.7394-0.5888,2.45,0c0.16,0.13,0.31,0.28,0.47,0.41c0.2864,0.2502,0.7136,0.2502,1,0c0.16-0.13,0.31-0.28,0.47-0.41
+ c0.7123-0.5943,1.7477-0.5943,2.46,0c0.15,0.13,0.29,0.27,0.44,0.39c0.2864,0.2502,0.7136,0.2502,1,0l0.47-0.41
+ C13.1895,13.1408,13.5886,12.9995,14,13z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/fire-station.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/fire-station.svg
new file mode 100644
index 00000000..ee54ad28
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/fire-station.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="fire-station-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path10041-3-3" inkscape:connector-curvature="0" sodipodi:nodetypes="cccsssccccsssc" d="M7.5,0.5L5,4.5l-1.5-2
+ C2.9452,3.4753,0.8036,5.7924,0.8036,8.3036C0.8036,12.002,3.8017,15,7.5,15s6.6964-2.998,6.6964-6.6964
+ c0-2.5112-2.1416-4.8283-2.6964-5.8036l-1.5,2L7.5,0.5z M7.5,7c0,0,2.5,2.5618,2.5,4.5c0,0.8371-0.8259,2-2.5,2S5,12.3371,5,11.5
+ C5,9.6283,7.5,7,7.5,7z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/florist.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/florist.svg
new file mode 100644
index 00000000..7dcba9ea
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/florist.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>florist-15</title>
+ <path d="M1.5,1A2.7,2.7,0,0,1,4,3l.5-3L5,3A2.7,2.7,0,0,1,7.5,1c-.2.03-1,.26-1,2v.083A1.959,1.959,0,0,1,4.5,5H4.417A1.959,1.959,0,0,1,2.5,3C2.5,1.261,1.7,1.03,1.5,1ZM12.012,11l3-.5-3-.5A2.686,2.686,0,0,0,14,7.5c-.03.2-.248,1-1.988,1a2,2,0,0,0,0,4c1.739,0,1.958.8,1.988,1A2.686,2.686,0,0,0,12.012,11ZM9.688,5.548a1,1,0,0,1,0-2,1,1,0,0,1,0-2,.986.986,0,0,1,.852.507l.023-.012a.978.978,0,0,1-.116-.444,1,1,0,1,1,2,0,.978.978,0,0,1-.116.444l.019.01a.986.986,0,0,1,.85-.5,1,1,0,0,1,.025,2,1,1,0,0,1-.025,2,.986.986,0,0,1-.85-.5l-.016.009a.978.978,0,0,1,.113.44,1,1,0,0,1-2,0,.978.978,0,0,1,.113-.44l-.02-.011a.986.986,0,0,1-.852.507Zm.71-1.995A1.051,1.051,0,1,0,11.449,2.5,1.051,1.051,0,0,0,10.4,3.553v0ZM4.946,11.444l-.516-.515L8.892,6.475A1.746,1.746,0,0,1,8.44,6.22L4.076,10.575l-.519-.518A16.051,16.051,0,0,0,4.912,6a3.373,3.373,0,0,1-.412.035c-.041,0-.073-.008-.112-.01A16.953,16.953,0,0,1,3.131,9.631L2.76,9.26a.246.246,0,0,0-.4.079L.231,14.445a.287.287,0,0,0-.016.089.25.25,0,0,0,.25.25.289.289,0,0,0,.1-.019l5.1-2.124a.246.246,0,0,0,.079-.4l-.372-.372a16.874,16.874,0,0,1,3.612-1.256c0-.059-.015-.106-.015-.166A3.349,3.349,0,0,1,9,10.089,16.076,16.076,0,0,0,4.946,11.444Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/fuel.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/fuel.svg
new file mode 100644
index 00000000..ae082de8
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/fuel.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M13,6L13,6v5.5c0,0.2761-0.2239,0.5-0.5,0.5S12,11.7761,12,11.5v-2C12,8.6716,11.3284,8,10.5,8H9V2c0-0.5523-0.4477-1-1-1H2
+ C1.4477,1,1,1.4477,1,2v11c0,0.5523,0.4477,1,1,1h6c0.5523,0,1-0.4477,1-1V9h1.5C10.7761,9,11,9.2239,11,9.5v2
+ c0,0.8284,0.6716,1.5,1.5,1.5s1.5-0.6716,1.5-1.5V5c0-0.5523-0.4477-1-1-1l0,0V2.49C12.9946,2.2178,12.7723,1.9999,12.5,2
+ c-0.2816,0.0047-0.5062,0.2367-0.5015,0.5184C11.9987,2.5289,11.9992,2.5395,12,2.55V5C12,5.5523,12.4477,6,13,6s1-0.4477,1-1
+ s-0.4477-1-1-1 M8,6.5C8,6.7761,7.7761,7,7.5,7h-5C2.2239,7,2,6.7761,2,6.5v-3C2,3.2239,2.2239,3,2.5,3h5C7.7761,3,8,3.2239,8,3.5
+ V6.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/gaming.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/gaming.svg
new file mode 100644
index 00000000..5a091d7d
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/gaming.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<title>gaming</title>
+<path d="M13.1,12.5c-0.6,0.3-1.4,0.1-1.8-0.5l-1.1-1.4H4.8L3.7,12l0,0c-0.5,0.7-1.4,0.8-2.1,0.3c-0.5-0.4-0.7-1-0.6-1.5l0.7-3.7l0,0
+ C1.9,5.9,3,5,4.2,5v0H7V3.5C7,2.7,7.6,2,8.4,2h3.1C11.8,2,12,2.2,12,2.5S11.8,3,11.5,3h-3C8.2,3,8,3.2,8,3.4c0,0,0,0.1,0,0.1V5h2.8
+ v0c1.2,0,2.3,0.9,2.5,2.1l0,0l0.7,3.7l0,0C14.1,11.5,13.8,12.2,13.1,12.5z M6,7.5C6,6.7,5.3,6,4.5,6S3,6.7,3,7.5S3.7,9,4.5,9
+ S6,8.3,6,7.5z M12,7.5C12,7.2,11.8,7,11.5,7H11V6.5C11,6.2,10.8,6,10.5,6S10,6.2,10,6.5V7H9.5C9.2,7,9,7.2,9,7.5S9.2,8,9.5,8H10v0.5
+ C10,8.8,10.2,9,10.5,9S11,8.8,11,8.5V8h0.5C11.8,8,12,7.8,12,7.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/garden-center.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/garden-center.svg
new file mode 100644
index 00000000..573f36a5
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/garden-center.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="15px" height="15px" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+ <path d="M4,5L4,4.5C4,3.12 5.12,2 6.5,2C7.88,2 9,3.12 9,4.5L9,10.293L11.365,7.928L11.018,6.633C11.018,6.631 11.017,6.629 11.017,6.627L11.016,6.627L11.016,6.627C10.973,6.461 11.016,6.276 11.147,6.146C11.342,5.951 11.659,5.951 11.854,6.146L13.854,8.146C14.049,8.341 14.049,8.658 13.854,8.853C13.724,8.983 13.541,9.027 13.375,8.984C13.375,8.984 13.375,8.984 13.375,8.984C13.372,8.983 13.369,8.982 13.365,8.981L12.072,8.635L9,11.707L9,12C9,12.552 8.552,13 8,13L5,13C4.448,13 4,12.552 4,12L4,11.536L1.732,9.268C0.757,8.292 0.757,6.708 1.732,5.732C2.22,5.244 2.86,5 3.5,5L3.5,5L4,5ZM4,6L3.5,6L3.5,6C3.116,6 2.732,6.147 2.439,6.439C1.854,7.025 1.854,7.975 2.439,8.561L4,10.121L4,6ZM8,5L8,4.5C8,3.672 7.328,3 6.5,3C5.672,3 5,3.672 5,4.5L5,5L8,5Z" style="fill:black;"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/garden.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/garden.svg
new file mode 100644
index 00000000..2717b347
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/garden.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M13,8c0,3.31-2.19,6-5.5,6S2,11.31,2,8c2.2643,0.0191,4.2694,1.4667,5,3.61V7H4.5C3.6716,7,3,6.3284,3,5.5v-3
+ C3,2.2239,3.2239,2,3.5,2c0.1574,0,0.3056,0.0741,0.4,0.2l1.53,2l1.65-3c0.1498-0.232,0.4593-0.2985,0.6913-0.1487
+ C7.8308,1.0898,7.8815,1.1404,7.92,1.2l1.65,3l1.53-2c0.1657-0.2209,0.4791-0.2657,0.7-0.1C11.9259,2.1944,12,2.3426,12,2.5v3
+ C12,6.3284,11.3284,7,10.5,7H8v4.61C8.7306,9.4667,10.7357,8.0191,13,8z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/gift.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/gift.svg
new file mode 100644
index 00000000..3336ecb0
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/gift.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M6.5,5v2H0V5H6.5z M8.5,5v2H15V5H8.5z M1,8v4.5C1,13.3284,1.6716,14,2.5,14h4V8H1z M8.5,8v6h4c0.8284,0,1.5-0.6716,1.5-1.5
+ V8H8.5z M10.5,0c-1.4033-0.0444-2.6497,0.8904-3,2.25C7.1497,0.8904,5.9033-0.0444,4.5,0c-1.0709-0.0337-1.9663,0.8072-2,1.8781
+ C2.4987,1.9187,2.4987,1.9594,2.5,2C2.3443,2.9427,2.9822,3.8331,3.9249,3.9888C4.0853,4.0153,4.2486,4.0191,4.41,4h6.13
+ c0.9548,0.1497,1.8503-0.5029,2-1.4577c0.0282-0.1797,0.0282-0.3626,0-0.5423c0.0002-1.1046-0.895-2.0002-1.9996-2.0004
+ C10.5269-0.0004,10.5135-0.0003,10.5,0z M4.5,3c-0.506,0.0463-0.9537-0.3264-1-0.8323C3.4949,2.1119,3.4949,2.0558,3.5,2
+ C3.4537,1.494,3.8264,1.0463,4.3323,1C4.3881,0.9949,4.4442,0.9949,4.5,1c1.1046,0,2,0.8954,2,2H4.5z M10.5,3h-2
+ c0-1.1046,0.8954-2,2-2c0.5523,0,1,0.4477,1,1c0.0463,0.506-0.3264,0.9537-0.8323,1C10.6119,3.0051,10.5558,3.0051,10.5,3z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/golf.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/golf.svg
new file mode 100644
index 00000000..5a028acb
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/golf.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="golf-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path11758" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccccccscccccssccsssss" style="fill:#010101;" d="
+ M3.3999,1.1c0,0.1,0,0.2,0,0.2c0,0.4,0.3,0.7,0.7,0.7c0.3,0,0.5-0.2,0.6-0.5l0,0L4.9,1l5.6,2.3L6.6,6C6.2,6.3,6.2,6.7,6.3,7.1
+ l0.9,2.1l-1.3,3.9C5.7,13.6,6.1,14,6.5,14c0.3,0,0.5-0.1,0.6-0.5l1.4-4l0.1,0.3v3.5c0,0,0,0.7,0.7,0.7s0.7-0.7,0.7-0.7V10
+ c0-0.2,0-0.3-0.1-0.5L8.5,6.1l2.7-1.9c0.2-0.2,0.4-0.3,0.4-0.6s-0.2-0.5-0.4-0.6L4,0.1c-0.0878,0-0.118,0.0179-0.2001,0.1
+ L3.3999,1.1z M5.5,3C4.7,3,4,3.7,4,4.5S4.7,6,5.5,6S7,5.3,7,4.5S6.2999,3,5.5,3z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/grocery.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/grocery.svg
new file mode 100644
index 00000000..de1448e0
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/grocery.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="svg4619"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="grocery-15.svg"
+ x="0px"
+ y="0px"
+ width="15px"
+ height="15px"
+ viewBox="0 0 15 15"
+ style="enable-background:new 0 0 15 15;"
+ xml:space="preserve"><metadata
+ id="metadata15"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs13" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1751"
+ inkscape:window-height="731"
+ id="namedview11"
+ showgrid="false"
+ inkscape:zoom="15.733333"
+ inkscape:cx="-1.1122881"
+ inkscape:cy="7.5"
+ inkscape:window-x="20"
+ inkscape:window-y="43"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg4619" /><g
+ id="g3"><path
+ d="M 13.199219 1.5 C 13.199219 1.5 11.808806 1.4588 11.253906 2 C 10.720406 2.5202 10.5 2.9177 10.5 4 L 1.1992188 4 L 2.59375 8.8144531 C 2.59725 8.8217531 2.6036219 8.8287375 2.6074219 8.8359375 C 2.8418219 9.4932375 3.4545469 9.9666406 4.1855469 9.9941406 C 4.1885469 9.9954406 4.1992187 10 4.1992188 10 L 10.699219 10 L 10.699219 10.199219 C 10.699219 10.199219 10.7 10.500391 10.5 10.900391 C 10.3 11.300391 10.200391 11.5 9.4003906 11.5 L 2.9003906 11.5 C 1.9003906 11.5 1.9003906 13 2.9003906 13 L 4.0996094 13 L 4.1992188 13 L 9.0996094 13 L 9.1992188 13 L 9.3007812 13 C 10.500781 13 11.399219 12.299609 11.699219 11.599609 C 11.999219 10.899609 12 10.300781 12 10.300781 L 12 10 L 12 4 C 12 3.4764 12.228619 3 12.699219 3 L 13.25 3 C 13.6642 3 14 2.6642 14 2.25 C 14 1.8358 13.6642 1.5 13.25 1.5 L 13.199219 1.5 z M 9.1992188 13 C 8.5992188 13 8.1992188 13.4 8.1992188 14 C 8.1992188 14.6 8.5992187 15 9.1992188 15 C 9.7992187 15 10.199219 14.6 10.199219 14 C 10.199219 13.4 9.7992188 13 9.1992188 13 z M 4.1992188 13 C 3.5992188 13 3.1992188 13.4 3.1992188 14 C 3.1992188 14.6 3.5992187 15 4.1992188 15 C 4.7992188 15 5.1992188 14.6 5.1992188 14 C 5.1992188 13.4 4.7992187 13 4.1992188 13 z "
+ id="path5" /></g></svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/hairdresser.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/hairdresser.svg
new file mode 100644
index 00000000..2c92a561
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/hairdresser.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="hairdresser-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path style="fill:#010101;" d="M15,3c0,0-2-0.6-3.5,0.5l-4.3,3C6.4,5.9,5.2,5.2,4,4.8V4c0-1.1-0.9-2-2-2C0.9,2,0,2.9,0,4v1.5
+ C0,6,0.5,6,0.5,6H2h0.5C4.5,6,6,7.5,6,7.5S4.5,9,2.5,9H2H0.5C0.5,9,0,9,0,9.5V11c0,1.1,0.9,2,2,2c1.1,0,2-0.9,2-2v-0.8
+ c1.2-0.4,2.4-1.1,3.2-1.7l4.3,3C13,12.6,15,12,15,12L8.5,7.5L15,3z M3,5H2H1V4c0-0.6,0.4-1,1-1c0.6,0,1,0.4,1,1V5z M3,11
+ c0,0.6-0.4,1-1,1c-0.6,0-1-0.4-1-1v-1h1h1V11z M7.25,8c-0.2761,0-0.5-0.2239-0.5-0.5S6.9739,7,7.25,7s0.5,0.2239,0.5,0.5
+ S7.5261,8,7.25,8z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/harbor.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/harbor.svg
new file mode 100644
index 00000000..ec120af8
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/harbor.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="harbor-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path5263" d="M7.5,0C5.5,0,4,1.567,4,3.5c0.0024,1.5629,1.0397,2.902,2.5,3.3379v6.0391
+ c-0.9305-0.1647-1.8755-0.5496-2.6484-1.2695C2.7992,10.6273,2.002,9.0676,2.002,6.498c0.0077-0.5646-0.4531-1.0236-1.0176-1.0137
+ C0.4329,5.493-0.0076,5.9465,0,6.498c0,3.0029,1.0119,5.1955,2.4902,6.5723C3.9685,14.4471,5.8379,15,7.5,15
+ c1.6656,0,3.535-0.5596,5.0117-1.9395S14.998,9.4868,14.998,6.498c0.0648-1.3953-2.0628-1.3953-1.998,0
+ c0,2.553-0.7997,4.1149-1.8535,5.0996C10.3731,12.3203,9.4288,12.7084,8.5,12.875V6.8418C9.9607,6.4058,10.9986,5.0642,11,3.5
+ C11,1.567,9.5,0,7.5,0z M7.5,2C8.3284,2,9,2.6716,9,3.5S8.3284,5,7.5,5S6,4.3284,6,3.5S6.6716,2,7.5,2z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/heart.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/heart.svg
new file mode 100644
index 00000000..23411304
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/heart.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M13.91,6.75c-1.17,2.25-4.3,5.31-6.07,6.94c-0.1903,0.1718-0.4797,0.1718-0.67,0C5.39,12.06,2.26,9,1.09,6.75
+ C-1.48,1.8,5-1.5,7.5,3.45C10-1.5,16.48,1.8,13.91,6.75z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/heliport.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/heliport.svg
new file mode 100644
index 00000000..dc7f59d3
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/heliport.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="heliport-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path10415" inkscape:connector-curvature="0" d="M4,2C3,2,3,3,4,3h4v1C7.723,4,7.5,4.223,7.5,4.5V5H5H3.9707H3.9316
+ C3.7041,4.1201,2.9122,3.5011,2,3.5c-1.1046,0-2,0.8954-2,2s0.8954,2,2,2c0.3722-0.001,0.7368-0.1058,1.0527-0.3027L5.5,10.5
+ C6.5074,11.9505,8.3182,12,9,12h5c0,0,1,0,1-1v-0.9941C15,9.2734,14.874,8.874,14.5,8.5l-3-3c0,0-0.5916-0.5-1.2734-0.5H9.5V4.5
+ C9.5,4.223,9.277,4,9,4V3h4c1,0,1-1,0-1C13,2,4,2,4,2z M2,4.5c0.5523,0,1,0.4477,1,1s-0.4477,1-1,1s-1-0.4477-1-1
+ C1,4.9477,1.4477,4.5,2,4.5z M10,6c0.5,0,0.7896,0.3231,1,0.5L13.5,9H10c0,0-1,0-1-1V7C9,7,9,6,10,6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/home.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/home.svg
new file mode 100644
index 00000000..1c3578c6
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/home.svg
@@ -0,0 +1,8 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="15px" height="15px" viewBox="0 0 15 15">
+<path d="M2,13.7478c0,0.13807,0.11193,0.25,0.25,0.25h3.749v-3h3v3h3.749c0.13807,0,0.25-0.11193,0.25-0.25V7.9987H2
+ C2,7.9987,2,13.7478,2,13.7478z M13.93,6.5778l-0.9319-0.8189V2c0-0.55228-0.44771-1-1-1s-1,0.44772-1,1v2L7.6808,1.09
+ C7.5863,0.9897,7.42846,0.98478,7.3279,1.079L7.3169,1.09L1.0678,6.553C0.9734,6.65376,0.97856,6.81197,1.07932,6.90637
+ C1.12478,6.94896,1.18451,6.97304,1.2468,6.9739L3,6.9989h10.7468c0.13807,0.00046,0.25037-0.1111,0.25083-0.24917
+ C13.99784,6.68592,13.97365,6.62445,13.93,6.5779V6.5778z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/horse-riding.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/horse-riding.svg
new file mode 100644
index 00000000..6aeb88a6
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/horse-riding.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>horse-riding-15</title>
+ <path d="M6,1A1,1,0,1,1,7,2,1,1,0,0,1,6,1ZM8,3.5a.484.484,0,0,0,0-.058A.472.472,0,0,0,7.5,3h-1a.484.484,0,0,0-.058,0A.472.472,0,0,0,6,3.5V7H8Zm6.85,3.644L12.8,4.8l.085-.509a.478.478,0,0,0,.008-.063.25.25,0,0,0-.25-.25.346.346,0,0,0-.158.056L9,7H8L9,8V9.5a.5.5,0,0,1-1,0v-1L6,7H4a1.5,1.5,0,0,0-1.243.661A1.466,1.466,0,0,0,1.563,7H1.5A1.449,1.449,0,0,0,0,8.4v.086A3.781,3.781,0,0,0,.559,10.4a.278.278,0,0,0,.191.1A.25.25,0,0,0,1,10.25V9s-.02-.924.753-1c.5-.048.747.253.747.5V11L2,13v1.75a.25.25,0,0,0,.25.25.254.254,0,0,0,.25-.234V13L4,11v1l.5,2.8a.255.255,0,0,0,.246.2A.25.25,0,0,0,5,14.754H5L4.855,12.3,5.5,11H8v1l.508,2.813A.257.257,0,0,0,8.75,15,.25.25,0,0,0,9,14.75V12l.367-1a1.155,1.155,0,0,0,.543-.6l2.161-3.767a.863.863,0,0,0,1.023.4l1.066.818a.591.591,0,0,0,.35.135.487.487,0,0,0,.475-.4A.552.552,0,0,0,14.85,7.144Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/hospital.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/hospital.svg
new file mode 100644
index 00000000..dde77b94
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/hospital.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="hospital-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect4194" inkscape:connector-curvature="0" style="fill:#010101;" d="M7,1C6.4,1,6,1.4,6,2v4H2C1.4,6,1,6.4,1,7v1
+ c0,0.6,0.4,1,1,1h4v4c0,0.6,0.4,1,1,1h1c0.6,0,1-0.4,1-1V9h4c0.6,0,1-0.4,1-1V7c0-0.6-0.4-1-1-1H9V2c0-0.6-0.4-1-1-1H7z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/ice-cream.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/ice-cream.svg
new file mode 100644
index 00000000..4cb0a222
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/ice-cream.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M5.44,8.17c0.7156,0.0006,1.414-0.2194,2-0.63C7.9037,7.8634,8.4391,8.0693,9,8.14h0.44L8,13.7
+ c-0.1082,0.2541-0.4019,0.3723-0.656,0.264C7.2252,13.9134,7.1306,13.8188,7.08,13.7L5.44,8.17z"/>
+<path d="M11.44,4.67c0,1.1046-0.8954,2-2,2s-2-0.8954-2-2l0,0l0,0l0,0c0,1.1046-0.8954,2-2,2s-2-0.8954-2-2s0.8954-2,2-2h0.12
+ C5.1756,1.6345,5.7035,0.4834,6.739,0.099s2.1866,0.1435,2.571,1.179c0.1667,0.449,0.1667,0.9429,0,1.3919h0.13
+ C10.5446,2.67,11.44,3.5654,11.44,4.67z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/industry.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/industry.svg
new file mode 100644
index 00000000..683d4c87
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/industry.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M14,1v12H1V8.72c0.0016-0.1419,0.0634-0.2764,0.17-0.37l3-3.22c0.2074-0.1823,0.5234-0.1618,0.7056,0.0456
+ C4.9568,5.268,5.0011,5.387,5,5.51v3l3.16-3.37c0.2025-0.1878,0.5188-0.1759,0.7066,0.0266C8.9532,5.2599,9.0009,5.3827,9,5.51V11h3
+ V1H14z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/information.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/information.svg
new file mode 100644
index 00000000..2ffda2ea
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/information.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="information-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect8399" inkscape:connector-curvature="0" sodipodi:nodetypes="ssssscccccccccccc" style="fill:#010101;" d="M7.5,1
+ C6.7,1,6,1.7,6,2.5S6.7,4,7.5,4S9,3.3,9,2.5S8.3,1,7.5,1z M4,5v1c0,0,2,0,2,2v2c0,2-2,2-2,2v1h7v-1c0,0-2,0-2-2V6c0-0.5-0.5-1-1-1H4
+ z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/karaoke.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/karaoke.svg
new file mode 100644
index 00000000..7641f08e
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/karaoke.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>karaoke</title>
+ <g>
+ <path d="M12.1,2.952A2.988,2.988,0,0,0,6.99,4.917l3.142,3.142A2.988,2.988,0,0,0,12.1,2.952Z"/>
+ <path d="M4.672,8.255,2.55,10.377a1,1,0,0,0,0,1.414l.707.707a1,1,0,0,0,1.414,0l2.121-2.121L8.914,8.255,6.793,6.134Zm.741,2.087-.707-.707L6.793,7.548l.707.707Z"/>
+ </g>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/landmark.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/landmark.svg
new file mode 100644
index 00000000..4cf48cf2
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/landmark.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M12.5,12H12v-0.5c0-0.3-0.2-0.5-0.5-0.5H11V6h1l1-2c-1,0.1-2,0.1-3,0C9.2,3.4,8.6,2.8,8,2V1.5C8,1.2,7.8,1,7.5,1
+ S7,1.2,7,1.5V2C6.4,2.8,5.8,3.4,5,4C4,4.1,3,4.1,2,4l1,2h1v5c0,0-0.5,0-0.5,0C3.2,11,3,11.2,3,11.5V12H2.5C2.2,12,2,12.2,2,12.5V13
+ h11v-0.5C13,12.2,12.8,12,12.5,12z M7,11H5V6h2V11z M10,11H8V6h2V11z"/>
+<title>landmark</title>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/landuse.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/landuse.svg
new file mode 100644
index 00000000..a46b3fe1
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/landuse.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>landuse-15</title>
+ <path d="M8.911,3.854A.248.248,0,0,1,9,4.044V7.75A.25.25,0,0,1,8.75,8H6.25A.25.25,0,0,1,6,7.75V6H5V7.75A.25.25,0,0,1,4.75,8H2.25A.25.25,0,0,1,2,7.75v-3.7a.248.248,0,0,1,.089-.19L5.343,1.132a.245.245,0,0,1,.315,0ZM7.752,9.5a.248.248,0,0,0-.138.042L5,11.5H4v-2a.5.5,0,0,0-1,0v2H2v-2a.5.5,0,0,0-1,0v4.25a.25.25,0,0,0,.25.25h6.5A.25.25,0,0,0,8,13.75v-4A.248.248,0,0,0,7.752,9.5ZM14,6.245v6.5a.253.253,0,0,1-.253.253H10.253A.253.253,0,0,1,10,12.747V6.25A.249.249,0,0,1,10.25,6H11V5.249A.249.249,0,0,1,11.249,5h1.5A.253.253,0,0,1,13,5.253V6h.755A.245.245,0,0,1,14,6.245ZM13,11H11v1h2Zm0-2H11v1h2Zm0-2H11V8h2Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/laundry.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/laundry.svg
new file mode 100644
index 00000000..2a6810ee
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/laundry.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="laundry-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path3291-2" inkscape:connector-curvature="0" d="M8,1L6,3H3c0,0-1,0-1,1v9c0,1,1,1,1,1h9c0,0,1,0,1-1V2c0-1-1-1-1-1
+ S8,1,8,1z M8.5,2h2C10.777,2,11,2.223,11,2.5S10.777,3,10.5,3h-2C8.223,3,8,2.777,8,2.5S8.223,2,8.5,2z M7.5,6
+ c1.6569,0,3,1.3431,3,3s-1.3431,3-3,3s-3-1.3431-3-3S5.8431,6,7.5,6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/library.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/library.svg
new file mode 100644
index 00000000..8dd4084f
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/library.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M7.47,4.92C7.47,4.92,5.7,3,1,3v8c4.7,0,6.47,2,6.47,2S9.3,11,14,11V3C9.3,3,7.47,4.92,7.47,4.92z M13,10
+ c-1.9614,0.0492-3.8727,0.6299-5.53,1.68C5.836,10.6273,3.9432,10.0459,2,10V4c3.4,0.26,4.73,1.6,4.75,1.61l0.73,0.74L8.2,5.6
+ c0,0,1.4-1.34,4.8-1.6V10z M8,10.24l-0.1-0.17c1.3011-0.5931,2.6827-0.9907,4.1-1.18v0.2c-1.3839,0.1953-2.7316,0.5929-4,1.18V10.24
+ z M8,9.24L7.9,9.07C9.2016,8.4802,10.5832,8.086,12,7.9v0.2c-1.3844,0.1988-2.7321,0.5997-4,1.19V9.24z M8,8.24L7.9,8.07
+ C9.2015,7.48,10.5831,7.0857,12,6.9v0.2c-1.3845,0.1981-2.7323,0.599-4,1.19V8.24z M8,7.24L7.9,7.07
+ C9.2013,6.4794,10.583,6.0851,12,5.9v0.2c-1.3844,0.1986-2.7321,0.5996-4,1.19V7.24z M6.9,10.24C5.6639,9.6641,4.3499,9.2733,3,9.08
+ v-0.2c1.3872,0.2028,2.7358,0.6141,4,1.22L6.9,10.24z M6.9,9.24C5.6629,8.671,4.3488,8.2869,3,8.1V7.9
+ c1.386,0.2027,2.7341,0.6105,4,1.21L6.9,9.24z M6.9,8.24C5.6631,7.6705,4.3489,7.2863,3,7.1V6.9c1.3868,0.199,2.7354,0.607,4,1.21
+ L6.9,8.24z M6.9,7.24C5.6629,6.671,4.3488,6.2869,3,6.1V5.9c1.386,0.2024,2.7342,0.6102,4,1.21L6.9,7.24z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/lighthouse.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/lighthouse.svg
new file mode 100644
index 00000000..d3bedc95
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/lighthouse.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M4.5,6L0,7V6.5l4.5-1V6z M4.5,3.5L0,2.5V3l4.5,1V3.5z M10.5,3.5V4L15,3V2.5L10.5,3.5z M10.5,6L15,7V6.5l-4.5-1V6z M8,7V2
+ h2.5c0.2761,0.0552,0.5448-0.1239,0.6-0.4c0.0552-0.2761-0.1239-0.5448-0.4-0.6l-3-1C7.5696-0.0586,7.4204-0.0586,7.29,0l-3,1
+ c-0.2761,0.0552-0.4552,0.3239-0.4,0.6S4.2139,2.0552,4.49,2H7v5H5l-2,7h9l-2-7H8z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/lodging.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/lodging.svg
new file mode 100644
index 00000000..6feed37b
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/lodging.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="lodging-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect6507" style="fill:#010101;" d="M0.5,2.5C0.2,2.5,0,2.7,0,3v7.5v2C0,12.8,0.2,13,0.5,13S1,12.8,1,12.5V11h13v1.5
+ c0,0.3,0.2,0.5,0.5,0.5s0.5-0.2,0.5-0.5v-2c0-0.3-0.2-0.5-0.5-0.5H1V3C1,2.7,0.8,2.5,0.5,2.5z M3.5,3C2.7,3,2,3.7,2,4.5l0,0
+ C2,5.3,2.7,6,3.5,6l0,0C4.3,6,5,5.3,5,4.5l0,0C5,3.7,4.3,3,3.5,3L3.5,3z M7,4C5.5,4,5.5,5.5,5.5,5.5V7h-3C2.2,7,2,7.2,2,7.5v1
+ C2,8.8,2.2,9,2.5,9H6h9V6.5C15,4,12.5,4,12.5,4H7z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/logging.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/logging.svg
new file mode 100644
index 00000000..d6c3be82
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/logging.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>logging-15</title>
+ <path d="M13.91,3.41,13.5,3l.2-.28c.02-.03.04-.05.06-.08A.969.969,0,0,0,14,1.99a1,1,0,0,0-1.62-.77c-.03.02-.06.05-.09.07L12,1.5l-.386-.386a.354.354,0,0,0-.525.475l.417.417-.5.5-.392-.392a.354.354,0,0,0-.525.475L10.5,3l-.5.5-.381-.381a.354.354,0,1,0-.528.472h0l.028.028L9.5,4,9,4.5l-.395-.395a.354.354,0,0,0-.517.483L8.5,5,8,5.5l-.365-.365a.354.354,0,0,0-.556.439h0C7.1,5.6,7.508,6,7.508,6L7,6.5l-.394-.392a.392.392,0,0,0-.5-.028.384.384,0,0,0-.028.5L6.1,6.6l.4.4L6,7.5l-.4-.4a.37.37,0,0,0-.5,0L6.248,8.244,12.09,2.41,12.5,2H13v.5l-.41.41L6.751,8.749,7.9,9.9a.355.355,0,0,0,0-.5l-.008-.009L7.5,9,8,8.5l.384.384a.354.354,0,0,0,.528-.472L8.5,8,9,7.5l.38.38a.354.354,0,0,0,.528-.472l-.02-.02L9.5,7l.5-.5.377.377A.35.35,0,0,0,10.64,7a.347.347,0,0,0,.252-.6L10.5,6l.5-.5.38.38a.354.354,0,0,0,.528-.472L11.88,5.38,11.5,5l.5-.5.381.381a.354.354,0,0,0,.528-.472l-.025-.025L12.5,4l.5-.5.382.382a.354.354,0,0,0,.528-.472ZM4.39,7.916C3.893,7.419,3.641,7,3,7H1.5a.5.5,0,0,0-.5.5v3A2.19,2.19,0,0,0,1.5,12l.815.811A2.251,2.251,0,0,0,5.493,13h0L7.5,11ZM3.5,10,2.262,11.238A1.3,1.3,0,0,1,2,10.5V8H3a.545.545,0,0,1,.335.194.455.455,0,0,1,.165.418Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/marker-stroked.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/marker-stroked.svg
new file mode 100644
index 00000000..d4e732b5
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/marker-stroked.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>marker-stroked-15</title>
+ <path id="Layer_7" data-name="Layer 7" d="M7.5,14.941l-.4-.495c-.973-1.189-4.9-6.556-4.9-9.16A5.066,5.066,0,0,1,7.036,0q.222-.01.445,0a5.066,5.066,0,0,1,5.286,4.836q.01.225,0,.45c0,2.213-2.669,6.111-4.678,8.851ZM7.481.986a4.077,4.077,0,0,0-4.3,4.3c0,1.832,2.759,6.038,4.286,8.034,1.25-1.71,4.315-5.989,4.315-8.034a4.077,4.077,0,0,0-4.3-4.3Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/marker.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/marker.svg
new file mode 100644
index 00000000..1010dc87
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/marker.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="marker-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path4133" inkscape:connector-curvature="0" d="M7.5,0C5.0676,0,2.2297,1.4865,2.2297,5.2703
+ C2.2297,7.8378,6.2838,13.5135,7.5,15c1.0811-1.4865,5.2703-7.027,5.2703-9.7297C12.7703,1.4865,9.9324,0,7.5,0z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/mobile-phone.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/mobile-phone.svg
new file mode 100644
index 00000000..c06ab697
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/mobile-phone.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>mobile-phone-15</title>
+ <path d="M10,2h0V1.5a.5.5,0,0,0-1,0V2H5A1,1,0,0,0,4,3V13a1,1,0,0,0,1,1h5a1,1,0,0,0,1-1V3A1,1,0,0,0,10,2ZM6,13H5V12H6Zm0-2H5V10H6ZM6,9H5V8H6Zm2,4H7V12H8Zm0-2H7V10H8ZM8,9H7V8H8Zm2,4H9V12h1Zm0-2H9V10h1Zm0-2H9V8h1Zm0-2.5a.5.5,0,0,1-.5.5h-4A.5.5,0,0,1,5,6.5v-3A.5.5,0,0,1,5.5,3h4a.5.5,0,0,1,.5.5Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/monument.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/monument.svg
new file mode 100644
index 00000000..1af6353d
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/monument.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="monument-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path11719-7" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccc" d="M7.5,0L6,2.5v7h3v-7L7.5,0z M3,11.5
+ L3,15h9v-3.5L10.5,10h-6L3,11.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/mountain.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/mountain.svg
new file mode 100644
index 00000000..5f5e5c45
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/mountain.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="mountain-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path5571" inkscape:connector-curvature="0" sodipodi:nodetypes="sccssssccsccccccccc" d="M7.5,2C7.2,2,7.1,2.2,6.9,2.4
+ l-5.8,9.5C1,12,1,12.2,1,12.3C1,12.8,1.4,13,1.7,13h11.6c0.4,0,0.7-0.2,0.7-0.7c0-0.2,0-0.2-0.1-0.4L8.2,2.4C8,2.2,7.8,2,7.5,2z
+ M7.5,3.5L10.8,9H10L8.5,7.5L7.5,9l-1-1.5L5,9H4.1L7.5,3.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/museum.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/museum.svg
new file mode 100644
index 00000000..f087f1d1
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/museum.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="museum-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path7509" inkscape:connector-curvature="0" d="M7.5,0L1,3.4453V4h13V3.4453L7.5,0z M2,5v5l-1,1.5547V13h13v-1.4453L13,10
+ V5H2z M4.6152,6c0.169-0.0023,0.3318,0.0639,0.4512,0.1836L7.5,8.6172l2.4336-2.4336c0.2445-0.2437,0.6402-0.2432,0.884,0.0013
+ C10.9341,6.3017,10.9997,6.46,11,6.625v4.2422c0.0049,0.3452-0.271,0.629-0.6162,0.6338c-0.3452,0.0049-0.629-0.271-0.6338-0.6162
+ c-0.0001-0.0059-0.0001-0.0118,0-0.0177V8.1328L7.9414,9.9414c-0.244,0.2433-0.6388,0.2433-0.8828,0L5.25,8.1328v2.7344
+ c0.0049,0.3452-0.271,0.629-0.6162,0.6338C4.2887,11.5059,4.0049,11.2301,4,10.8849c-0.0001-0.0059-0.0001-0.0118,0-0.0177V6.625
+ C4,6.2836,4.2739,6.0054,4.6152,6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/music.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/music.svg
new file mode 100644
index 00000000..ebdba36a
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/music.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M13.5,1c-0.0804,0.0008-0.1594,0.0214-0.23,0.06L4.5,3.5C4.2239,3.5,4,3.7239,4,4v6.28C3.6971,10.1002,3.3522,10.0037,3,10
+ c-1.1046,0-2,0.8954-2,2s0.8954,2,2,2s2-0.8954,2-2V7.36l8-2.22v3.64c-0.3029-0.1798-0.6478-0.2763-1-0.28c-1.1046,0-2,0.8954-2,2
+ s0.8954,2,2,2s2-0.8954,2-2v-9C14,1.2239,13.7761,1,13.5,1z M13,4.14L5,6.36v-2l8-2.22C13,2.14,13,4.14,13,4.14z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/natural.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/natural.svg
new file mode 100644
index 00000000..4e177acb
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/natural.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>natural-15</title>
+ <path d="M8.753,6.278a.5.5,0,0,1-.51,0A4.109,4.109,0,0,1,6.5,3.5a2.779,2.779,0,0,0-.59-1.506l-.019-.027a.257.257,0,0,1-.056-.144.237.237,0,0,1,.25-.25.264.264,0,0,1,.057.011A3.523,3.523,0,0,1,7.5,2.5L8.28.94a.246.246,0,0,1,.44,0L9.5,2.5a3.4,3.4,0,0,1,1.339-.907.283.283,0,0,1,.1-.021c.175.009.212.119.221.249a.35.35,0,0,1-.043.141A5.2,5.2,0,0,0,10.5,3.5,4.113,4.113,0,0,1,8.753,6.278ZM5,8H6.289a.25.25,0,0,0,.25-.25.241.241,0,0,0-.061-.15L4.7,5.235a.255.255,0,0,0-.391,0L2.518,7.589a.274.274,0,0,0-.062.161.25.25,0,0,0,.25.25H4L1.335,10.6a.273.273,0,0,0-.058.152A.25.25,0,0,0,1.529,11H3L1.435,12.565a.255.255,0,0,0,.18.435H4v1H5V13H7.385a.255.255,0,0,0,.18-.435L6,11H7.471a.25.25,0,0,0,.25-.25.233.233,0,0,0-.058-.149Zm9.345,3.748a.252.252,0,0,1-.252.252H8.908a.252.252,0,0,1-.226-.365L11.27,6.451a.252.252,0,0,1,.451,0l2.6,5.184h0A.251.251,0,0,1,14.345,11.748ZM12.75,10,11.5,7.5,10.25,10Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/park-alt1.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/park-alt1.svg
new file mode 100644
index 00000000..c13adaee
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/park-alt1.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>park-alt1-15</title>
+ <path d="M9.428,10.429a.269.269,0,0,1-.074-.18A.25.25,0,0,1,9.6,10h1.447a.25.25,0,0,0,.25-.25.258.258,0,0,0-.079-.179L9.07,7.419a.3.3,0,0,1-.063-.17A.249.249,0,0,1,9.257,7H10.4a.251.251,0,0,0,.25-.251.247.247,0,0,0-.077-.178L8.432,4.434,8.418,4.42a.262.262,0,0,1-.066-.17A.25.25,0,0,1,8.6,4h.866a.25.25,0,0,0,.25-.25.246.246,0,0,0-.068-.164h.006L7.7,1.238a.253.253,0,0,0-.042-.044A.249.249,0,0,0,7.5,1.139h0a.249.249,0,0,0-.158.055.253.253,0,0,0-.042.044L5.352,3.586a.246.246,0,0,0-.068.164.25.25,0,0,0,.25.25H6.4a.241.241,0,0,1,.184.42l-.014.014L4.431,6.571a.247.247,0,0,0-.077.178A.251.251,0,0,0,4.6,7H5.745a.249.249,0,0,1,.25.249.3.3,0,0,1-.063.17L3.782,9.571A.258.258,0,0,0,3.7,9.75a.25.25,0,0,0,.25.25H5.4a.25.25,0,0,1,.248.249.269.269,0,0,1-.074.18l-2.14,2.132-.009.009a.248.248,0,0,0,0,.351A.256.256,0,0,0,3.605,13H7v1l1-.008V13h3.391a.263.263,0,0,0,.26-.254.248.248,0,0,0-.071-.177Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/park.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/park.svg
new file mode 100644
index 00000000..4f208cc9
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/park.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M14,5.75c0.0113-0.6863-0.3798-1.3159-1-1.61C12.9475,3.4906,12.4014,2.9926,11.75,3
+ c-0.0988,0.0079-0.1962,0.0281-0.29,0.06c-0.0607-0.66-0.6449-1.1458-1.3048-1.0851C9.8965,1.9987,9.6526,2.1058,9.46,2.28l0,0
+ c0-0.6904-0.5596-1.25-1.25-1.25S6.96,1.5896,6.96,2.28C6.96,2.28,7,2.3,7,2.33C6.4886,1.8913,5.7184,1.9503,5.2797,2.4618
+ C5.1316,2.6345,5.0347,2.8451,5,3.07C4.8417,3.0195,4.6761,2.9959,4.51,3C3.6816,2.9931,3.0044,3.659,2.9975,4.4874
+ C2.9958,4.6872,3.0341,4.8852,3.11,5.07C2.3175,5.2915,1.8546,6.1136,2.0761,6.9061C2.2163,7.4078,2.6083,7.7998,3.11,7.94
+ c0.2533,0.7829,1.0934,1.2123,1.8763,0.959C5.5216,8.7258,5.9137,8.2659,6,7.71C6.183,7.8691,6.4093,7.9701,6.65,8v5L5,14h5l-1.6-1
+ v-2c0.7381-0.8915,1.6915-1.5799,2.77-2c0.8012,0.1879,1.603-0.3092,1.7909-1.1103C12.9893,7.7686,13.0025,7.6444,13,7.52
+ c0.0029-0.0533,0.0029-0.1067,0-0.16C13.6202,7.0659,14.0113,6.4363,14,5.75z M8.4,10.26V6.82C8.6703,7.3007,9.1785,7.5987,9.73,7.6
+ h0.28c0.0156,0.4391,0.2242,0.849,0.57,1.12C9.7643,9.094,9.0251,9.6162,8.4,10.26z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/parking-garage.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/parking-garage.svg
new file mode 100644
index 00000000..d7c0b9a4
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/parking-garage.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path style="fill:#231F20;" d="M10.5,10.14c-0.6637,0.4788-1.4732,0.7121-2.29,0.66h-1.9V14h-1.9V5h3.92
+ c0.7801-0.0414,1.5484,0.2041,2.16,0.69c0.5779,0.5595,0.875,1.3483,0.81,2.15C11.4042,8.6892,11.1088,9.5388,10.5,10.14z M9,6.9
+ C8.711,6.6881,8.3579,6.5822,8,6.6H6.31v2.65H8c0.3612,0.0191,0.717-0.0947,1-0.32c0.2559-0.2675,0.3867-0.6308,0.36-1
+ C9.4072,7.5493,9.274,7.1684,9,6.9z M14.41,4.21c0.114-0.2486,0.007-0.5427-0.24-0.66L7.5,0.45l-6.71,3.1
+ C0.5387,3.666,0.429,3.9637,0.545,4.215C0.661,4.4663,0.9587,4.576,1.21,4.46l0,0L7.5,1.55l6.29,2.9
+ c0.2486,0.114,0.5427,0.007,0.66-0.24H14.41z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/parking.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/parking.svg
new file mode 100644
index 00000000..d4370e2e
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/parking.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M11.85,8.37c-0.9532,0.7086-2.1239,1.0623-3.31,1H5.79V14H3V1h5.72c1.1305-0.0605,2.244,0.2952,3.13,1
+ c0.8321,0.8147,1.2543,1.9601,1.15,3.12C13.1271,6.3214,12.7045,7.5159,11.85,8.37z M9.75,3.7C9.3254,3.3892,8.8052,3.237,8.28,3.27
+ H5.79v3.82h2.49c0.5315,0.0326,1.056-0.1351,1.47-0.47c0.3795-0.3947,0.5693-0.9346,0.52-1.48C10.324,4.606,10.1327,4.0763,9.75,3.7
+ z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/pharmacy.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/pharmacy.svg
new file mode 100644
index 00000000..2efd6fa0
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/pharmacy.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M9.5,4l1.07-1.54c0.0599,0.0046,0.1201,0.0046,0.18,0c0.6904-0.0004,1.2497-0.5603,1.2494-1.2506
+ C11.999,0.519,11.4391-0.0404,10.7487-0.04C10.0584-0.0396,9.499,0.5203,9.4994,1.2106c0,0.0131,0.0002,0.0262,0.0006,0.0394
+ c0,0,0,0.07,0,0.1L7,4H9.5z M12,6V5H3v1l1.5,3.5L3,13v1h9v-1l-1-3.5L12,6z M10,10H8v2H7v-2H5V9h2V7h1v2h2V10z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/picnic-site.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/picnic-site.svg
new file mode 100644
index 00000000..87b49bd6
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/picnic-site.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="picnic-site-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect4760" inkscape:connector-curvature="0" style="fill:#010101;" d="M4,3C3.446,3,3,3.446,3,4s0.446,1,1,1h1.2969
+ L4.6523,7H2.5c-0.554,0-1,0.446-1,1s0.446,1,1,1h1.5098L3.041,12.0098c-0.1284,0.3939,0.0868,0.8173,0.4807,0.9457
+ s0.8173-0.0868,0.9457-0.4807c0.0005-0.0013,0.0009-0.0027,0.0013-0.004L5.5859,9h3.8281l1.1172,3.4707
+ c0.1273,0.3943,0.5501,0.6107,0.9443,0.4834s0.6107-0.5501,0.4834-0.9443l0,0L10.9902,9H12.5c0.554,0,1-0.446,1-1s-0.446-1-1-1
+ h-2.1523L9.7031,5H11c0.554,0,1-0.446,1-1s-0.446-1-1-1H4z M6.873,5H8.127l0.6445,2h-2.543L6.873,5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/pitch.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/pitch.svg
new file mode 100644
index 00000000..2e2e3c9e
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/pitch.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M5,3C4.4477,3,4,2.5523,4,2s0.4477-1,1-1s1,0.4477,1,1S5.5523,3,5,3z M12.5,10H10L9,7L8,5.25L9,5l2.3,1l0,0
+ c0.2761,0.1105,0.5895-0.0239,0.7-0.3S11.9761,5.1105,11.7,5l0,0L9,4H7L5,5L4,6H2.5C2.2239,6,2,6.2239,2,6.5S2.2239,7,2.5,7H5l1-1
+ l1,2l-2,2v3.5C5,13.7761,5.2239,14,5.5,14S6,13.7761,6,13.5v-3.11L8,9l1,2h3.5c0.2761,0,0.5-0.2239,0.5-0.5S12.7761,10,12.5,10z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/place-of-worship.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/place-of-worship.svg
new file mode 100644
index 00000000..d77ce067
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/place-of-worship.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="place-of-worship-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path9064" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccssccsscccccssccss" d="M7.5,0l-2,2v2h4V2
+ L7.5,0z M5.5,4.5L4,6h7L9.5,4.5H5.5z M2,6.5c-0.5523,0-1,0.4477-1,1V13h2V7.5C3,6.9477,2.5523,6.5,2,6.5z M4,6.5V13h7V6.5H4z
+ M13,6.5c-0.5523,0-1,0.4477-1,1V13h2V7.5C14,6.9477,13.5523,6.5,13,6.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/playground.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/playground.svg
new file mode 100644
index 00000000..80d88662
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/playground.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M2,1.15c0.2091-0.8016,1.0284-1.2819,1.83-1.0729s1.2819,1.0284,1.0729,1.83C4.7026,2.6752,3.9386,3.1542,3.16,3
+ C2.3474,2.839,1.8191,2.0498,1.98,1.2371C1.9858,1.2079,1.9925,1.1788,2,1.15z M13,12.32c0.1032,0.5426-0.2531,1.066-0.7956,1.1692
+ c-0.0015,0.0003-0.0029,0.0006-0.0044,0.0008c-0.4252,0.086-0.8574-0.1119-1.07-0.49l0,0L9.45,9.63L8,9.92L7.78,10H7.72v2.15
+ L8.34,12h0.14c0.2871,0.0054,0.5155,0.2425,0.5101,0.5297C8.9862,12.7361,8.8606,12.9207,8.67,13l-5,1l0,0
+ c-0.0563,0.0095-0.1137,0.0095-0.17,0c-0.2872,0-0.52-0.2328-0.52-0.52c0-0.2099,0.1262-0.3993,0.32-0.48l0,0l4.15-0.83V10
+ l-3.22,0.58l0,0c-0.164,0.0423-0.336,0.0423-0.5,0c-0.3394-0.0867-0.6088-0.3446-0.71-0.68H3L2,5.83l0,0
+ C1.9688,5.6884,1.9688,5.5416,2,5.4c0.0936-0.387,0.4078-0.6815,0.8-0.75l0,0l4.7-0.52V0h0.22v4.1h0.06L8,4.08L8.4,4h0.21
+ c0.2673,0.0643,0.4326,0.3323,0.37,0.6C8.9361,4.835,8.729,5.0041,8.49,5L8,5.08H7.78H7.72v2.86h0.06L8,7.88l1.81-0.36l0,0l0,0
+ c0.4275-0.0352,0.8299,0.2062,1,0.6l0,0l2,3.94l0,0C12.887,12.1358,12.9511,12.2236,13,12.32z M7.5,5.13L5,5.4l0.74,2.94L7.5,8V5.13
+ z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/police.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/police.svg
new file mode 100644
index 00000000..be3c38f1
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/police.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="police-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect4718" d="M5.5,1L6,2h5l0.5-1H5.5z M6,2.5v1.25c0,0,0,2.75,2.5,2.75S11,3.75,11,3.75V2.5H6z M1.9844,3.9863
+ C1.4329,3.9949,0.9924,4.4485,1,5v4c-0.0001,0.6398,0.5922,1.1152,1.2168,0.9766L5,9.3574V14l5.8789-6.9297
+ C10.7391,7.0294,10.5947,7,10.4414,7H6.5L3,7.7539V5C3.0077,4.4362,2.5481,3.9775,1.9844,3.9863z M11.748,7.7109L6.4121,14H12
+ V8.5586C12,8.2451,11.9061,7.9548,11.748,7.7109z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/post.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/post.svg
new file mode 100644
index 00000000..27fd010e
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/post.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M14,6.5V12c0,0.5523-0.4477,1-1,1H2c-0.5523,0-1-0.4477-1-1V6.5C1,6.2239,1.2239,6,1.5,6
+ c0.0692-0.0152,0.1408-0.0152,0.21,0l0,0l5.79,4l5.8-4l0,0c0.066-0.0138,0.134-0.0138,0.2,0C13.7761,6,14,6.2239,14,6.5z M1.25,3.92
+ L1.25,3.92L1.33,4L7.5,8l6.19-4l0,0h0.06l0,0c0.1796-0.0981,0.2792-0.2975,0.25-0.5C14,3.2239,13.7761,3,13.5,3h-12
+ C1.2239,3,1,3.2239,1,3.5C1.0026,3.6745,1.0978,3.8345,1.25,3.92z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/prison.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/prison.svg
new file mode 100644
index 00000000..e680b48a
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/prison.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="prison-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect3607" d="M3.5,1v13H12V1H3.5z M9.5,2H11v3.5H9.5V2z M4.5,2.0547H6V7H4.5V2.0547z M7,2.0547h1.5V7H7V2.0547z M10.25,6.5
+ C10.6642,6.5,11,6.8358,11,7.25S10.6642,8,10.25,8l0,0C9.8358,8,9.5,7.6642,9.5,7.25l0,0C9.5,6.8358,9.8358,6.5,10.25,6.5z M7,8
+ h1.4727L8.5,13H7.0273L7,8z M4.5,8.166H6V13H4.5V8.166z M9.5,9H11v4H9.5V9z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/rail-light.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/rail-light.svg
new file mode 100644
index 00000000..6a67b193
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/rail-light.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="rail-light-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path14245" d="M5.5,0C5,0,5,0.5,5,0.5v1C5,1.777,5.223,2,5.5,2S6,1.777,6,1.5V1h1v2H6c0,0-2,0-2,2v3c0,3,3,3,3,3h1
+ c0,0,3,0,3-3V5c0-2-2-2-2-2H8V1h1v0.5C9,1.777,9.223,2,9.5,2S10,1.777,10,1.5v-1C10,0,9.5,0,9.5,0H5.5z M7.5,4l2.0449,0.7734L10,6.5
+ C10.1316,7,9.5,7,9.5,7h-4c0,0-0.6316,0-0.5-0.5l0.4551-1.7266L7.5,4z M7.5,8C7.7761,8,8,8.2239,8,8.5S7.7761,9,7.5,9
+ S7,8.7761,7,8.5S7.2239,8,7.5,8z M4.125,12L3,15h1.5l0.375-1h5.25l0.375,1H12l-1.125-3h-1.5l0.375,1h-4.5l0.375-1H4.125z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/rail-metro.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/rail-metro.svg
new file mode 100644
index 00000000..530da885
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/rail-metro.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="rail-metro-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path5258" d="M5.5,0c0,0-0.75,0-1,1L3,6.5V10c0,1,1,1,1,1h7c0,0,1,0,1-1V6.5L10.5,1c-0.2727-1-1-1-1-1H5.5z M6.5,1.5h2
+ c0,0,0.5357,0,0.75,1L10,6c0.2146,1.0017-1,1-1,1H6c0,0-1.2146,0.0017-1-1l0.75-3.5C5.9643,1.5,6.5,1.5,6.5,1.5z M5,8
+ c0.5523,0,1,0.4477,1,1s-0.4477,1-1,1S4,9.5523,4,9S4.4477,8,5,8z M6.75,8h1.5C8.3885,8,8.5,8.1115,8.5,8.25S8.3885,8.5,8.25,8.5
+ h-1.5C6.6115,8.5,6.5,8.3885,6.5,8.25S6.6115,8,6.75,8z M10,8c0.5523,0,1,0.4477,1,1s-0.4477,1-1,1S9,9.5523,9,9S9.4477,8,10,8z
+ M4.125,12L3,15h1.5l0.375-1h5.25l0.375,1H12l-1.125-3h-1.5l0.375,1h-4.5l0.375-1H4.125z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/rail.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/rail.svg
new file mode 100644
index 00000000..f57601e9
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/rail.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="15px"
+ height="15px"
+ viewBox="0 0 15 15"
+ style="enable-background:new 0 0 15 15;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="rail-15.svg"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs9" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1735"
+ inkscape:window-height="697"
+ id="namedview7"
+ showgrid="true"
+ inkscape:zoom="22.250293"
+ inkscape:cx="-0.89448384"
+ inkscape:cy="7.3284519"
+ inkscape:window-x="20"
+ inkscape:window-y="43"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="Layer_1"><inkscape:grid
+ type="xygrid"
+ id="grid3339" /></sodipodi:namedview><path
+ d="M 3 1 C 2.4477 1 2 1.4477 2 2 L 2 10 C 2 10.5523 2.4477 11 3 11 L 12 11 C 12.5523 11 13 10.5523 13 10 L 13 2 C 13 1.4477 12.5523 1 12 1 L 3 1 z M 5.75 1.5 L 5.7597656 1.5 L 9.2597656 1.5 C 9.3978656 1.5 9.5097656 1.6119 9.5097656 1.75 C 9.5097656 1.8881 9.3978656 2 9.2597656 2 L 5.75 2 C 5.6119 2 5.5 1.8881 5.5 1.75 C 5.5 1.6119 5.6119 1.5 5.75 1.5 z M 3.5 3 L 7 3 L 7 7 L 3.5 7 C 3.2239 7 3 6.7761 3 6.5 L 3 3.5 C 3 3.2239 3.2239 3 3.5 3 z M 8 3 L 11.5 3 C 11.7761 3 12 3.2239 12 3.5 L 12 6.5 C 12 6.7761 11.7761 7 11.5 7 L 8 7 L 8 3 z M 5 8 C 5.5523 8 6 8.4477 6 9 C 6 9.5523 5.5523 10 5 10 C 4.4477 10 4 9.5523 4 9 C 4 8.4477 4.4477 8 5 8 z M 10 8 C 10.5523 8 11 8.4477 11 9 C 11 9.5523 10.5523 10 10 10 C 9.4477 10 9 9.5523 9 9 C 9 8.4477 9.4477 8 10 8 z M 10.445312 11.994141 C 10.380597 11.999652 10.314981 12.018581 10.253906 12.050781 C 10.030606 12.168381 9.9302313 12.433922 10.019531 12.669922 L 10.189453 13 L 4.8105469 13 L 4.9394531 12.730469 C 5.0371531 12.472169 4.9067375 12.183637 4.6484375 12.085938 C 4.4124375 11.996738 4.1468969 12.097113 4.0292969 12.320312 L 3.0292969 14.320312 C 3.0080969 14.377912 2.9986 14.4387 3 14.5 C 3 14.7761 3.2239 15 3.5 15 C 3.6802 14.999 3.8450875 14.899434 3.9296875 14.740234 L 3.9296875 14.689453 L 4 14.689453 L 4.3105469 14 L 10.689453 14 L 11 14.689453 L 11 14.740234 C 11.0846 14.899434 11.249488 14.999 11.429688 15 C 11.705787 15 11.929688 14.7761 11.929688 14.5 C 11.949587 14.4212 11.949587 14.338566 11.929688 14.259766 L 10.929688 12.259766 C 10.833163 12.076541 10.639459 11.977608 10.445312 11.994141 z "
+ id="path3" /></svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/ranger-station.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/ranger-station.svg
new file mode 100644
index 00000000..ba17035b
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/ranger-station.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="ranger-station-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect4911" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccccccccc" d="M9,0.5l-2,1v3.7734L2,8v6h4v-4h3
+ v4h4V8L8,5.2734V4l1-0.5l2,1l2-1v-3l-2,1L9,0.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/recycling.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/recycling.svg
new file mode 100644
index 00000000..c48d3d22
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/recycling.svg
@@ -0,0 +1,10 @@
+<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>recycling-15</title>
+<path d="M2.4556,8.6134C2.118,9.2112,1.501,10.3021,2.593,11.0312c0.3432,0.2268,0.7275,0.3836,1.131,0.4614
+ C4.0314,11.5382,4.0466,12.0111,3.6855,12c-0.3849-0.0193-2.2596-0.1934-2.5606-1.5995c-0.1556-0.8213,0.0204-1.5571,0.504-2.3556
+ L2.3263,6.812L1.0196,6.0688L4.5,4v4L3.1941,7.3057L2.4556,8.6134z M6.7,2.034c1.155-0.628,1.823,0.43,2.191,1.007l0.8059,1.2631
+ L8.431,5.112L12,6.986L11.803,2.96l-1.2639,0.8066L9.779,2.578C9.2572,1.8321,8.875,1.2812,7.944,1.033
+ C6.307,0.7203,5.3007,2.6194,5.311,2.607c-0.1639,0.2871,0.2156,0.5399,0.451,0.21C6.0202,2.4969,6.339,2.2309,6.7,2.034z
+ M13.294,8.221c-0.0877-0.1897-0.5487-0.1413-0.419,0.267c0.1312,0.3892,0.1845,0.8003,0.157,1.21C12.939,11.01,11.684,11,11,11H9.5
+ V9.5l-3.5,2l3.488,2.025L9.4926,12H11c0.8906,0.0153,1.5999-0.1759,2.2-0.713C14.4,10.226,13.294,8.221,13.294,8.221z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/religious-christian.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/religious-christian.svg
new file mode 100644
index 00000000..1f9c7de8
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/religious-christian.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="religious-christian-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect3338" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccczccc" d="M6,0.9552V4H3v3h3v8h3V7h3V4H9V1
+ c0-1-0.9776-1-0.9776-1H6.9887C6.9887,0,6,0,6,0.9552z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/religious-jewish.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/religious-jewish.svg
new file mode 100644
index 00000000..01963d26
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/religious-jewish.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M15,12H9.78L7.5,15l-2.26-3H0l2.7-4L0,4h5.3l2.2-4l2.34,4H15l-2.56,4L15,12z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/religious-muslim.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/religious-muslim.svg
new file mode 100644
index 00000000..214578ba
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/religious-muslim.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="religious-muslim-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path7552-2-1" inkscape:connector-curvature="0" sodipodi:nodetypes="ssscssscsccccccccccc" d="M6.7941,0C3,0,0,3,0,6.7941
+ s3,6.7941,6.7941,6.7941c2.1176,0,4.4118-0.7059,5.6471-2.2941C11.6471,11.8235,10.1471,12.4412,9,12.4412
+ c-2.9118,0-5.1176-2.9118-5.1176-5.8235S6.0882,1.1471,9,1.1471c1.0588,0,2.5588,0.6176,3.4412,1.1471
+ C11.2059,0.7059,8.9118,0,6.7941,0z M11,3l-1,2.5H7L9.5,7l-1,3L11,8.5l2.5,1.5l-1-3L15,5.5h-3L11,3z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/residential-community.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/residential-community.svg
new file mode 100644
index 00000000..af5f8a2d
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/residential-community.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<title>buildings</title>
+<path d="M11.8,13.5V11c0.7-0.1,1.2-0.7,1.2-1.5S12.3,8,11.5,8S10,8.7,10,9.5c0,0.7,0.5,1.4,1.2,1.5v2.5H7V2H2v11.5H1V14h13v-0.5
+ H11.8z M6,11H3v-1h3V11z M6,9H3V8h3V9z M6,7H3V6h3V7z M6,5H3V4h3V5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/restaurant.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/restaurant.svg
new file mode 100644
index 00000000..e9af25bf
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/restaurant.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r" sodipodi:docname="restaurant-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path11774" d="M3.5,0l-1,5.5c-0.1464,0.805,1.7815,1.181,1.75,2L4,14c-0.0384,0.9993,1,1,1,1s1.0384-0.0007,1-1L5.75,7.5
+ c-0.0314-0.8176,1.7334-1.1808,1.75-2L6.5,0H6l0.25,4L5.5,4.5L5.25,0h-0.5L4.5,4.5L3.75,4L4,0H3.5z M12,0
+ c-0.7364,0-1.9642,0.6549-2.4551,1.6367C9.1358,2.3731,9,4.0182,9,5v2.5c0,0.8182,1.0909,1,1.5,1L10,14c-0.0905,0.9959,1,1,1,1
+ s1,0,1-1V0z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/roadblock.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/roadblock.svg
new file mode 100644
index 00000000..b6ac056c
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/roadblock.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="roadblock-24" d="M7.5,0C3.3579,0,0,3.3579,0,7.5S3.3579,15,7.5,15S15,11.6421,15,7.5S11.6421,0,7.5,0z M3,6h9v3H3V6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/rocket.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/rocket.svg
new file mode 100644
index 00000000..687829fd
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/rocket.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="rocket-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path7143" inkscape:connector-curvature="0" d="M12.5547,1c-2.1441,0-5.0211,1.471-6.9531,4H4
+ C2.8427,5,2.1794,5.8638,1.7227,6.7773L1.1113,8h1.4434H4l1.5,1.5L7,11v1.4453v1.4434l1.2227-0.6113
+ C9.1362,12.8206,10,12.1573,10,11V9.3984c2.529-1.932,4-4.809,4-6.9531V1H12.5547z M10,4c0.5523,0,1,0.4477,1,1l0,0
+ c0,0.5523-0.4477,1-1,1l0,0C9.4477,6,9,5.5523,9,5v0C9,4.4477,9.4477,4,10,4L10,4z M3.5,10L3,10.5C2.2778,11.2222,2,13,2,13
+ s1.698-0.198,2.5-1L5,11.5L3.5,10z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/school.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/school.svg
new file mode 100644
index 00000000..c2fba7c6
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/school.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M11,13v-1h2v-1H9.5v-1H13V9h-2V8h2V7h-2V6h2V5H9.5V4H13V3h-2V2h2V1H8v13h5v-1H11z M6,11H2V1h4V11z M6,12l-2,2l-2-2H6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/scooter.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/scooter.svg
new file mode 100644
index 00000000..1282927e
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/scooter.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>scooter-15</title>
+ <path d="M4.908,12a1.5,1.5,0,1,1-2.816,0Zm8.65-6C13.539,6,13,6,13,6V3h.351a.282.282,0,0,0,.223-.148l.268-.536a.334.334,0,0,0,.009-.066A.25.25,0,0,0,13.6,2H13V1.7a.215.215,0,0,0-.2-.2H9.25a.25.25,0,0,0,0,.5H12V6.6L7.6,10H6V7.5A.5.5,0,0,0,5.5,7H5V5H6.75a.25.25,0,0,0,0-.5L2.266,4.034c-.006,0-.01-.007-.016-.007a.25.25,0,0,0-.25.25V4.75A.25.25,0,0,0,2.25,5H3V7H2.5A1.538,1.538,0,0,0,1,8.5v2a.472.472,0,0,0,.442.5C1.461,11,7.5,11,7.5,11L10,10h3.5a.472.472,0,0,0,.5-.442C14,9.539,14,6.5,14,6.5A.472.472,0,0,0,13.558,6ZM12.5,11A1.5,1.5,0,1,0,14,12.5,1.538,1.538,0,0,0,12.5,11Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/shelter.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/shelter.svg
new file mode 100644
index 00000000..8402fc49
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/shelter.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M4,7v5h9.5v2H2l0,0l0,0V7.78L1,8.16V6l13-5v2.14L4,7z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/shop.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/shop.svg
new file mode 100644
index 00000000..321bf468
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/shop.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M13.33,6H11.5l-0.39-2.33c-0.1601-0.7182-0.7017-1.2905-1.41-1.49C9.3507,2.0676,8.9869,2.007,8.62,2H6.38
+ C6.0131,2.007,5.6493,2.0676,5.3,2.18C4.5917,2.3795,4.0501,2.9518,3.89,3.67L3.5,6H1.67C1.3939,5.9983,1.1687,6.2208,1.167,6.497
+ C1.1667,6.5489,1.1744,6.6005,1.19,6.65l1.88,6.3l0,0C3.2664,13.5746,3.8453,13.9996,4.5,14h6c0.651-0.0047,1.2247-0.4289,1.42-1.05
+ l0,0l1.88-6.3c0.0829-0.2634-0.0635-0.5441-0.3269-0.627C13.4268,6.0084,13.3786,6.0007,13.33,6z M4.52,6l0.36-2.17
+ c0.0807-0.3625,0.3736-0.6395,0.74-0.7C5.8663,3.0524,6.1219,3.0087,6.38,3h2.24c0.2614,0.0078,0.5205,0.0515,0.77,0.13
+ c0.3664,0.0605,0.6593,0.3375,0.74,0.7L10.48,6h-6H4.52z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/skiing.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/skiing.svg
new file mode 100644
index 00000000..d34597fb
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/skiing.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M15,4.5C15,5.3284,14.3284,6,13.5,6S12,5.3284,12,4.5S12.6716,3,13.5,3S15,3.6716,15,4.5z M13.72,11.89
+ c-0.0623-0.1197-0.2083-0.1684-0.33-0.11c-0.6846,0.4194-1.5208,0.5111-2.28,0.25L4.78,8.86L7.5,7.5v-3L9,5.25v3L10.5,9L12,8.25
+ L10.5,7.5V3l-3-1.5L6,2.25v4.5L3.28,8.11L0.61,6.78C0.4857,6.7192,0.3358,6.7707,0.275,6.895C0.2142,7.0193,0.2657,7.1692,0.39,7.23
+ l10.5,5.25c0.3156,0.135,0.6568,0.1998,1,0.19c0.5998-0.0103,1.1889-0.161,1.72-0.44c0.1236-0.0615,0.174-0.2116,0.1125-0.3352
+ C13.7217,11.8932,13.7208,11.8916,13.72,11.89z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/slaughterhouse.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/slaughterhouse.svg
new file mode 100644
index 00000000..f5679853
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/slaughterhouse.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>slaughterhouse-15-01</title>
+ <path d="M15,8.1c0,1.376-1.363.694-1.363.694L12.5,9H11a5.309,5.309,0,0,1-1.5,2,3.272,3.272,0,0,1-.523,1.125c-.077.091-.061.2-.068.33L9,14.755a.264.264,0,0,1-.266.25A.242.242,0,0,1,8.5,14.8L8,11.5H4v3.253A.247.247,0,0,1,3.753,15h0a.25.25,0,0,1-.241-.2L3,12v-.5a8.2,8.2,0,0,1-1.426-.1A1.886,1.886,0,0,1,.9,12.826c-.128.083-.148.211-.133.386,0,0,.19,1.532.19,1.538a.25.25,0,0,1-.25.25.238.238,0,0,1-.23-.174l-.427-1.7a.35.35,0,0,1,.055-.3c.437-.68-.049-2.55-.049-2.55A1.354,1.354,0,0,1,0,9.922V7.5A2.027,2.027,0,0,1,2.736,5.586s.1.03.142.049a15.15,15.15,0,0,0,3.814.038l.179-.062a1.842,1.842,0,0,1,1.26,0,.972.972,0,0,1,.227.089,1.994,1.994,0,0,1,.287.171A1.8,1.8,0,0,0,9.5,6h1V5l.5.5c.5-1.5,2.5-1,2.5-1a1.687,1.687,0,0,0-1.5,1l2.5,2a.613.613,0,0,1,.186-.069A.318.318,0,0,1,15,7.752V8.1Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/snowmobile.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/snowmobile.svg
new file mode 100644
index 00000000..428bd0c8
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/snowmobile.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>snowmobile-15</title>
+ <path d="M15,11a1,1,0,0,1-1,1l0,0v0H9.4142a1,1,0,0,1-.7071-.2929L7.146,10.146A.4984.4984,0,0,0,6.7935,10H3.3343a1.0023,1.0023,0,0,1-.6015-.2006L1.3857,8.7888A1.0134,1.0134,0,0,1,1,8a.9953.9953,0,0,1,.4719-.8444L5,5,6.0385,3.3076h0A.5.5,0,0,1,7,3.5V7L8,8H9l5.4115-.9922a.5.5,0,0,1,.3555.915L13,9l1.6313,1.2243A.99.99,0,0,1,15,11ZM5.5,11H3.2247a3.0035,3.0035,0,0,1-1.44-.3679L.74,10.0612a.5.5,0,0,0-.48.8775l1.2687.6934A3.0032,3.0032,0,0,0,2.969,12H5.5a.5.5,0,0,0,0-1Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/soccer.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/soccer.svg
new file mode 100644
index 00000000..374a2a05
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/soccer.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M11,1.5C11,2.3284,10.3284,3,9.5,3S8,2.3284,8,1.5S8.6716,0,9.5,0S11,0.6716,11,1.5z M11,11c-0.5523,0-1,0.4477-1,1
+ s0.4477,1,1,1s1-0.4477,1-1S11.5523,11,11,11z M12.84,6.09l-1.91-1.91l0,0C10.8399,4.0675,10.7041,4.0014,10.56,4H3.5
+ C3.2239,4,3,4.2239,3,4.5S3.2239,5,3.5,5h2.7L3,11.3l0,0c-0.0138,0.066-0.0138,0.134,0,0.2c-0.058,0.2761,0.1189,0.547,0.395,0.605
+ C3.6711,12.163,3.942,11.9861,4,11.71l0,0L5,10h2l-1.93,4.24l0,0C5.0228,14.3184,4.9986,14.4085,5,14.5
+ c-0.0552,0.2761,0.1239,0.5448,0.4,0.6c0.2761,0.0552,0.5448-0.1239,0.6-0.4l0,0l4.7-9.38l1.44,1.48
+ c0.211,0.1782,0.5264,0.1516,0.7046-0.0593C13.0037,6.5523,13.0018,6.2761,12.84,6.09z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/square-stroked.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/square-stroked.svg
new file mode 100644
index 00000000..bcc7119d
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/square-stroked.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M12.7,2.3v10.4H2.3V2.3H12.7 M13,1H2C1.4477,1,1,1.4477,1,2v11c0,0.5523,0.4477,1,1,1h11c0.5523,0,1-0.4477,1-1V2
+ C14,1.4477,13.5523,1,13,1L13,1z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/square.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/square.svg
new file mode 100644
index 00000000..f1bddb22
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/square.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M13,14H2c-0.5523,0-1-0.4477-1-1V2c0-0.5523,0.4477-1,1-1h11c0.5523,0,1,0.4477,1,1v11C14,13.5523,13.5523,14,13,14z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/stadium.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/stadium.svg
new file mode 100644
index 00000000..a57cc539
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/stadium.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="stadium-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path4177" d="M7,1v2v1.5v0.5098C4.1695,5.1037,2.0021,5.9665,2,7v4.5c0,1.1046,2.4624,2,5.5,2s5.5-0.8954,5.5-2V7
+ c-0.0021-1.0335-2.1695-1.8963-5-1.9902V4.0625L11,2.75L7,1z M3,8.1465c0.5148,0.2671,1.2014,0.4843,2,0.6328v2.9668
+ C3.7948,11.477,3,11.0199,3,10.5V8.1465z M12,8.1484V10.5c0,0.5199-0.7948,0.977-2,1.2461V8.7812
+ C10.7986,8.6328,11.4852,8.4155,12,8.1484z M6,8.9219C6.4877,8.973,6.9925,8.9992,7.5,9C8.0073,8.9999,8.5121,8.9743,9,8.9238
+ v2.9844C8.5287,11.964,8.0288,12,7.5,12S6.4713,11.964,6,11.9082V8.9219z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/star-stroked.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/star-stroked.svg
new file mode 100644
index 00000000..f7847a69
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/star-stroked.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path4749-2-8-2" style="fill:#010101;" d="M7.5,3.19l1.07,2.68L8.82,6.5h3l-2,1.75l-0.5,0.44l0.23,0.63l1,3.13l-2.48-1.77
+ l-0.57-0.4l-0.57,0.4l-2.52,1.77l1-3.13l0.21-0.63l-0.5-0.44l-2-1.75h3l0.25-0.63L7.5,3.19 M7.5,0.5l-2,5h-5l4,3.5l-2,6l5-3.5l5,3.5
+ l-2-6l4-3.5h-5L7.5,0.5L7.5,0.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/star.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/star.svg
new file mode 100644
index 00000000..8732de80
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/star.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="star-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path4749-2-8-2" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccc" d="M7.5,0l-2,5h-5l4,3.5l-2,6l5-3.5
+ l5,3.5l-2-6l4-3.5h-5L7.5,0z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/suitcase.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/suitcase.svg
new file mode 100644
index 00000000..c55d73cf
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/suitcase.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="suitcase-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path17" inkscape:connector-curvature="0" sodipodi:nodetypes="csccsccssccssccccccc" d="M11,4V2c0-1-1-1-1-1H5.0497
+ c0,0-1.1039,0.0015-1.0497,1v2H2c0,0-1,0-1,1v7c0,1,1,1,1,1h11c0,0,1,0,1-1V5c0-1-1-1-1-1H11z M5.5,2.5h4V4h-4V2.5z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/sushi.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/sushi.svg
new file mode 100644
index 00000000..a99b5281
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/sushi.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="sushi-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path4999" d="M5.5,3C5.2239,3,5,3.2239,5,3.5H2.75C1.2265,3.5,0,4.7265,0,6.25c0,0.8274,0.3687,1.5592,0.9434,2.0625
+ C0.3803,8.6675,0,9.2893,0,10c0,1.0994,0.9006,2,2,2h3.5h2H10c1.0994,0,2-0.9006,2-2c0-0.4883-0.1863-0.9294-0.4805-1.2773
+ l2.1777,0.9629c0.3716,0.1831,0.8213,0.0303,1.0044-0.3413c0.1831-0.3716,0.0303-0.8213-0.3413-1.0044
+ c-0.0188-0.0093-0.038-0.0178-0.0576-0.0254l-1.8105-0.8027l1.6309-0.2715c0.4099-0.0599,0.6936-0.4408,0.6337-0.8507
+ c-0.0544-0.3724-0.3765-0.6469-0.7528-0.6415c-0.0426,0.0003-0.085,0.0042-0.127,0.0117l-2.1309,0.3555
+ C11.2595,4.9521,10.0387,3.7837,8,3.5488V3.5C8,3.2239,7.7761,3,7.5,3H5.5z M6,4h1v5v2H6V9V4z M9.5,8
+ c0.259,0,0.4638,0.1974,0.4902,0.4492l0.0762-0.1328c0.1385-0.2399,0.4437-0.3201,0.6836-0.1816s0.3201,0.4418,0.1816,0.6816
+ l-0.2578,0.4473C10.8727,9.445,11,9.7021,11,10c0,0.5626-0.4374,1-1,1H8V9h1V8.5C9,8.223,9.223,8,9.5,8z M2.4395,8.0703
+ c0.1934-0.0242,0.3903,0.0662,0.4941,0.2461l0.2012,0.3477C3.226,8.5647,3.3538,8.5,3.5,8.5C3.777,8.5,4,8.723,4,9h1v2H2
+ c-0.5626,0-1-0.4374-1-1s0.4374-1,1-1h0.1738L2.0684,8.8164C1.9299,8.5765,2.0101,8.2733,2.25,8.1348
+ C2.31,8.1001,2.375,8.0784,2.4395,8.0703z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/swimming.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/swimming.svg
new file mode 100644
index 00000000..7227a4d8
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/swimming.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="swimming-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path16388" inkscape:connector-curvature="0" d="M10.1113,2C9.9989,2,9.6758,2.1465,9.6758,2.1465L6.3535,3.8262
+ C5.9111,4.0024,5.7358,4.7081,6.002,5.0605l0.9707,1.4082L3.002,8.498L5,9.998l2.502-1.5l2.5,1.5l1.002-1.002l-3-4l2.5566-1.5293
+ c0.5286-0.2662,0.4434-0.7045,0.4434-0.9707C10.9999,2.2861,10.6437,2,10.1113,2z M12.252,5C11.2847,5,10.5,5.7827,10.5,6.75
+ s0.7847,1.752,1.752,1.752s1.75-0.7847,1.75-1.752S13.2192,5,12.252,5z M2.5,10L0,11.5V13l2.5-1.5L5,13l2.502-1.5l2.5,1.5L12,11.5
+ l3,1.5v-1.5L12,10l-1.998,1.5l-2.5-1.5L5,11.5L2.5,10z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/teahouse.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/teahouse.svg
new file mode 100644
index 00000000..974ab1a5
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/teahouse.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M11,7c-0.2,1.4-0.5,2.7-1,4c-0.3,0.4-0.6,0.7-1,1v2H6v-2c-0.4-0.3-0.7-0.6-1-1C4.5,9.7,4.2,8.4,4,7H11z M8.1,5.7
+ c1.2-0.3,1.7-0.3,1.8-1.5c0-0.6-0.4-0.8-1.5-1.4C7.5,2.4,7.1,1.8,7.2,1C6.8,1.9,7,3,8,3.5C10,4.5,8.1,5.7,8.1,5.7z M5.8,6
+ c0.7-0.2,1.1-0.2,1.1-0.9c0-0.4-0.3-0.5-0.9-0.9C5.4,4,5.1,3.5,5.2,3C4.9,3.6,5.1,4.3,5.7,4.6C6.9,5.2,5.8,6,5.8,6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/telephone.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/telephone.svg
new file mode 100644
index 00000000..a7dcf2fc
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/telephone.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>telephone-15</title>
+ <path d="M4.51,8.88a0.51,0.51,0,0,0,0,.72l0.72,0.72L3.07,12.5,2.7,12.13A2.24,2.24,0,0,1,2,10.69V9.24a2.24,2.24,0,0,1,.7-1.45L7.77,2.72A2.24,2.24,0,0,1,9.22,2h1.45a2.24,2.24,0,0,1,1.45.72l0.36,0.36L10.31,5.26,9.58,4.53a0.51,0.51,0,0,0-.72,0ZM4.13,13.6a1,1,0,0,0,1.4137.0363Q5.5623,13.6186,5.58,13.6l0.72-.72a1,1,0,0,0,.0363-1.4137Q6.3186,11.4477,6.3,11.43Zm7.25-7.28a1,1,0,0,0,1.4137.0363C12.8061,6.3445,13.55,5.6,13.55,5.6a1,1,0,0,0,.0363-1.4137Q13.5686,4.1677,13.55,4.15Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/tennis.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/tennis.svg
new file mode 100644
index 00000000..0217e2a9
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/tennis.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M8,4.5C8,5.3284,7.3284,6,6.5,6S5,5.3284,5,4.5S5.6716,3,6.5,3S8,3.6716,8,4.5z M14.38,5.05L14.38,5.05l-1.57-1.59
+ c0.3629-0.7766,0.1576-1.7002-0.5-2.25c-0.4027-0.4248-0.9552-0.6759-1.54-0.7c-0.338-0.0102-0.6659,0.1159-0.91,0.35
+ c-0.5576,0.7788-0.4034,1.8585,0.35,2.45c0.4027,0.4248,0.9552,0.6759,1.54,0.7c0.2452-0.0035,0.4844-0.0763,0.69-0.21L14,5.39l0,0
+ c0.0399,0.0733,0.1165,0.1193,0.2,0.12c0.1381,0,0.25-0.1119,0.25-0.25C14.4623,5.1828,14.4361,5.1044,14.38,5.05z M12.31,3.3
+ c-0.1524,0.139-0.3541,0.211-0.56,0.2c-0.4422-0.0125-0.8635-0.191-1.18-0.5c-0.5432-0.406-0.694-1.1556-0.35-1.74
+ c0.1406-0.1575,0.339-0.2513,0.55-0.26c0.4682,0.0155,0.9109,0.2171,1.23,0.56C12.5295,1.9775,12.6627,2.7253,12.31,3.3z
+ M12.85,5.64c-0.1945-0.1961-0.511-0.1974-0.7071-0.0029C12.1419,5.6381,12.141,5.639,12.14,5.64L10.79,7h-4.9
+ C5.6621,7.0025,5.4647,7.1587,5.41,7.38l-0.79,3.11l0,0L3.9,13.36c-0.0863,0.2594,0.0518,0.5401,0.31,0.63h0.16
+ c0.2131-0.0016,0.4018-0.1381,0.47-0.34l0.8-3.19H7v3c0,0.2761,0.2239,0.5,0.5,0.5S8,13.7361,8,13.46v-3L9,8h2.21l1.65-1.65
+ c0.1878-0.1971,0.1834-0.5083-0.01-0.7V5.64z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/theatre.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/theatre.svg
new file mode 100644
index 00000000..3cf857a0
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/theatre.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="theatre-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path6342-3" d="M2,1c0,0-1,0-1,1v5.1582C1,8.8885,1.354,11,4.5,11H5V8L2.5,9c0,0,0-2.5,2.5-2.5V5
+ c0-0.7078,0.0868-1.3209,0.5-1.7754C5.8815,2.805,6.5046,1.9674,8.1562,2.7539L9,3.3027V2c0,0,0-1-1-1C7.2922,1,6.0224,2,5,2
+ S2.7865,1,2,1z M3,3c0.5523,0,1,0.4477,1,1S3.5523,5,3,5S2,4.5523,2,4S2.4477,3,3,3z M7,4c0,0-1,0-1,1v5c0,2,1,4,4,4s4-2,4-4V5
+ c0-1-1-1-1-1c-0.7078,0-1.9776,1-3,1S7.7865,4,7,4z M8,6c0.5523,0,1,0.4477,1,1S8.5523,8,8,8S7,7.5523,7,7S7.4477,6,8,6z M12,6
+ c0.5523,0,1,0.4477,1,1s-0.4477,1-1,1s-1-0.4477-1-1S11.4477,6,12,6z M7.5,10H10h2.5c0,0,0,2.5-2.5,2.5S7.5,10,7.5,10z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/toilet.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/toilet.svg
new file mode 100644
index 00000000..b7f306b5
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/toilet.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M4.5,3C3.6716,3,3,2.3284,3,1.5S3.6716,0,4.5,0S6,0.6716,6,1.5S5.3284,3,4.5,3z M14,1.5C14,0.6716,13.3284,0,12.5,0
+ S11,0.6716,11,1.5S11.6716,3,12.5,3S14,2.3284,14,1.5z M8.86,6.64L8.86,6.64L6.38,4.15l0,0C6.2798,4.0492,6.142,3.9949,6,4H3
+ C2.8697,4.0003,2.7445,4.0503,2.65,4.14l0,0L0.14,6.63c-0.2261,0.177-0.2659,0.5039-0.0889,0.73s0.5039,0.2659,0.73,0.0889
+ C0.8142,7.423,0.8441,7.3931,0.87,7.36L3,5.2L1,11h2v3.33c-0.0075,0.0497-0.0075,0.1003,0,0.15
+ c0.0555,0.2761,0.3244,0.455,0.6005,0.3995C3.802,14.839,3.9595,14.6815,4,14.48l0,0V11h1v3.5l0,0
+ c0.0555,0.2761,0.3244,0.455,0.6005,0.3995C5.802,14.859,5.9595,14.7015,6,14.5c0.0075-0.0497,0.0075-0.1003,0-0.15V11h2L6,5.2
+ l2.14,2.16l0,0c0.0967,0.1081,0.2349,0.17,0.38,0.17C8.7954,7.5088,9.0061,7.2761,9,7C9.0023,6.8663,8.9521,6.737,8.86,6.64z
+ M14.5,4h-4C10.2239,4,10,4.2239,10,4.5v5c0,0.2761,0.2239,0.5,0.5,0.5S11,9.7761,11,9.5v5c0,0.2761,0.2239,0.5,0.5,0.5
+ s0.5-0.2239,0.5-0.5v-5h1v5c0,0.2761,0.2239,0.5,0.5,0.5s0.5-0.2239,0.5-0.5v-5c0,0.2761,0.2239,0.5,0.5,0.5S15,9.7761,15,9.5v-5
+ C15,4.2239,14.7761,4,14.5,4z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/town-hall.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/town-hall.svg
new file mode 100644
index 00000000..697b1780
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/town-hall.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="town-hall-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path7509" d="M7.5,0L1,3.4453V4h13V3.4453L7.5,0z M2,5v5l-1,1.5547V13h13v-1.4453L13,10V5H2z M4,6h1v5.5H4V6z M7,6h1v5.5H7
+ V6z M10,6h1v5.5h-1V6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/town.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/town.svg
new file mode 100644
index 00000000..ff8cb995
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/town.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>town-15</title>
+ <path d="M10.651,7.121a.251.251,0,0,0-.314,0L8.092,8.929A.247.247,0,0,0,8,9.122v4.625A.253.253,0,0,0,8.253,14H9.747A.253.253,0,0,0,10,13.747h0V12h1v1.747a.253.253,0,0,0,.253.253h1.494A.253.253,0,0,0,13,13.747h0V9.12a.25.25,0,0,0-.094-.2ZM10,11H9V10h1Zm2,0H11V10h1ZM5.71,1.815a.252.252,0,0,0-.42,0L2.042,5.936A.252.252,0,0,0,2,6.076v7.671A.252.252,0,0,0,2.251,14h2.5A.252.252,0,0,0,5,13.748V12H6v1.748A.252.252,0,0,0,6.252,14H7V8a.5.5,0,0,1,.188-.391L9,6C9,5.95,5.71,1.815,5.71,1.815ZM4,10H3V9H4ZM4,7H3V6H4Zm2,3H5V9H6ZM6,7H5V6H6Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/triangle-stroked.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/triangle-stroked.svg
new file mode 100644
index 00000000..c87ff1d2
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/triangle-stroked.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="triangle-stroked-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect3338" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccc" d="M7.5243,1.5004
+ C7.2429,1.4913,6.9787,1.6423,6.8336,1.8952l-5.5,9.8692C1.0218,12.3078,1.395,12.9999,2,13h11
+ c0.605-0.0001,0.9782-0.6922,0.6664-1.2355l-5.5-9.8692C8.0302,1.6579,7.7884,1.5092,7.5243,1.5004z M7.5,3.8993l4.1267,7.4704
+ H3.3733L7.5,3.8993z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/triangle.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/triangle.svg
new file mode 100644
index 00000000..75ffea85
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/triangle.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="triangle-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path21090-9" inkscape:connector-curvature="0" sodipodi:nodetypes="sscsssscss" d="M7.5385,2
+ C7.2437,2,7.0502,2.1772,6.9231,2.3846l-5.8462,9.5385C1,12,1,12.1538,1,12.3077C1,12.8462,1.3846,13,1.6923,13h11.6154
+ C13.6923,13,14,12.8462,14,12.3077c0-0.1538,0-0.2308-0.0769-0.3846L8.1538,2.3846C8.028,2.1765,7.7882,2,7.5385,2z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/veterinary.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/veterinary.svg
new file mode 100644
index 00000000..1a34459f
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/veterinary.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path3340" d="M7.5,6c-2.5,0-3,2.28-3,3.47l0,0c-0.6097,0.2059-1.1834,0.5062-1.7,0.89
+ c-0.871,0.6614-1.0492,1.8998-0.4,2.78c0.6799,0.8542,1.9081,1.0297,2.8,0.4c0.6779-0.4601,1.4808-0.701,2.3-0.69
+ c0.8192-0.011,1.6221,0.2299,2.3,0.69c0.8575,0.6854,2.1072,0.5515,2.8-0.3c0.6888-0.8134,0.5878-2.0313-0.2256-2.7201
+ c-0.0243-0.0206-0.0491-0.0406-0.0744-0.0599l-0.1-0.1c-0.5333-0.3564-1.1032-0.6548-1.7-0.89l0,0C10.5,8.29,10,6,7.5,6z"/>
+<path id="ellipse4153" d="M2.08,4.3c-0.7348,0.3676-1.0652,1.2371-0.76,2c0.064,0.8282,0.7809,1.4517,1.61,1.4
+ c0.7348-0.3676,1.0652-1.2371,0.76-2C3.626,4.8718,2.9091,4.2483,2.08,4.3z"/>
+<path id="ellipse4163" d="M12.93,4.3c0.7348,0.3676,1.0653,1.2371,0.76,2c-0.064,0.8282-0.7809,1.4517-1.61,1.4
+ c-0.7348-0.3676-1.0653-1.2371-0.76-2C11.384,4.8718,12.1009,4.2483,12.93,4.3z"/>
+<path id="ellipse4165" d="M5.08,1.3c-0.68,0.09-1,0.94-0.76,1.87C4.4301,3.9951,5.1003,4.6321,5.93,4.7c0.68-0.09,1-0.94,0.76-1.87
+ C6.5799,2.0049,5.9097,1.3679,5.08,1.3z"/>
+<path id="ellipse4167" d="M9.93,1.3c0.68,0.09,1,0.94,0.76,1.87C10.5791,3.9986,9.9036,4.6365,9.07,4.7c-0.68-0.08-1-0.94-0.76-1.87
+ C8.4209,2.0014,9.0964,1.3634,9.93,1.3z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/village.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/village.svg
new file mode 100644
index 00000000..b06d0f03
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/village.svg
@@ -0,0 +1,4 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 15 15">
+ <title>village-15</title>
+ <path d="M6.176,4.176a.249.249,0,0,0-.352,0l-4.4,4.4A.25.25,0,0,0,1.6,9H3v4.751A.249.249,0,0,0,3.249,14h3.5A.249.249,0,0,0,7,13.753H7V8.323a.249.249,0,0,1,.073-.176L8.5,6.5ZM6,12H5V11H6Zm0-2H5V9H6Zm6.75-4h-.5a.25.25,0,0,0-.25.25V8L10.676,6.176a.249.249,0,0,0-.352,0L8.056,8.932A.246.246,0,0,0,8,9.088v4.66A.249.249,0,0,0,8.246,14h1.5A.253.253,0,0,0,10,13.748h0V12h1v1.747a.253.253,0,0,0,.253.253h1.5A.25.25,0,0,0,13,13.751V6.25A.25.25,0,0,0,12.75,6ZM10,11H9V10h1Zm2,0H11V10h1Z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/volcano.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/volcano.svg
new file mode 100644
index 00000000..e196f696
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/volcano.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91 r13725" sodipodi:docname="volcano-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path6447" inkscape:connector-curvature="0" style="fill:#010101;" d="M8.4844,1.0002
+ c-0.1464,0.005-0.2835,0.0731-0.375,0.1875L6.4492,3.2619L4.8438,1.7385C4.4079,1.3374,3.7599,1.893,4.0899,2.385l1.666,2.4004
+ C5.9472,5.061,6.3503,5.0737,6.5586,4.8108C6.7249,4.6009,7,4.133,7.5,4.133s0.7929,0.4907,0.9414,0.6777
+ c0.175,0.2204,0.4973,0.2531,0.7129,0.0723l1.668-1.4004c0.4408-0.3741,0.0006-1.0735-0.5273-0.8379L9,3.2268V1.5002
+ C9.0002,1.2179,8.7666,0.9915,8.4844,1.0002L8.4844,1.0002z M5,6.0002L2.0762,11.924C1.9993,12.0009,2,12.155,2,12.3088
+ c0,0.5385,0.3837,0.6914,0.6914,0.6914h9.6172c0.3846,0,0.6914-0.153,0.6914-0.6914c0-0.1538,0.0008-0.2309-0.0762-0.3848L10,6.0002
+ c-0.5,0-1,0.5-1,1v0.5c0,0.277-0.223,0.5-0.5,0.5S8,7.7772,8,7.5002v-0.5c0-0.2761-0.2238-0.5-0.5-0.5S7,6.7241,7,7.0002v2
+ c0,0.277-0.223,0.5-0.5,0.5S6,9.2772,6,9.0002v-2C6,6.5002,5.5,6.0002,5,6.0002z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/warehouse.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/warehouse.svg
new file mode 100644
index 00000000..89d7794c
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/warehouse.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M13.5,5c-0.0762,0.0003-0.1514-0.0168-0.22-0.05L7.5,2L1.72,4.93C1.4632,5.0515,1.1565,4.9418,1.035,4.685
+ S1.0232,4.1215,1.28,4L7.5,0.92L13.72,4c0.2761,0.0608,0.4508,0.3339,0.39,0.61C14.0492,4.8861,13.7761,5.0608,13.5,5z M5,10H2v3h3
+ V10z M9,10H6v3h3V10z M13,10h-3v3h3V10z M11,6H8v3h3V6z M7,6H4v3h3V6z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/waste-basket.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/waste-basket.svg
new file mode 100644
index 00000000..f128ef15
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/waste-basket.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M12.41,5.58l-1.34,8c-0.0433,0.2368-0.2493,0.4091-0.49,0.41H4.42c-0.2407-0.0009-0.4467-0.1732-0.49-0.41l-1.34-8
+ C2.5458,5.3074,2.731,5.0506,3.0035,5.0064C3.0288,5.0023,3.0544,5.0002,3.08,5h8.83c0.2761-0.0036,0.5028,0.2174,0.5064,0.4935
+ C12.4168,5.5225,12.4146,5.5514,12.41,5.58z M13,3.5C13,3.7761,12.7761,4,12.5,4h-10C2.2239,4,2,3.7761,2,3.5S2.2239,3,2.5,3H5V1.5
+ C5,1.2239,5.2239,1,5.5,1h4C9.7761,1,10,1.2239,10,1.5V3h2.5C12.7761,3,13,3.2239,13,3.5z M9,3V2H6v1H9z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/water.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/water.svg
new file mode 100644
index 00000000..0fb64f85
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/water.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M7.49,15C4.5288,14.827,2.1676,12.4615,2,9.5C2,6.6,6.25,1.66,7.49,0c1.24,1.66,5,6.59,5,9.49S10.17,15,7.49,15z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/wetland.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/wetland.svg
new file mode 100644
index 00000000..5acc2148
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/wetland.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M1.48,4.5C1.905,4.1467,2.4483,3.968,3,4c1.2273-0.0869,2.3154,0.7836,2.5,2l0.78,4.68c-0.6394-0.2893-1.3759-0.2709-2,0.05
+ L3.48,6C3.1874,5.1347,2.3926,4.5387,1.48,4.5z M7.48,11.24c0.3816-0.3076,0.825-0.5293,1.3-0.65L10,3
+ c0.2926-0.8653,1.0874-1.4613,2-1.5c-0.4198-0.3485-0.955-0.5269-1.5-0.5C9.2727,0.9131,8.1846,1.7836,8,3l-1.3,7.79
+ C6.9786,10.9052,7.2408,11.0565,7.48,11.24z M11.8,10.74L11.8,10.74c0.1565-0.1277,0.3238-0.2414,0.5-0.34L13,6
+ c0.2926-0.8653,1.0874-1.4613,2-1.5c-0.4198-0.3485-0.955-0.5269-1.5-0.5c-1.2273-0.0869-2.3154,0.7836-2.5,2l-0.67,4
+ C10.8731,10.123,11.3778,10.377,11.8,10.74z M14,12L14,12c-0.4346-0.01-0.8579,0.1394-1.19,0.42l-0.47,0.41
+ c-0.2847,0.2546-0.7153,0.2546-1,0c-0.15-0.12-0.29-0.26-0.44-0.39c-0.7076-0.5968-1.7424-0.5968-2.45,0
+ c-0.16,0.13-0.31,0.28-0.47,0.41c-0.2847,0.2546-0.7153,0.2546-1,0c-0.16-0.13-0.31-0.28-0.47-0.41
+ c-0.7059-0.5912-1.7341-0.5912-2.44,0c-0.15,0.13-0.29,0.27-0.44,0.39c-0.0892,0.0715-0.1909,0.1258-0.3,0.16
+ c-0.2922,0.0652-0.5969-0.0301-0.8-0.25c-0.2475-0.214-0.5117-0.4079-0.79-0.58C1.5336,12.0421,1.2974,11.9865,1.06,12H1
+ c-0.2761,0-0.5,0.2239-0.5,0.5S0.7239,13,1,13l0,0c0.246,0.0145,0.4762,0.126,0.64,0.31L2,13.57
+ c0.6717,0.55,1.6308,0.5747,2.33,0.06c0.19-0.14,0.36-0.32,0.55-0.47c0.2847-0.2546,0.7153-0.2546,1,0l0.39,0.35
+ c0.6937,0.6189,1.7322,0.6484,2.46,0.07c0.15-0.11,0.27-0.25,0.42-0.37c0.2976-0.3038,0.7851-0.3087,1.0889-0.0111
+ c0.0037,0.0037,0.0074,0.0074,0.0111,0.0111l0.39,0.35c0.4866,0.4124,1.1485,0.5516,1.76,0.37c0.3825-0.1036,0.7286-0.3113,1-0.6
+ c0.1549-0.1772,0.3674-0.294,0.6-0.33l0,0c0.2761,0,0.5-0.2239,0.5-0.5S14.2761,12,14,12z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/wheelchair.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/wheelchair.svg
new file mode 100644
index 00000000..3236ea5a
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/wheelchair.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="15px" height="15px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path d="M12,1.5C12,2.3284,11.3284,3,10.5,3S9,2.3284,9,1.5S9.6716,0,10.5,0S12,0.6716,12,1.5z M2.82,4.87l1.74-1.71l1.85,1.29
+ L5.67,5.7c1.0747,0.3341,2.0207,0.9904,2.71,1.88l0.88-1.5c0.2295-0.4158,0.0785-0.939-0.3373-1.1685
+ C8.9218,4.911,8.9209,4.9105,8.92,4.91L8.3,4.54L4.79,2.1C4.5927,1.9594,4.3231,1.9805,4.15,2.15l-2,2
+ C1.9852,4.3716,2.0312,4.6848,2.2528,4.8496C2.4193,4.9735,2.645,4.9816,2.82,4.87z M8.13,10.94
+ c-0.0143,1.2308-0.5794,2.3904-1.54,3.16c-0.7118,0.5804-1.6016,0.8982-2.52,0.9C1.8261,15,0.0055,13.1839,0,10.94
+ c0.0023-0.9231,0.3238-1.8169,0.91-2.53c0.1868-0.232,0.398-0.4432,0.63-0.63c0.7131-0.5862,1.6069-0.9077,2.53-0.91
+ C6.3139,6.8755,8.13,8.6961,8.13,10.94z M6,12.21C6.7679,11.2051,6.5758,9.7679,5.5709,9C4.7501,8.3727,3.6109,8.3727,2.79,9
+ C2.5283,9.151,2.311,9.3683,2.16,9.63c-0.6923,1.0584-0.3956,2.4777,0.6628,3.17c0.7615,0.4981,1.7457,0.4981,2.5072,0
+ C5.5805,12.6365,5.8061,12.4378,6,12.21z M14.2,13.21l-2.49-5C11.5906,7.9251,11.3088,7.7425,11,7.75H8.51
+ c0.3293,0.4578,0.5856,0.9638,0.76,1.5h1.26l2.29,4.58c0.185,0.3728,0.6372,0.525,1.01,0.34c0.3728-0.185,0.525-0.6372,0.34-1.01
+ L14.2,13.21z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/maki-4.0.0/zoo.svg b/src/plugins/geoservices/mapbox/maki-4.0.0/zoo.svg
new file mode 100644
index 00000000..975cc853
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/maki-4.0.0/zoo.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="zoo-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="path17499" inkscape:connector-curvature="0" sodipodi:nodetypes="sssssscsccccsccscccscscccscsscccsscsss" d="
+ M8.3879,3.8928C8.3879,3.8928,7.6818,5,7,5H4.5C3.8182,5,3.2016,5.4086,2.7273,5.8636L0.5,8C0.231,8.258,0.0072,8.7681,0,9
+ c-0.0156,0.5,0,1,0,1s1,0,1-1V8.5l1-1h0.5l0.158,0.2892c0,0-0.9535,1.8244-0.9535,3.5289C1.7046,12,2.3864,12,2.3864,12h0.6818
+ c0,0,0.3409,0,0-0.3409l-0.3409-0.3409C2.7273,10.6364,3.5002,9.6667,4,9c0,0,0.0168,1.1579,0,2c-0.008,0.4096,0.2721,1,0.6818,1
+ h0.6818c0,0,0.3409,0,0-0.3409l-0.3409-0.3409C4.7105,10.7495,5.5,8.5,5.5,8.5C6.7716,8.5,7,9,8.5,9l0.3636,2.3182
+ C8.975,12.0282,9.5,12,9.5,12H11c0.3409,0,0.9611-0.3115,0.3409-0.7736L11,11V9c1.2142-0.1722,2-1,2-2h1c0.3214,0,1,0,1-0.5v-1
+ l-1.7045-1.6818C12.5444,3.0772,12,2.5,11,2.5C9.5469,2.5,8.8636,3.0688,8.3879,3.8928z"/>
+</svg>
diff --git a/src/plugins/geoservices/mapbox/mapbox.pro b/src/plugins/geoservices/mapbox/mapbox.pro
index ea011131..25a12795 100644
--- a/src/plugins/geoservices/mapbox/mapbox.pro
+++ b/src/plugins/geoservices/mapbox/mapbox.pro
@@ -9,7 +9,14 @@ HEADERS += \
qgeomapreplymapbox.h \
qgeofiletilecachemapbox.h \
qgeoroutingmanagerenginemapbox.h \
- qgeoroutereplymapbox.h
+ qgeoroutereplymapbox.h \
+ qplacecategoriesreplymapbox.h \
+ qplacemanagerenginemapbox.h \
+ qplacesearchsuggestionreplymapbox.h \
+ qplacesearchreplymapbox.h \
+ qgeocodingmanagerenginemapbox.h \
+ qgeocodereplymapbox.h \
+ qmapboxcommon.h
SOURCES += \
qgeoserviceproviderpluginmapbox.cpp \
@@ -18,7 +25,16 @@ SOURCES += \
qgeomapreplymapbox.cpp \
qgeofiletilecachemapbox.cpp \
qgeoroutingmanagerenginemapbox.cpp \
- qgeoroutereplymapbox.cpp
+ qgeoroutereplymapbox.cpp \
+ qplacecategoriesreplymapbox.cpp \
+ qplacemanagerenginemapbox.cpp \
+ qplacesearchsuggestionreplymapbox.cpp \
+ qplacesearchreplymapbox.cpp \
+ qgeocodingmanagerenginemapbox.cpp \
+ qgeocodereplymapbox.cpp \
+ qmapboxcommon.cpp
+
+RESOURCES += mapbox.qrc
OTHER_FILES += \
mapbox_plugin.json
diff --git a/src/plugins/geoservices/mapbox/mapbox.qrc b/src/plugins/geoservices/mapbox/mapbox.qrc
new file mode 100644
index 00000000..217e27a0
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/mapbox.qrc
@@ -0,0 +1,150 @@
+<RCC>
+ <qresource prefix="/mapbox">
+ <file alias="aerialway.svg">maki-4.0.0/aerialway.svg</file>
+ <file alias="airfield.svg">maki-4.0.0/airfield.svg</file>
+ <file alias="airport.svg">maki-4.0.0/airport.svg</file>
+ <file alias="alcohol-shop">maki-4.0.0/alcohol-shop.svg</file>
+ <file alias="america-football">maki-4.0.0/america-football.svg</file>
+ <file alias="amusement-park">maki-4.0.0/amusement-park.svg</file>
+ <file alias="aquarium.svg">maki-4.0.0/aquarium.svg</file>
+ <file alias="art-gallery">maki-4.0.0/art-gallery.svg</file>
+ <file alias="attraction.svg">maki-4.0.0/attraction.svg</file>
+ <file alias="bakery.svg">maki-4.0.0/bakery.svg</file>
+ <file alias="bank.svg">maki-4.0.0/bank.svg</file>
+ <file alias="barrier.svg">maki-4.0.0/barrier.svg</file>
+ <file alias="bar.svg">maki-4.0.0/bar.svg</file>
+ <file alias="baseball.svg">maki-4.0.0/baseball.svg</file>
+ <file alias="basketball.svg">maki-4.0.0/basketball.svg</file>
+ <file alias="bbq.svg">maki-4.0.0/bbq.svg</file>
+ <file alias="beer.svg">maki-4.0.0/beer.svg</file>
+ <file alias="bicycle-share">maki-4.0.0/bicycle-share.svg</file>
+ <file alias="bicycle.svg">maki-4.0.0/bicycle.svg</file>
+ <file alias="blood-bank">maki-4.0.0/blood-bank.svg</file>
+ <file alias="buddhism.svg">maki-4.0.0/buddhism.svg</file>
+ <file alias="building-alt1">maki-4.0.0/building-alt1.svg</file>
+ <file alias="building.svg">maki-4.0.0/building.svg</file>
+ <file alias="bus.svg">maki-4.0.0/bus.svg</file>
+ <file alias="cafe.svg">maki-4.0.0/cafe.svg</file>
+ <file alias="campsite.svg">maki-4.0.0/campsite.svg</file>
+ <file alias="car.svg">maki-4.0.0/car.svg</file>
+ <file alias="castle.svg">maki-4.0.0/castle.svg</file>
+ <file alias="cemetery.svg">maki-4.0.0/cemetery.svg</file>
+ <file alias="cinema.svg">maki-4.0.0/cinema.svg</file>
+ <file alias="circle-stroked">maki-4.0.0/circle-stroked.svg</file>
+ <file alias="circle.svg">maki-4.0.0/circle.svg</file>
+ <file alias="city.svg">maki-4.0.0/city.svg</file>
+ <file alias="clothing-store">maki-4.0.0/clothing-store.svg</file>
+ <file alias="college.svg">maki-4.0.0/college.svg</file>
+ <file alias="commercial.svg">maki-4.0.0/commercial.svg</file>
+ <file alias="cricket.svg">maki-4.0.0/cricket.svg</file>
+ <file alias="cross.svg">maki-4.0.0/cross.svg</file>
+ <file alias="dam.svg">maki-4.0.0/dam.svg</file>
+ <file alias="danger.svg">maki-4.0.0/danger.svg</file>
+ <file alias="defibrillator.svg">maki-4.0.0/defibrillator.svg</file>
+ <file alias="dentist.svg">maki-4.0.0/dentist.svg</file>
+ <file alias="doctor.svg">maki-4.0.0/doctor.svg</file>
+ <file alias="dog-park">maki-4.0.0/dog-park.svg</file>
+ <file alias="drinking-water">maki-4.0.0/drinking-water.svg</file>
+ <file alias="embassy.svg">maki-4.0.0/embassy.svg</file>
+ <file alias="emergency-phone">maki-4.0.0/emergency-phone.svg</file>
+ <file alias="entrance-alt1">maki-4.0.0/entrance-alt1.svg</file>
+ <file alias="entrance.svg">maki-4.0.0/entrance.svg</file>
+ <file alias="farm.svg">maki-4.0.0/farm.svg</file>
+ <file alias="fast-food">maki-4.0.0/fast-food.svg</file>
+ <file alias="fence.svg">maki-4.0.0/fence.svg</file>
+ <file alias="ferry.svg">maki-4.0.0/ferry.svg</file>
+ <file alias="fire-station">maki-4.0.0/fire-station.svg</file>
+ <file alias="florist.svg">maki-4.0.0/florist.svg</file>
+ <file alias="fuel.svg">maki-4.0.0/fuel.svg</file>
+ <file alias="gaming.svg">maki-4.0.0/gaming.svg</file>
+ <file alias="garden-center">maki-4.0.0/garden-center.svg</file>
+ <file alias="garden.svg">maki-4.0.0/garden.svg</file>
+ <file alias="gift.svg">maki-4.0.0/gift.svg</file>
+ <file alias="golf.svg">maki-4.0.0/golf.svg</file>
+ <file alias="grocery.svg">maki-4.0.0/grocery.svg</file>
+ <file alias="hairdresser.svg">maki-4.0.0/hairdresser.svg</file>
+ <file alias="harbor.svg">maki-4.0.0/harbor.svg</file>
+ <file alias="heart.svg">maki-4.0.0/heart.svg</file>
+ <file alias="heliport.svg">maki-4.0.0/heliport.svg</file>
+ <file alias="home.svg">maki-4.0.0/home.svg</file>
+ <file alias="horse-riding">maki-4.0.0/horse-riding.svg</file>
+ <file alias="hospital.svg">maki-4.0.0/hospital.svg</file>
+ <file alias="ice-cream">maki-4.0.0/ice-cream.svg</file>
+ <file alias="industry.svg">maki-4.0.0/industry.svg</file>
+ <file alias="information.svg">maki-4.0.0/information.svg</file>
+ <file alias="karaoke.svg">maki-4.0.0/karaoke.svg</file>
+ <file alias="landmark.svg">maki-4.0.0/landmark.svg</file>
+ <file alias="landuse.svg">maki-4.0.0/landuse.svg</file>
+ <file alias="laundry.svg">maki-4.0.0/laundry.svg</file>
+ <file alias="library.svg">maki-4.0.0/library.svg</file>
+ <file alias="lighthouse.svg">maki-4.0.0/lighthouse.svg</file>
+ <file alias="lodging.svg">maki-4.0.0/lodging.svg</file>
+ <file alias="logging.svg">maki-4.0.0/logging.svg</file>
+ <file alias="marker-stroked">maki-4.0.0/marker-stroked.svg</file>
+ <file alias="marker.svg">maki-4.0.0/marker.svg</file>
+ <file alias="mobile-phone">maki-4.0.0/mobile-phone.svg</file>
+ <file alias="monument.svg">maki-4.0.0/monument.svg</file>
+ <file alias="mountain.svg">maki-4.0.0/mountain.svg</file>
+ <file alias="museum.svg">maki-4.0.0/museum.svg</file>
+ <file alias="music.svg">maki-4.0.0/music.svg</file>
+ <file alias="natural.svg">maki-4.0.0/natural.svg</file>
+ <file alias="park-alt1">maki-4.0.0/park-alt1.svg</file>
+ <file alias="parking-garage">maki-4.0.0/parking-garage.svg</file>
+ <file alias="parking.svg">maki-4.0.0/parking.svg</file>
+ <file alias="park.svg">maki-4.0.0/park.svg</file>
+ <file alias="pharmacy.svg">maki-4.0.0/pharmacy.svg</file>
+ <file alias="picnic-site">maki-4.0.0/picnic-site.svg</file>
+ <file alias="pitch.svg">maki-4.0.0/pitch.svg</file>
+ <file alias="place-of">maki-4.0.0/place-of-worship.svg</file>
+ <file alias="playground.svg">maki-4.0.0/playground.svg</file>
+ <file alias="police.svg">maki-4.0.0/police.svg</file>
+ <file alias="post.svg">maki-4.0.0/post.svg</file>
+ <file alias="prison.svg">maki-4.0.0/prison.svg</file>
+ <file alias="rail-light">maki-4.0.0/rail-light.svg</file>
+ <file alias="rail-metro">maki-4.0.0/rail-metro.svg</file>
+ <file alias="rail.svg">maki-4.0.0/rail.svg</file>
+ <file alias="ranger-station">maki-4.0.0/ranger-station.svg</file>
+ <file alias="recycling.svg">maki-4.0.0/recycling.svg</file>
+ <file alias="religious-christian">maki-4.0.0/religious-christian.svg</file>
+ <file alias="religious-jewish">maki-4.0.0/religious-jewish.svg</file>
+ <file alias="religious-muslim">maki-4.0.0/religious-muslim.svg</file>
+ <file alias="residential-community">maki-4.0.0/residential-community.svg</file>
+ <file alias="restaurant.svg">maki-4.0.0/restaurant.svg</file>
+ <file alias="roadblock.svg">maki-4.0.0/roadblock.svg</file>
+ <file alias="rocket.svg">maki-4.0.0/rocket.svg</file>
+ <file alias="school.svg">maki-4.0.0/school.svg</file>
+ <file alias="scooter.svg">maki-4.0.0/scooter.svg</file>
+ <file alias="shelter.svg">maki-4.0.0/shelter.svg</file>
+ <file alias="shop.svg">maki-4.0.0/shop.svg</file>
+ <file alias="skiing.svg">maki-4.0.0/skiing.svg</file>
+ <file alias="slaughterhouse.svg">maki-4.0.0/slaughterhouse.svg</file>
+ <file alias="snowmobile.svg">maki-4.0.0/snowmobile.svg</file>
+ <file alias="soccer.svg">maki-4.0.0/soccer.svg</file>
+ <file alias="square-stroked">maki-4.0.0/square-stroked.svg</file>
+ <file alias="square.svg">maki-4.0.0/square.svg</file>
+ <file alias="stadium.svg">maki-4.0.0/stadium.svg</file>
+ <file alias="star-stroked">maki-4.0.0/star-stroked.svg</file>
+ <file alias="star.svg">maki-4.0.0/star.svg</file>
+ <file alias="suitcase.svg">maki-4.0.0/suitcase.svg</file>
+ <file alias="sushi.svg">maki-4.0.0/sushi.svg</file>
+ <file alias="swimming.svg">maki-4.0.0/swimming.svg</file>
+ <file alias="teahouse.svg">maki-4.0.0/teahouse.svg</file>
+ <file alias="telephone.svg">maki-4.0.0/telephone.svg</file>
+ <file alias="tennis.svg">maki-4.0.0/tennis.svg</file>
+ <file alias="theatre.svg">maki-4.0.0/theatre.svg</file>
+ <file alias="toilet.svg">maki-4.0.0/toilet.svg</file>
+ <file alias="town-hall">maki-4.0.0/town-hall.svg</file>
+ <file alias="town.svg">maki-4.0.0/town.svg</file>
+ <file alias="triangle-stroked">maki-4.0.0/triangle-stroked.svg</file>
+ <file alias="triangle.svg">maki-4.0.0/triangle.svg</file>
+ <file alias="veterinary.svg">maki-4.0.0/veterinary.svg</file>
+ <file alias="village.svg">maki-4.0.0/village.svg</file>
+ <file alias="volcano.svg">maki-4.0.0/volcano.svg</file>
+ <file alias="warehouse.svg">maki-4.0.0/warehouse.svg</file>
+ <file alias="waste-basket">maki-4.0.0/waste-basket.svg</file>
+ <file alias="water.svg">maki-4.0.0/water.svg</file>
+ <file alias="wetland.svg">maki-4.0.0/wetland.svg</file>
+ <file alias="wheelchair.svg">maki-4.0.0/wheelchair.svg</file>
+ <file alias="zoo.svg">maki-4.0.0/zoo.svg</file>
+ </qresource>
+</RCC>
diff --git a/src/plugins/geoservices/mapbox/mapbox_plugin.json b/src/plugins/geoservices/mapbox/mapbox_plugin.json
index f886458f..ed594add 100644
--- a/src/plugins/geoservices/mapbox/mapbox_plugin.json
+++ b/src/plugins/geoservices/mapbox/mapbox_plugin.json
@@ -5,6 +5,13 @@
"Experimental": false,
"Features": [
"OnlineMappingFeature",
- "OnlineRoutingFeature"
+ "OnlineRoutingFeature",
+ "OnlinePlacesFeature",
+ "PlaceRecommendationsFeature",
+ "SearchSuggestionsFeature",
+ "LocalizedPlacesFeature",
+ "OnlineGeocodingFeature",
+ "ReverseGeocodingFeature",
+ "LocalizedGeocodingFeature"
]
}
diff --git a/src/plugins/geoservices/mapbox/qgeocodereplymapbox.cpp b/src/plugins/geoservices/mapbox/qgeocodereplymapbox.cpp
new file mode 100644
index 00000000..db7a35c4
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qgeocodereplymapbox.cpp
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtLocation module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgeocodereplymapbox.h"
+#include "qmapboxcommon.h"
+
+#include <QtCore/QJsonDocument>
+#include <QtCore/QJsonObject>
+#include <QtCore/QJsonArray>
+#include <QtPositioning/QGeoCoordinate>
+#include <QtPositioning/QGeoAddress>
+#include <QtPositioning/QGeoLocation>
+#include <QtPositioning/QGeoRectangle>
+
+QT_BEGIN_NAMESPACE
+
+QGeoCodeReplyMapbox::QGeoCodeReplyMapbox(QNetworkReply *reply, QObject *parent)
+: QGeoCodeReply(parent)
+{
+ Q_ASSERT(parent);
+ if (!reply) {
+ setError(UnknownError, QStringLiteral("Null reply"));
+ return;
+ }
+
+ connect(reply, &QNetworkReply::finished, this, &QGeoCodeReplyMapbox::onNetworkReplyFinished);
+ connect(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
+ this, &QGeoCodeReplyMapbox::onNetworkReplyError);
+
+ connect(this, &QGeoCodeReply::aborted, reply, &QNetworkReply::abort);
+ connect(this, &QObject::destroyed, reply, &QObject::deleteLater);
+}
+
+QGeoCodeReplyMapbox::~QGeoCodeReplyMapbox()
+{
+}
+
+void QGeoCodeReplyMapbox::onNetworkReplyFinished()
+{
+ QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
+ reply->deleteLater();
+
+ if (reply->error() != QNetworkReply::NoError)
+ return;
+
+ QList<QGeoLocation> locations;
+ QJsonDocument document = QJsonDocument::fromJson(reply->readAll());
+ if (!document.isObject()) {
+ setError(ParseError, tr("Response parse error"));
+ return;
+ }
+
+ const QJsonArray features = document.object().value(QStringLiteral("features")).toArray();
+ for (const QJsonValue &value : features)
+ locations.append(QMapboxCommon::parseGeoLocation(value.toObject()));
+
+ setLocations(locations);
+
+ setFinished(true);
+}
+
+void QGeoCodeReplyMapbox::onNetworkReplyError(QNetworkReply::NetworkError error)
+{
+ Q_UNUSED(error)
+ QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
+ reply->deleteLater();
+ setError(QGeoCodeReply::CommunicationError, reply->errorString());
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/mapbox/qgeocodereplymapbox.h b/src/plugins/geoservices/mapbox/qgeocodereplymapbox.h
new file mode 100644
index 00000000..156299fa
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qgeocodereplymapbox.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtLocation module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGEOCODEREPLYMAPBOX_H
+#define QGEOCODEREPLYMAPBOX_H
+
+#include <QtNetwork/QNetworkReply>
+#include <QtLocation/QGeoCodeReply>
+
+QT_BEGIN_NAMESPACE
+
+class QGeoCodeReplyMapbox : public QGeoCodeReply
+{
+ Q_OBJECT
+
+public:
+ explicit QGeoCodeReplyMapbox(QNetworkReply *reply, QObject *parent = 0);
+ ~QGeoCodeReplyMapbox();
+
+private Q_SLOTS:
+ void onNetworkReplyFinished();
+ void onNetworkReplyError(QNetworkReply::NetworkError error);
+};
+
+QT_END_NAMESPACE
+
+#endif // QGEOCODEREPLYMAPBOX_H
diff --git a/src/plugins/geoservices/mapbox/qgeocodingmanagerenginemapbox.cpp b/src/plugins/geoservices/mapbox/qgeocodingmanagerenginemapbox.cpp
new file mode 100644
index 00000000..e0c4f6a5
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qgeocodingmanagerenginemapbox.cpp
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtLocation module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgeocodingmanagerenginemapbox.h"
+#include "qgeocodereplymapbox.h"
+#include "qmapboxcommon.h"
+
+#include <QtCore/QVariantMap>
+#include <QtCore/QUrl>
+#include <QtCore/QUrlQuery>
+#include <QtCore/QLocale>
+#include <QtCore/QStringList>
+#include <QtNetwork/QNetworkAccessManager>
+#include <QtNetwork/QNetworkRequest>
+#include <QtNetwork/QNetworkReply>
+#include <QtPositioning/QGeoCoordinate>
+#include <QtPositioning/QGeoAddress>
+#include <QtPositioning/QGeoShape>
+#include <QtPositioning/QGeoCircle>
+#include <QtPositioning/QGeoRectangle>
+
+QT_BEGIN_NAMESPACE
+
+namespace {
+ static const QString allAddressTypes = QStringLiteral("address,district,locality,neighborhood,place,postcode,region,country");
+}
+
+QGeoCodingManagerEngineMapbox::QGeoCodingManagerEngineMapbox(const QVariantMap &parameters,
+ QGeoServiceProvider::Error *error,
+ QString *errorString)
+: QGeoCodingManagerEngine(parameters), m_networkManager(new QNetworkAccessManager(this))
+{
+ if (parameters.contains(QStringLiteral("mapbox.useragent")))
+ m_userAgent = parameters.value(QStringLiteral("mapbox.useragent")).toString().toLatin1();
+ else
+ m_userAgent = QByteArrayLiteral("Qt Location based application");
+
+ m_accessToken = parameters.value(QStringLiteral("mapbox.access_token")).toString();
+
+ m_isEnterprise = parameters.value(QStringLiteral("mapbox.enterprise")).toBool();
+ m_urlPrefix = m_isEnterprise ? mapboxGeocodingEnterpriseApiPath : mapboxGeocodingApiPath;
+
+ *error = QGeoServiceProvider::NoError;
+ errorString->clear();
+}
+
+QGeoCodingManagerEngineMapbox::~QGeoCodingManagerEngineMapbox()
+{
+}
+
+QGeoCodeReply *QGeoCodingManagerEngineMapbox::geocode(const QGeoAddress &address, const QGeoShape &bounds)
+{
+ QUrlQuery queryItems;
+
+ // If address text() is not generated: a manual setText() has been made.
+ if (!address.isTextGenerated()) {
+ queryItems.addQueryItem(QStringLiteral("type"), allAddressTypes);
+ return doSearch(address.text().simplified(), queryItems, bounds);
+ }
+
+ QStringList addressString;
+ QStringList typeString;
+
+ if (!address.street().isEmpty()) {
+ addressString.append(address.street());
+ typeString.append(QStringLiteral("address"));
+ }
+
+ if (!address.district().isEmpty()) {
+ addressString.append(address.district());
+ typeString.append(QStringLiteral("district"));
+ typeString.append(QStringLiteral("locality"));
+ typeString.append(QStringLiteral("neighborhood"));
+ }
+
+ if (!address.city().isEmpty()) {
+ addressString.append(address.city());
+ typeString.append(QStringLiteral("place"));
+ }
+
+ if (!address.postalCode().isEmpty()) {
+ addressString.append(address.postalCode());
+ typeString.append(QStringLiteral("postcode"));
+ }
+
+ if (!address.state().isEmpty()) {
+ addressString.append(address.state());
+ typeString.append(QStringLiteral("region"));
+ }
+
+ if (!address.country().isEmpty()) {
+ addressString.append(address.country());
+ typeString.append(QStringLiteral("country"));
+ }
+
+ queryItems.addQueryItem(QStringLiteral("type"), typeString.join(QLatin1Char(',')));
+ queryItems.addQueryItem(QStringLiteral("limit"), QString::number(1));
+
+ return doSearch(addressString.join(QStringLiteral(", ")), queryItems, bounds);
+}
+
+QGeoCodeReply *QGeoCodingManagerEngineMapbox::geocode(const QString &address, int limit, int offset, const QGeoShape &bounds)
+{
+ Q_UNUSED(offset)
+
+ QUrlQuery queryItems;
+ queryItems.addQueryItem(QStringLiteral("type"), allAddressTypes);
+ queryItems.addQueryItem(QStringLiteral("limit"), QString::number(limit));
+
+ return doSearch(address, queryItems, bounds);
+}
+
+QGeoCodeReply *QGeoCodingManagerEngineMapbox::reverseGeocode(const QGeoCoordinate &coordinate, const QGeoShape &bounds)
+{
+ const QString coordinateString = QString::number(coordinate.longitude()) + QLatin1Char(',') + QString::number(coordinate.latitude());
+
+ QUrlQuery queryItems;
+ queryItems.addQueryItem(QStringLiteral("limit"), QString::number(1));
+
+ return doSearch(coordinateString, queryItems, bounds);
+}
+
+QGeoCodeReply *QGeoCodingManagerEngineMapbox::doSearch(const QString &request, QUrlQuery &queryItems, const QGeoShape &bounds)
+{
+ queryItems.addQueryItem(QStringLiteral("access_token"), m_accessToken);
+
+ const QString &languageCode = QLocale::system().name().section(QLatin1Char('_'), 0, 0);
+ queryItems.addQueryItem(QStringLiteral("language"), languageCode);
+
+ QGeoRectangle boundingBox = bounds.boundingGeoRectangle();
+ if (!boundingBox.isEmpty()) {
+ queryItems.addQueryItem(QStringLiteral("bbox"),
+ QString::number(boundingBox.topLeft().longitude()) + QLatin1Char(',') +
+ QString::number(boundingBox.bottomRight().latitude()) + QLatin1Char(',') +
+ QString::number(boundingBox.bottomRight().longitude()) + QLatin1Char(',') +
+ QString::number(boundingBox.topLeft().latitude()));
+ }
+
+ QUrl requestUrl(m_urlPrefix + request + QStringLiteral(".json"));
+ requestUrl.setQuery(queryItems);
+
+ QNetworkRequest networkRequest(requestUrl);
+ networkRequest.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
+
+ QNetworkReply *networkReply = m_networkManager->get(networkRequest);
+ QGeoCodeReplyMapbox *reply = new QGeoCodeReplyMapbox(networkReply, this);
+
+ connect(reply, &QGeoCodeReplyMapbox::finished, this, &QGeoCodingManagerEngineMapbox::onReplyFinished);
+ connect(reply, QOverload<QGeoCodeReply::Error, const QString &>::of(&QGeoCodeReply::error),
+ this, &QGeoCodingManagerEngineMapbox::onReplyError);
+
+ return reply;
+}
+
+void QGeoCodingManagerEngineMapbox::onReplyFinished()
+{
+ QGeoCodeReply *reply = qobject_cast<QGeoCodeReply *>(sender());
+ if (reply)
+ emit finished(reply);
+}
+
+void QGeoCodingManagerEngineMapbox::onReplyError(QGeoCodeReply::Error errorCode, const QString &errorString)
+{
+ QGeoCodeReply *reply = qobject_cast<QGeoCodeReply *>(sender());
+ if (reply)
+ emit error(reply, errorCode, errorString);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/mapbox/qgeocodingmanagerenginemapbox.h b/src/plugins/geoservices/mapbox/qgeocodingmanagerenginemapbox.h
new file mode 100644
index 00000000..614151f5
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qgeocodingmanagerenginemapbox.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtLocation module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGEOCODINGMANAGERENGINEMAPBOX_H
+#define QGEOCODINGMANAGERENGINEMAPBOX_H
+
+#include <QtCore/QUrlQuery>
+#include <QtLocation/QGeoServiceProvider>
+#include <QtLocation/QGeoCodingManagerEngine>
+#include <QtLocation/QGeoCodeReply>
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkAccessManager;
+
+class QGeoCodingManagerEngineMapbox : public QGeoCodingManagerEngine
+{
+ Q_OBJECT
+
+public:
+ QGeoCodingManagerEngineMapbox(const QVariantMap &parameters, QGeoServiceProvider::Error *error,
+ QString *errorString);
+ ~QGeoCodingManagerEngineMapbox();
+
+ QGeoCodeReply *geocode(const QGeoAddress &address, const QGeoShape &bounds) Q_DECL_OVERRIDE;
+ QGeoCodeReply *geocode(const QString &address, int limit, int offset,
+ const QGeoShape &bounds) Q_DECL_OVERRIDE;
+ QGeoCodeReply *reverseGeocode(const QGeoCoordinate &coordinate,
+ const QGeoShape &bounds) Q_DECL_OVERRIDE;
+
+private slots:
+ void onReplyFinished();
+ void onReplyError(QGeoCodeReply::Error errorCode, const QString &errorString);
+
+private:
+ QGeoCodeReply *doSearch(const QString &, QUrlQuery &, const QGeoShape &bounds);
+
+ QNetworkAccessManager *m_networkManager;
+ QByteArray m_userAgent;
+ QString m_accessToken;
+ QString m_urlPrefix;
+ bool m_isEnterprise;
+};
+
+QT_END_NAMESPACE
+
+#endif // QGEOCODINGMANAGERENGINEMAPBOX_H
diff --git a/src/plugins/geoservices/mapbox/qgeoroutereplymapbox.cpp b/src/plugins/geoservices/mapbox/qgeoroutereplymapbox.cpp
index 8fc3386a..43b18454 100644
--- a/src/plugins/geoservices/mapbox/qgeoroutereplymapbox.cpp
+++ b/src/plugins/geoservices/mapbox/qgeoroutereplymapbox.cpp
@@ -39,7 +39,8 @@
****************************************************************************/
#include "qgeoroutereplymapbox.h"
-
+#include "qgeoroutingmanagerenginemapbox.h"
+#include <QtLocation/private/qgeorouteparser_p.h>
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonObject>
#include <QtCore/QJsonArray>
@@ -48,40 +49,6 @@
QT_BEGIN_NAMESPACE
-static QList<QGeoCoordinate> parsePolyline(const QString &line)
-{
- QList<QGeoCoordinate> path;
- QByteArray data(line.toLocal8Bit());
-
- int mode = 0, shift = 0, value = 0, coord[2] = {0, 0};
- for (int i = 0; i < data.length(); ++i) {
- int c = data.at(i) - 63;
- value |= (c & 0x1f) << shift;
- shift += 5;
- if (c & 0x20) continue;
- coord[mode] += (value & 1) ? ~(value >> 1) : (value >> 1);
- if (mode) path.append(QGeoCoordinate((double)coord[0]/1e5, (double)coord[1]/1e5));
- mode = 1 - mode;
- value = shift = 0;
- }
- return path;
-}
-
-static QList<QGeoCoordinate> parseGeometry(const QJsonValue &geometry)
-{
- QList<QGeoCoordinate> path;
- if (geometry.isString()) path = parsePolyline(geometry.toString());
- if (geometry.isObject()) {
- QJsonArray coords = geometry.toObject().value(QStringLiteral("coordinates")).toArray();
- for (int i = 0; i < coords.count(); i++) {
- QJsonArray coord = coords.at(i).toArray();
- if (coord.count() != 2) continue;
- path.append(QGeoCoordinate(coord.at(1).toDouble(), coord.at(0).toDouble()));
- }
- }
- return path;
-}
-
QGeoRouteReplyMapbox::QGeoRouteReplyMapbox(QNetworkReply *reply, const QGeoRouteRequest &request,
QObject *parent)
: QGeoRouteReply(request, parent)
@@ -101,73 +68,6 @@ QGeoRouteReplyMapbox::~QGeoRouteReplyMapbox()
{
}
-static QGeoRoute constructRoute(const QJsonObject &obj)
-{
- QGeoRoute route;
- route.setDistance(obj.value(QStringLiteral("distance")).toDouble());
- route.setTravelTime(obj.value(QStringLiteral("duration")).toDouble());
-
- QList<QGeoCoordinate> path = parseGeometry(obj.value(QStringLiteral("geometry")));
- route.setPath(path);
-
- QGeoRouteSegment firstSegment, lastSegment;
- QJsonArray legs = obj.value(QStringLiteral("legs")).toArray();
-
- for (int i = 0; i < legs.count(); i++) {
- QJsonObject leg = legs.at(i).toObject();
- QJsonArray steps = leg.value("steps").toArray();
-
- for (int j = 0; j < steps.count(); j++) {
- QJsonObject step = steps.at(j).toObject();
- QJsonObject stepManeuver = step.value("maneuver").toObject();
-
- QGeoRouteSegment segment;
- segment.setDistance(step.value("distance").toDouble());
- segment.setTravelTime(step.value(QStringLiteral("duration")).toDouble());
-
- QGeoManeuver maneuver;
- maneuver.setDistanceToNextInstruction(step.value("distance").toDouble());
- maneuver.setInstructionText(stepManeuver.value("instruction").toString());
- maneuver.setTimeToNextInstruction(step.value(QStringLiteral("duration")).toDouble());
- QJsonArray location = stepManeuver.value(QStringLiteral("location")).toArray();
- if (location.count() > 1)
- maneuver.setPosition(QGeoCoordinate(location.at(0).toDouble(), location.at(1).toDouble()));
-
- QString modifier = stepManeuver.value("modifier").toString();
- int bearing1 = stepManeuver.value("bearing_before").toInt();
- int bearing2 = stepManeuver.value("bearing_after").toInt();
-
- if (modifier == "straight")
- maneuver.setDirection(QGeoManeuver::DirectionForward);
- else if (modifier == "slight right")
- maneuver.setDirection(QGeoManeuver::DirectionLightRight);
- else if (modifier == "right")
- maneuver.setDirection(QGeoManeuver::DirectionRight);
- else if (modifier == "sharp right")
- maneuver.setDirection(QGeoManeuver::DirectionHardRight);
- else if (modifier == "uturn")
- maneuver.setDirection(bearing2 - bearing1 > 180 ? QGeoManeuver::DirectionUTurnLeft : QGeoManeuver::DirectionUTurnRight);
- else if (modifier == "sharp left")
- maneuver.setDirection(QGeoManeuver::DirectionHardLeft);
- else if (modifier == "left")
- maneuver.setDirection(QGeoManeuver::DirectionLeft);
- else if (modifier == "slight left")
- maneuver.setDirection(QGeoManeuver::DirectionLightLeft);
- else
- maneuver.setDirection(QGeoManeuver::NoDirection);
-
- segment.setManeuver(maneuver);
- segment.setPath(parseGeometry(step.value(QStringLiteral("geometry"))));
-
- if (!firstSegment.isValid()) firstSegment = segment;
- if (lastSegment.isValid()) lastSegment.setNextRouteSegment(segment);
- lastSegment = segment;
- }
- }
- route.setFirstRouteSegment(firstSegment);
- return route;
-}
-
void QGeoRouteReplyMapbox::networkReplyFinished()
{
QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
@@ -176,26 +76,19 @@ void QGeoRouteReplyMapbox::networkReplyFinished()
if (reply->error() != QNetworkReply::NoError)
return;
- QJsonDocument document = QJsonDocument::fromJson(reply->readAll());
- if (document.isObject()) {
- QJsonObject object = document.object();
+ QGeoRoutingManagerEngineMapbox *engine = qobject_cast<QGeoRoutingManagerEngineMapbox *>(parent());
+ const QGeoRouteParser *parser = engine->routeParser();
- QString status = object.value(QStringLiteral("code")).toString();
- if (status != QStringLiteral("Ok")) {
- setError(QGeoRouteReply::UnknownError, object.value(QStringLiteral("message")).toString());
- return;
- }
+ QList<QGeoRoute> routes;
+ QString errorString;
+ QGeoRouteReply::Error error = parser->parseReply(routes, errorString, reply->readAll());
- QList<QGeoRoute> list;
- QJsonArray routes = object.value(QStringLiteral("routes")).toArray();
- for (int i = 0; i < routes.count(); i++) {
- QGeoRoute route = constructRoute(routes.at(i).toObject());
- list.append(route);
- }
- setRoutes(list);
+ if (error == QGeoRouteReply::NoError) {
+ setRoutes(routes.mid(0, request().numberAlternativeRoutes() + 1));
+ // setError(QGeoRouteReply::NoError, status); // can't do this, or NoError is emitted and does damages
setFinished(true);
} else {
- setError(QGeoRouteReply::ParseError, QStringLiteral("Couldn't parse json."));
+ setError(error, errorString);
}
}
diff --git a/src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.cpp b/src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.cpp
index 78ccab8c..2697114d 100644
--- a/src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.cpp
+++ b/src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.cpp
@@ -40,6 +40,8 @@
#include "qgeoroutingmanagerenginemapbox.h"
#include "qgeoroutereplymapbox.h"
+#include "qmapboxcommon.h"
+#include "QtLocation/private/qgeorouteparserosrmv5_p.h"
#include <QtCore/QUrlQuery>
#include <QtCore/QDebug>
@@ -51,7 +53,7 @@ QGeoRoutingManagerEngineMapbox::QGeoRoutingManagerEngineMapbox(const QVariantMap
QString *errorString)
: QGeoRoutingManagerEngine(parameters),
m_networkManager(new QNetworkAccessManager(this)),
- m_userAgent("Qt Location based application")
+ m_userAgent(mapboxDefaultUserAgent)
{
if (parameters.contains(QStringLiteral("mapbox.useragent"))) {
m_userAgent = parameters.value(QStringLiteral("mapbox.useragent")).toString().toLatin1();
@@ -61,6 +63,15 @@ QGeoRoutingManagerEngineMapbox::QGeoRoutingManagerEngineMapbox(const QVariantMap
m_accessToken = parameters.value(QStringLiteral("mapbox.access_token")).toString();
}
+ bool use_mapbox_text_instructions = true;
+ if (parameters.contains(QStringLiteral("mapbox.routing.use_mapbox_text_instructions"))) {
+ use_mapbox_text_instructions = parameters.value(QStringLiteral("mapbox.use_mapbox_text_instructions")).toBool();
+ }
+
+ QGeoRouteParserOsrmV5 *parser = new QGeoRouteParserOsrmV5(this, use_mapbox_text_instructions);
+ parser->setAccessToken(m_accessToken);
+ m_routeParser = parser;
+
*error = QGeoServiceProvider::NoError;
errorString->clear();
}
@@ -72,45 +83,31 @@ QGeoRoutingManagerEngineMapbox::~QGeoRoutingManagerEngineMapbox()
QGeoRouteReply* QGeoRoutingManagerEngineMapbox::calculateRoute(const QGeoRouteRequest &request)
{
QNetworkRequest networkRequest;
- networkRequest.setRawHeader("User-Agent", m_userAgent);
+ networkRequest.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
- QString url("https://api.mapbox.com/directions/v5/mapbox/");
+ QString url = mapboxDirectionsApiPath;
QGeoRouteRequest::TravelModes travelModes = request.travelModes();
if (travelModes.testFlag(QGeoRouteRequest::PedestrianTravel)) {
- url += "walking/";
+ url += QStringLiteral("walking/");
} else if (travelModes.testFlag(QGeoRouteRequest::BicycleTravel)) {
- url += "cycling/";
+ url += QStringLiteral("cycling/");
} else if (travelModes.testFlag(QGeoRouteRequest::CarTravel)) {
const QList<QGeoRouteRequest::FeatureType> &featureTypes = request.featureTypes();
int trafficFeatureIdx = featureTypes.indexOf(QGeoRouteRequest::TrafficFeature);
QGeoRouteRequest::FeatureWeight trafficWeight = request.featureWeight(QGeoRouteRequest::TrafficFeature);
if (trafficFeatureIdx >= 0 &&
(trafficWeight == QGeoRouteRequest::AvoidFeatureWeight || trafficWeight == QGeoRouteRequest::DisallowFeatureWeight)) {
- url += "driving-traffic/";
+ url += QStringLiteral("driving-traffic/");
} else {
- url += "driving/";
+ url += QStringLiteral("driving/");
}
}
- foreach (const QGeoCoordinate &c, request.waypoints()) {
- url += QString("%1,%2;").arg(c.longitude()).arg(c.latitude());
- }
- if (url.right(1) == ";")
- url.chop(1);
-
- QUrlQuery query;
- query.addQueryItem(QStringLiteral("steps"), QStringLiteral("true"));
- query.addQueryItem(QStringLiteral("alternatives"), QStringLiteral("true"));
- query.addQueryItem(QStringLiteral("overview"), QStringLiteral("full"));
- query.addQueryItem(QStringLiteral("geometries"), QStringLiteral("geojson"));
- query.addQueryItem(QStringLiteral("access_token"), m_accessToken);
-
- QUrl u(url);
- u.setQuery(query);
- networkRequest.setUrl(u);
+ networkRequest.setUrl(m_routeParser->requestUrl(request, url));
QNetworkReply *reply = m_networkManager->get(networkRequest);
+
QGeoRouteReplyMapbox *routeReply = new QGeoRouteReplyMapbox(reply, request, this);
connect(routeReply, SIGNAL(finished()), this, SLOT(replyFinished()));
@@ -120,6 +117,11 @@ QGeoRouteReply* QGeoRoutingManagerEngineMapbox::calculateRoute(const QGeoRouteRe
return routeReply;
}
+const QGeoRouteParser *QGeoRoutingManagerEngineMapbox::routeParser() const
+{
+ return m_routeParser;
+}
+
void QGeoRoutingManagerEngineMapbox::replyFinished()
{
QGeoRouteReply *reply = qobject_cast<QGeoRouteReply *>(sender());
diff --git a/src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.h b/src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.h
index 5b440147..61ab9a4a 100644
--- a/src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.h
+++ b/src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.h
@@ -47,6 +47,7 @@
QT_BEGIN_NAMESPACE
class QNetworkAccessManager;
+class QGeoRouteParser;
class QGeoRoutingManagerEngineMapbox : public QGeoRoutingManagerEngine
{
@@ -59,6 +60,7 @@ public:
~QGeoRoutingManagerEngineMapbox();
QGeoRouteReply *calculateRoute(const QGeoRouteRequest &request);
+ const QGeoRouteParser *routeParser() const;
private Q_SLOTS:
void replyFinished();
@@ -68,6 +70,8 @@ private:
QNetworkAccessManager *m_networkManager;
QByteArray m_userAgent;
QString m_accessToken;
+ bool m_useMapboxText = false;
+ QGeoRouteParser *m_routeParser = nullptr;
};
QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/mapbox/qgeoserviceproviderpluginmapbox.cpp b/src/plugins/geoservices/mapbox/qgeoserviceproviderpluginmapbox.cpp
index 835f9d04..80d9098e 100644
--- a/src/plugins/geoservices/mapbox/qgeoserviceproviderpluginmapbox.cpp
+++ b/src/plugins/geoservices/mapbox/qgeoserviceproviderpluginmapbox.cpp
@@ -35,29 +35,35 @@
****************************************************************************/
#include "qgeoserviceproviderpluginmapbox.h"
+#include "qgeocodingmanagerenginemapbox.h"
#include "qgeotiledmappingmanagerenginemapbox.h"
#include "qgeoroutingmanagerenginemapbox.h"
+#include "qplacemanagerenginemapbox.h"
#include <QtLocation/private/qgeotiledmappingmanagerengine_p.h>
QT_BEGIN_NAMESPACE
-QGeoCodingManagerEngine *QGeoServiceProviderFactoryMapbox::createGeocodingManagerEngine(
- const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
-{
- Q_UNUSED(parameters)
- Q_UNUSED(error)
- Q_UNUSED(errorString)
-
- return 0;
-}
-
static inline QString msgAccessTokenParameter()
{
return QGeoServiceProviderFactoryMapbox::tr("Mapbox plugin requires a 'mapbox.access_token' parameter.\n"
"Please visit https://www.mapbox.com");
}
+QGeoCodingManagerEngine *QGeoServiceProviderFactoryMapbox::createGeocodingManagerEngine(
+ const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
+{
+ const QString accessToken = parameters.value(QStringLiteral("mapbox.access_token")).toString();
+
+ if (!accessToken.isEmpty()) {
+ return new QGeoCodingManagerEngineMapbox(parameters, error, errorString);
+ } else {
+ *error = QGeoServiceProvider::MissingRequiredParameterError;
+ *errorString = msgAccessTokenParameter();
+ return 0;
+ }
+}
+
QGeoMappingManagerEngine *QGeoServiceProviderFactoryMapbox::createMappingManagerEngine(
const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
{
@@ -89,11 +95,15 @@ QGeoRoutingManagerEngine *QGeoServiceProviderFactoryMapbox::createRoutingManager
QPlaceManagerEngine *QGeoServiceProviderFactoryMapbox::createPlaceManagerEngine(
const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
{
- Q_UNUSED(parameters)
- Q_UNUSED(error)
- Q_UNUSED(errorString)
+ const QString accessToken = parameters.value(QStringLiteral("mapbox.access_token")).toString();
- return 0;
+ if (!accessToken.isEmpty()) {
+ return new QPlaceManagerEngineMapbox(parameters, error, errorString);
+ } else {
+ *error = QGeoServiceProvider::MissingRequiredParameterError;
+ *errorString = msgAccessTokenParameter();
+ return 0;
+ }
}
QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp b/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp
index 74971692..0b128556 100644
--- a/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp
+++ b/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp
@@ -36,6 +36,7 @@
#include "qgeotilefetchermapbox.h"
#include "qgeomapreplymapbox.h"
+#include "qmapboxcommon.h"
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
@@ -46,7 +47,7 @@ QT_BEGIN_NAMESPACE
QGeoTileFetcherMapbox::QGeoTileFetcherMapbox(int scaleFactor, QGeoTiledMappingManagerEngine *parent)
: QGeoTileFetcher(parent), m_networkManager(new QNetworkAccessManager(this)),
- m_userAgent("Qt Location based application"),
+ m_userAgent(mapboxDefaultUserAgent),
m_format("png"),
m_replyFormat("png"),
m_accessToken("")
@@ -86,7 +87,7 @@ QGeoTiledMapReply *QGeoTileFetcherMapbox::getTileImage(const QGeoTileSpec &spec)
QNetworkRequest request;
request.setRawHeader("User-Agent", m_userAgent);
- request.setUrl(QUrl(QStringLiteral("http://api.tiles.mapbox.com/v4/") +
+ request.setUrl(QUrl(mapboxTilesApiPath +
((spec.mapId() >= m_mapIds.size()) ? QStringLiteral("mapbox.streets") : m_mapIds[spec.mapId() - 1]) + QLatin1Char('/') +
QString::number(spec.zoom()) + QLatin1Char('/') +
QString::number(spec.x()) + QLatin1Char('/') +
diff --git a/src/plugins/geoservices/mapbox/qmapboxcommon.cpp b/src/plugins/geoservices/mapbox/qmapboxcommon.cpp
new file mode 100644
index 00000000..b88e8f5c
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qmapboxcommon.cpp
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtLocation module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmapboxcommon.h"
+
+#include <QtCore/QJsonArray>
+#include <QtPositioning/QGeoAddress>
+#include <QtPositioning/QGeoCoordinate>
+#include <QtPositioning/QGeoRectangle>
+
+QString QMapboxCommon::mapboxNameForCategory(const QString &category)
+{
+ if (category.isEmpty())
+ return category;
+
+ QString categoryName = category;
+ categoryName[0] = categoryName[0].toUpper();
+ return categoryName;
+}
+
+// https://www.mapbox.com/api-documentation/#response-object
+QGeoLocation QMapboxCommon::parseGeoLocation(const QJsonObject &response)
+{
+ QGeoLocation location;
+
+ QGeoAddress address;
+
+ QString streetAddress = response.value(QStringLiteral("address")).toString();
+
+ // If place type is 'address', the street address is a combo of 'text' and
+ // 'address'. The former provides the street name, and the latter provides
+ // the street number in that case.
+ if (response.value(QStringLiteral("place_type")).isArray()) {
+ foreach (const QJsonValue &value, response.value(QStringLiteral("place_type")).toArray()) {
+ if (!value.isString())
+ continue;
+ if (value.toString() == QStringLiteral("address")) {
+ streetAddress.prepend(response.value(QStringLiteral("text")).toString() + QLatin1Char(' '));
+ break;
+ }
+ }
+ }
+
+ if (response.value(QStringLiteral("properties")).isObject()) {
+ const QJsonObject properties = response.value(QStringLiteral("properties")).toObject();
+
+ // Prefer properties.address over address.
+ const QString addressString = properties.value(QStringLiteral("address")).toString();
+ if (!addressString.isEmpty())
+ streetAddress = addressString;
+ }
+
+ address.setStreet(streetAddress);
+
+ if (response.value(QStringLiteral("context")).isArray()) {
+ foreach (const QJsonValue &value, response.value(QStringLiteral("context")).toArray()) {
+ if (!value.isObject())
+ continue;
+
+ const QJsonObject object = value.toObject();
+ const QString valueId = object.value(QStringLiteral("id")).toString();
+ const QString valueText = object.value(QStringLiteral("text")).toString();
+
+ if (valueId.isEmpty() || valueText.isEmpty())
+ continue;
+
+ // XXX: locality, neighborhood, address, poi, poi.landmark
+ if (valueId.startsWith(QStringLiteral("country"))) {
+ address.setCountry(valueText);
+ const QString countryCode = object.value(QStringLiteral("short_code")).toString();
+ if (!countryCode.isEmpty())
+ address.setCountryCode(countryCode);
+ } else if (valueId.startsWith(QStringLiteral("region"))) {
+ address.setState(valueText);
+ } else if (valueId.startsWith(QStringLiteral("postcode"))) {
+ address.setPostalCode(valueText);
+ } else if (valueId.startsWith(QStringLiteral("district"))) {
+ address.setDistrict(valueText);
+ } else if (valueId.startsWith(QStringLiteral("place"))) {
+ address.setCity(valueText);
+ }
+ }
+ } else {
+ // Fallback to using information from place_name.
+ const QString placeName = response.value(QStringLiteral("place_name")).toString();
+
+ // Remove actual place name.
+ address.setText(placeName.mid(placeName.indexOf(QLatin1Char(',')) + 1));
+ }
+
+ location.setAddress(address);
+
+ QJsonArray bbox = response.value(QStringLiteral("bbox")).toArray();
+ double top = bbox.at(3).toDouble();
+ double left = bbox.at(0).toDouble();
+ double bottom = bbox.at(1).toDouble();
+ double right = bbox.at(2).toDouble();
+ location.setBoundingBox(QGeoRectangle(QGeoCoordinate(top, left), QGeoCoordinate(bottom, right)));
+
+ QJsonArray center = response.value(QStringLiteral("center")).toArray();
+ location.setCoordinate(QGeoCoordinate(center.at(1).toDouble(), center.at(0).toDouble()));
+
+ return location;
+}
diff --git a/src/plugins/geoservices/mapbox/qmapboxcommon.h b/src/plugins/geoservices/mapbox/qmapboxcommon.h
new file mode 100644
index 00000000..e60c4e83
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qmapboxcommon.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtLocation module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMAPBOXAPICOMMON_H
+#define QMAPBOXAPICOMMON_H
+
+#include <QtCore/QString>
+#include <QtCore/QJsonObject>
+#include <QtPositioning/QGeoLocation>
+
+QT_BEGIN_NAMESPACE
+
+static const QString mapboxTilesApiPath = QStringLiteral("http://api.tiles.mapbox.com/v4/");
+
+// https://www.mapbox.com/api-documentation/#geocoding
+static const QString mapboxGeocodingApiPath = QStringLiteral("https://api.mapbox.com/geocoding/v5/mapbox.places/");
+static const QString mapboxGeocodingEnterpriseApiPath = QStringLiteral("https://api.mapbox.com/geocoding/v5/mapbox.places-permanent/");
+
+// https://www.mapbox.com/api-documentation/#directions
+static const QString mapboxDirectionsApiPath = QStringLiteral("https://api.mapbox.com/directions/v5/mapbox/");
+
+static const QByteArray mapboxDefaultUserAgent = QByteArrayLiteral("Qt Location based application");
+
+static const qreal mapboxDefaultRadius = 50000;
+
+class QMapboxCommon
+{
+public:
+ static QString mapboxNameForCategory(const QString &category);
+ static QGeoLocation parseGeoLocation(const QJsonObject &response);
+};
+
+QT_END_NAMESPACE
+
+#endif // QMAPBOXAPICOMMON_H
diff --git a/src/plugins/geoservices/mapbox/qplacecategoriesreplymapbox.cpp b/src/plugins/geoservices/mapbox/qplacecategoriesreplymapbox.cpp
new file mode 100644
index 00000000..8951efbb
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qplacecategoriesreplymapbox.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtLocation module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qplacecategoriesreplymapbox.h"
+
+QT_BEGIN_NAMESPACE
+
+QPlaceCategoriesReplyMapbox::QPlaceCategoriesReplyMapbox(QObject *parent)
+: QPlaceReply(parent)
+{
+}
+
+QPlaceCategoriesReplyMapbox::~QPlaceCategoriesReplyMapbox()
+{
+}
+
+void QPlaceCategoriesReplyMapbox::finish()
+{
+ setFinished(true);
+ emit finished();
+}
+
+void QPlaceCategoriesReplyMapbox::setError(QPlaceReply::Error errorCode, const QString &errorString)
+{
+ QPlaceReply::setError(errorCode, errorString);
+ emit error(errorCode, errorString);
+ finish();
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/mapbox/qplacecategoriesreplymapbox.h b/src/plugins/geoservices/mapbox/qplacecategoriesreplymapbox.h
new file mode 100644
index 00000000..c4618c00
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qplacecategoriesreplymapbox.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtLocation module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLACECATEGORIESREPLYMAPBOX_H
+#define QPLACECATEGORIESREPLYMAPBOX_H
+
+#include <QtLocation/QPlaceReply>
+
+QT_BEGIN_NAMESPACE
+
+class QPlaceCategoriesReplyMapbox : public QPlaceReply
+{
+ Q_OBJECT
+
+public:
+ explicit QPlaceCategoriesReplyMapbox(QObject *parent = 0);
+ ~QPlaceCategoriesReplyMapbox();
+
+public slots:
+ void finish();
+ void setError(QPlaceReply::Error errorCode, const QString &errorString);
+};
+
+QT_END_NAMESPACE
+
+#endif // QPLACECATEGORIESREPLYMAPBOX_H
diff --git a/src/plugins/geoservices/mapbox/qplacemanagerenginemapbox.cpp b/src/plugins/geoservices/mapbox/qplacemanagerenginemapbox.cpp
new file mode 100644
index 00000000..56678a45
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qplacemanagerenginemapbox.cpp
@@ -0,0 +1,318 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtFoo module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qplacemanagerenginemapbox.h"
+#include "qplacesearchreplymapbox.h"
+#include "qplacesearchsuggestionreplymapbox.h"
+#include "qplacecategoriesreplymapbox.h"
+#include "qmapboxcommon.h"
+
+#include <QtCore/QUrlQuery>
+#include <QtCore/QXmlStreamReader>
+#include <QtCore/QRegularExpression>
+#include <QtNetwork/QNetworkAccessManager>
+#include <QtNetwork/QNetworkRequest>
+#include <QtNetwork/QNetworkReply>
+#include <QtPositioning/QGeoCircle>
+#include <QtLocation/private/unsupportedreplies_p.h>
+
+#include <QtCore/QElapsedTimer>
+
+namespace {
+
+// https://www.mapbox.com/api-documentation/#poi-categories
+static const QStringList categories = QStringList()
+ << QStringLiteral("bakery")
+ << QStringLiteral("bank")
+ << QStringLiteral("bar")
+ << QStringLiteral("cafe")
+ << QStringLiteral("church")
+ << QStringLiteral("cinema")
+ << QStringLiteral("coffee")
+ << QStringLiteral("concert")
+ << QStringLiteral("fast food")
+ << QStringLiteral("finance")
+ << QStringLiteral("gallery")
+ << QStringLiteral("historic")
+ << QStringLiteral("hotel")
+ << QStringLiteral("landmark")
+ << QStringLiteral("museum")
+ << QStringLiteral("music")
+ << QStringLiteral("park")
+ << QStringLiteral("pizza")
+ << QStringLiteral("restaurant")
+ << QStringLiteral("retail")
+ << QStringLiteral("school")
+ << QStringLiteral("shop")
+ << QStringLiteral("tea")
+ << QStringLiteral("theater")
+ << QStringLiteral("university");
+
+} // namespace
+
+// Mapbox API does not provide support for paginated place queries. This
+// implementation is a wrapper around its Geocoding service:
+// https://www.mapbox.com/api-documentation/#geocoding
+QPlaceManagerEngineMapbox::QPlaceManagerEngineMapbox(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString)
+ : QPlaceManagerEngine(parameters), m_networkManager(new QNetworkAccessManager(this))
+{
+ if (parameters.contains(QStringLiteral("mapbox.useragent")))
+ m_userAgent = parameters.value(QStringLiteral("mapbox.useragent")).toString().toLatin1();
+ else
+ m_userAgent = mapboxDefaultUserAgent;
+
+ m_accessToken = parameters.value(QStringLiteral("mapbox.access_token")).toString();
+
+ m_isEnterprise = parameters.value(QStringLiteral("mapbox.enterprise")).toBool();
+ m_urlPrefix = m_isEnterprise ? mapboxGeocodingEnterpriseApiPath : mapboxGeocodingApiPath;
+
+ *error = QGeoServiceProvider::NoError;
+ errorString->clear();
+}
+
+QPlaceManagerEngineMapbox::~QPlaceManagerEngineMapbox()
+{
+}
+
+QPlaceSearchReply *QPlaceManagerEngineMapbox::search(const QPlaceSearchRequest &request)
+{
+ return qobject_cast<QPlaceSearchReply *>(doSearch(request, PlaceSearchType::CompleteSearch));
+}
+
+QPlaceSearchSuggestionReply *QPlaceManagerEngineMapbox::searchSuggestions(const QPlaceSearchRequest &request)
+{
+ return qobject_cast<QPlaceSearchSuggestionReply *>(doSearch(request, PlaceSearchType::SuggestionSearch));
+}
+
+QPlaceReply *QPlaceManagerEngineMapbox::doSearch(const QPlaceSearchRequest &request, PlaceSearchType searchType)
+{
+ const QGeoShape searchArea = request.searchArea();
+ const QString searchTerm = request.searchTerm();
+ const QString recommendationId = request.recommendationId();
+ const QList<QPlaceCategory> placeCategories = request.categories();
+
+ bool invalidRequest = false;
+
+ // QLocation::DeviceVisibility is not allowed for non-enterprise accounts.
+ if (!m_isEnterprise)
+ invalidRequest |= request.visibilityScope().testFlag(QLocation::DeviceVisibility);
+
+ // Must provide either a search term, categories or recommendation.
+ invalidRequest |= searchTerm.isEmpty() && placeCategories.isEmpty() && recommendationId.isEmpty();
+
+ // Category search must not provide recommendation, and vice-versa.
+ invalidRequest |= searchTerm.isEmpty() && !placeCategories.isEmpty() && !recommendationId.isEmpty();
+
+ if (invalidRequest) {
+ QPlaceReply *reply;
+ if (searchType == PlaceSearchType::CompleteSearch)
+ reply = new QPlaceSearchReplyMapbox(request, 0, this);
+ else
+ reply = new QPlaceSearchSuggestionReplyMapbox(0, this);
+
+ connect(reply, &QPlaceReply::finished, this, &QPlaceManagerEngineMapbox::onReplyFinished);
+ connect(reply, QOverload<QPlaceReply::Error, const QString &>::of(&QPlaceReply::error),
+ this, &QPlaceManagerEngineMapbox::onReplyError);
+
+ QMetaObject::invokeMethod(reply, "setError", Qt::QueuedConnection,
+ Q_ARG(QPlaceReply::Error, QPlaceReply::BadArgumentError),
+ Q_ARG(QString, "Invalid request."));
+
+ return reply;
+ }
+
+ QString queryString;
+ if (!searchTerm.isEmpty()) {
+ queryString = searchTerm;
+ } else if (!recommendationId.isEmpty()) {
+ queryString = recommendationId;
+ } else {
+ QStringList similarIds;
+ for (const QPlaceCategory &placeCategory : placeCategories)
+ similarIds.append(placeCategory.categoryId());
+ queryString = similarIds.join(QLatin1Char(','));
+ }
+ queryString.append(QStringLiteral(".json"));
+
+ // https://www.mapbox.com/api-documentation/#request-format
+ QUrl requestUrl(m_urlPrefix + queryString);
+
+ QUrlQuery queryItems;
+ queryItems.addQueryItem(QStringLiteral("access_token"), m_accessToken);
+
+ // XXX: Investigate situations where we need to filter by 'country'.
+
+ QStringList languageCodes;
+ for (const QLocale& locale: qAsConst(m_locales)) {
+ // Returns the language and country of this locale as a string of the
+ // form "language_country", where language is a lowercase, two-letter
+ // ISO 639 language code, and country is an uppercase, two- or
+ // three-letter ISO 3166 country code.
+
+ if (locale.language() == QLocale::C)
+ continue;
+
+ const QString languageCode = locale.name().section(QLatin1Char('_'), 0, 0);
+ if (!languageCodes.contains(languageCode))
+ languageCodes.append(languageCode);
+ }
+
+ if (!languageCodes.isEmpty())
+ queryItems.addQueryItem(QStringLiteral("language"), languageCodes.join(QLatin1Char(',')));
+
+ if (searchArea.type() != QGeoShape::UnknownType) {
+ const QGeoCoordinate center = searchArea.center();
+ queryItems.addQueryItem(QStringLiteral("proximity"),
+ QString::number(center.longitude()) + QLatin1Char(',') + QString::number(center.latitude()));
+ }
+
+ queryItems.addQueryItem(QStringLiteral("type"), QStringLiteral("poi"));
+
+ // XXX: Investigate situations where 'autocomplete' should be disabled.
+
+ QGeoRectangle boundingBox = searchArea.boundingGeoRectangle();
+ if (!boundingBox.isEmpty()) {
+ queryItems.addQueryItem(QStringLiteral("bbox"),
+ QString::number(boundingBox.topLeft().longitude()) + QLatin1Char(',') +
+ QString::number(boundingBox.bottomRight().latitude()) + QLatin1Char(',') +
+ QString::number(boundingBox.bottomRight().longitude()) + QLatin1Char(',') +
+ QString::number(boundingBox.topLeft().latitude()));
+ }
+
+ if (request.limit() > 0)
+ queryItems.addQueryItem(QStringLiteral("limit"), QString::number(request.limit()));
+
+ // XXX: Investigate searchContext() use cases.
+
+ requestUrl.setQuery(queryItems);
+
+ QNetworkRequest networkRequest(requestUrl);
+ networkRequest.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
+
+ QNetworkReply *networkReply = m_networkManager->get(networkRequest);
+ QPlaceReply *reply;
+ if (searchType == PlaceSearchType::CompleteSearch)
+ reply = new QPlaceSearchReplyMapbox(request, networkReply, this);
+ else
+ reply = new QPlaceSearchSuggestionReplyMapbox(networkReply, this);
+
+ connect(reply, &QPlaceReply::finished, this, &QPlaceManagerEngineMapbox::onReplyFinished);
+ connect(reply, QOverload<QPlaceReply::Error, const QString &>::of(&QPlaceReply::error),
+ this, &QPlaceManagerEngineMapbox::onReplyError);
+
+ return reply;
+}
+
+QPlaceReply *QPlaceManagerEngineMapbox::initializeCategories()
+{
+ if (m_categories.isEmpty()) {
+ for (const QString &categoryId : categories) {
+ QPlaceCategory category;
+ category.setName(QMapboxCommon::mapboxNameForCategory(categoryId));
+ category.setCategoryId(categoryId);
+ category.setVisibility(QLocation::PublicVisibility);
+ m_categories[categoryId] = category;
+ }
+ }
+
+ QPlaceCategoriesReplyMapbox *reply = new QPlaceCategoriesReplyMapbox(this);
+ connect(reply, &QPlaceReply::finished, this, &QPlaceManagerEngineMapbox::onReplyFinished);
+ connect(reply, QOverload<QPlaceReply::Error, const QString &>::of(&QPlaceReply::error),
+ this, &QPlaceManagerEngineMapbox::onReplyError);
+
+ // Queue a future finished() emission from the reply.
+ QMetaObject::invokeMethod(reply, "finish", Qt::QueuedConnection);
+
+ return reply;
+}
+
+QString QPlaceManagerEngineMapbox::parentCategoryId(const QString &categoryId) const
+{
+ Q_UNUSED(categoryId)
+
+ // Only a single category level.
+ return QString();
+}
+
+QStringList QPlaceManagerEngineMapbox::childCategoryIds(const QString &categoryId) const
+{
+ // Only a single category level.
+ if (categoryId.isEmpty())
+ return m_categories.keys();
+
+ return QStringList();
+}
+
+QPlaceCategory QPlaceManagerEngineMapbox::category(const QString &categoryId) const
+{
+ return m_categories.value(categoryId);
+}
+
+QList<QPlaceCategory> QPlaceManagerEngineMapbox::childCategories(const QString &parentId) const
+{
+ // Only a single category level.
+ if (parentId.isEmpty())
+ return m_categories.values();
+
+ return QList<QPlaceCategory>();
+}
+
+QList<QLocale> QPlaceManagerEngineMapbox::locales() const
+{
+ return m_locales;
+}
+
+void QPlaceManagerEngineMapbox::setLocales(const QList<QLocale> &locales)
+{
+ m_locales = locales;
+}
+
+void QPlaceManagerEngineMapbox::onReplyFinished()
+{
+ QPlaceReply *reply = qobject_cast<QPlaceReply *>(sender());
+ if (reply)
+ emit finished(reply);
+}
+
+void QPlaceManagerEngineMapbox::onReplyError(QPlaceReply::Error errorCode, const QString &errorString)
+{
+ QPlaceReply *reply = qobject_cast<QPlaceReply *>(sender());
+ if (reply)
+ emit error(reply, errorCode, errorString);
+}
diff --git a/src/plugins/geoservices/mapbox/qplacemanagerenginemapbox.h b/src/plugins/geoservices/mapbox/qplacemanagerenginemapbox.h
new file mode 100644
index 00000000..1c5bda5b
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qplacemanagerenginemapbox.h
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtFoo module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLACEMANAGERENGINEMAPBOX_H
+#define QPLACEMANAGERENGINEMAPBOX_H
+
+#include <QtLocation/QPlaceManagerEngine>
+#include <QtLocation/QGeoServiceProvider>
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkAccessManager;
+
+class QPlaceManagerEngineMapbox : public QPlaceManagerEngine
+{
+ Q_OBJECT
+
+public:
+ QPlaceManagerEngineMapbox(const QVariantMap &parameters, QGeoServiceProvider::Error *,
+ QString *errorString);
+ ~QPlaceManagerEngineMapbox();
+
+ QPlaceSearchReply *search(const QPlaceSearchRequest &) Q_DECL_OVERRIDE;
+
+ QPlaceSearchSuggestionReply *searchSuggestions(const QPlaceSearchRequest &) Q_DECL_OVERRIDE;
+
+ QPlaceReply *initializeCategories() Q_DECL_OVERRIDE;
+ QString parentCategoryId(const QString &categoryId) const Q_DECL_OVERRIDE;
+ QStringList childCategoryIds(const QString &categoryId) const Q_DECL_OVERRIDE;
+ QPlaceCategory category(const QString &categoryId) const Q_DECL_OVERRIDE;
+ QList<QPlaceCategory> childCategories(const QString &parentId) const Q_DECL_OVERRIDE;
+
+ QList<QLocale> locales() const Q_DECL_OVERRIDE;
+ void setLocales(const QList<QLocale> &locales) Q_DECL_OVERRIDE;
+
+ // TODO: icon
+ //QPlaceIcon icon(const QString &remotePath,
+ // const QList<QPlaceCategory> &categories = QList<QPlaceCategory>()) const;
+
+ //QUrl constructIconUrl(const QPlaceIcon &icon, const QSize &size) const Q_DECL_OVERRIDE;
+
+private slots:
+ void onReplyFinished();
+ void onReplyError(QPlaceReply::Error, const QString &errorString);
+
+private:
+ enum PlaceSearchType {
+ CompleteSearch = 0,
+ SuggestionSearch
+ };
+
+ QPlaceReply *doSearch(const QPlaceSearchRequest&, PlaceSearchType);
+
+ QNetworkAccessManager *m_networkManager;
+ QByteArray m_userAgent;
+ QString m_accessToken;
+ QString m_urlPrefix;
+ bool m_isEnterprise;
+
+ QList<QLocale> m_locales;
+ QHash<QString, QPlaceCategory> m_categories;
+};
+
+QT_END_NAMESPACE
+
+#endif // QPLACEMANAGERENGINEMAPBOX_H
diff --git a/src/plugins/geoservices/mapbox/qplacesearchreplymapbox.cpp b/src/plugins/geoservices/mapbox/qplacesearchreplymapbox.cpp
new file mode 100644
index 00000000..a6654e81
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qplacesearchreplymapbox.cpp
@@ -0,0 +1,230 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtFoo module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qplacesearchreplymapbox.h"
+#include "qplacemanagerenginemapbox.h"
+#include "qmapboxcommon.h"
+
+#include <QtCore/QJsonDocument>
+#include <QtCore/QJsonArray>
+#include <QtCore/QJsonObject>
+#include <QtNetwork/QNetworkReply>
+#include <QtPositioning/QGeoCircle>
+#include <QtPositioning/QGeoRectangle>
+#include <QtLocation/QPlaceResult>
+#include <QtLocation/QPlaceSearchRequest>
+#include <QtLocation/QPlaceContactDetail>
+
+QT_BEGIN_NAMESPACE
+
+namespace {
+
+// https://www.mapbox.com/api-documentation/#response-object
+QPlaceResult parsePlaceResult(const QJsonObject &response, const QString &attribution)
+{
+ QPlace place;
+
+ place.setAttribution(attribution);
+ place.setPlaceId(response.value(QStringLiteral("id")).toString());
+ place.setVisibility(QLocation::PublicVisibility);
+
+ QString placeName = response.value(QStringLiteral("text")).toString();
+ if (placeName.isEmpty())
+ placeName = response.value(QStringLiteral("place_name")).toString();
+
+ place.setName(placeName);
+ place.setDetailsFetched(true);
+
+ // Unused data: type, place_type, relevance, properties.short_code,
+ // properties.landmark, properties.wikidata
+
+ // The property object is unstable and only Carmen GeoJSON properties are
+ // guaranteed. This implementation should check for the presence of these
+ // values in a response before it attempts to use them.
+ if (response.value(QStringLiteral("properties")).isObject()) {
+ const QJsonObject properties = response.value(QStringLiteral("properties")).toObject();
+
+ const QString makiString = properties.value(QStringLiteral("maki")).toString();
+ if (!makiString.isEmpty()) {
+ QVariantMap iconParameters;
+ iconParameters.insert(QPlaceIcon::SingleUrl,
+ QUrl::fromLocalFile(QStringLiteral(":/mapbox/") + makiString + QStringLiteral(".svg")));
+
+ QPlaceIcon icon;
+ icon.setParameters(iconParameters);
+ place.setIcon(icon);
+ }
+
+ const QString phoneString = properties.value(QStringLiteral("tel")).toString();
+ if (!phoneString.isEmpty()) {
+ QPlaceContactDetail phoneDetail;
+ phoneDetail.setLabel(QPlaceContactDetail::Phone);
+ phoneDetail.setValue(phoneString);
+ place.setContactDetails(QPlaceContactDetail::Phone, QList<QPlaceContactDetail>() << phoneDetail);
+ }
+
+ const QString categoryString = properties.value(QStringLiteral("category")).toString();
+ if (!categoryString.isEmpty()) {
+ QList<QPlaceCategory> categories;
+ for (const QString &categoryId : categoryString.split(QStringLiteral(", "), QString::SkipEmptyParts)) {
+ QPlaceCategory category;
+ category.setName(QMapboxCommon::mapboxNameForCategory(categoryId));
+ category.setCategoryId(categoryId);
+ categories.append(category);
+ }
+ place.setCategories(categories);
+ }
+ }
+
+ // XXX: matching_text, matching_place_name
+ // XXX: text_{language}, place_name_{language}
+ // XXX: language, language_{language}
+
+ place.setLocation(QMapboxCommon::parseGeoLocation(response));
+
+ // XXX: geometry, geometry.type, geometry.coordinates, geometry.interpolated
+
+ QPlaceResult result;
+ result.setPlace(place);
+ result.setTitle(place.name());
+
+ return result;
+}
+
+} // namespace
+
+QPlaceSearchReplyMapbox::QPlaceSearchReplyMapbox(const QPlaceSearchRequest &request, QNetworkReply *reply, QPlaceManagerEngineMapbox *parent)
+: QPlaceSearchReply(parent)
+{
+ Q_ASSERT(parent);
+ if (!reply) {
+ setError(UnknownError, QStringLiteral("Null reply"));
+ return;
+ }
+ setRequest(request);
+
+ connect(reply, &QNetworkReply::finished, this, &QPlaceSearchReplyMapbox::onReplyFinished);
+ connect(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
+ this, &QPlaceSearchReplyMapbox::onNetworkError);
+
+ connect(this, &QPlaceReply::aborted, reply, &QNetworkReply::abort);
+ connect(this, &QObject::destroyed, reply, &QObject::deleteLater);
+}
+
+QPlaceSearchReplyMapbox::~QPlaceSearchReplyMapbox()
+{
+}
+
+void QPlaceSearchReplyMapbox::setError(QPlaceReply::Error errorCode, const QString &errorString)
+{
+ QPlaceReply::setError(errorCode, errorString);
+ emit error(errorCode, errorString);
+
+ setFinished(true);
+ emit finished();
+}
+
+void QPlaceSearchReplyMapbox::onReplyFinished()
+{
+ QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
+ reply->deleteLater();
+
+ if (reply->error() != QNetworkReply::NoError)
+ return;
+
+ const QJsonDocument document = QJsonDocument::fromJson(reply->readAll());
+ if (!document.isObject()) {
+ setError(ParseError, tr("Response parse error"));
+ return;
+ }
+
+ const QJsonArray features = document.object().value(QStringLiteral("features")).toArray();
+ const QString attribution = document.object().value(QStringLiteral("attribution")).toString();
+
+ const QGeoCoordinate searchCenter = request().searchArea().center();
+ const QList<QPlaceCategory> categories = request().categories();
+
+ QList<QPlaceSearchResult> results;
+ for (const QJsonValue &feature : features) {
+ QPlaceResult placeResult = parsePlaceResult(feature.toObject(), attribution);
+
+ if (!categories.isEmpty()) {
+ const QList<QPlaceCategory> placeCategories = placeResult.place().categories();
+ if (!placeCategories.isEmpty()) {
+ bool categoryMatch = false;
+ for (const QPlaceCategory &placeCategory : placeCategories) {
+ if (categories.contains(placeCategory)) {
+ categoryMatch = true;
+ break;
+ }
+ }
+ if (!categoryMatch)
+ continue;
+ }
+ }
+
+ placeResult.setDistance(searchCenter.distanceTo(placeResult.place().location().coordinate()));
+ results.append(placeResult);
+ }
+
+ if (request().relevanceHint() == QPlaceSearchRequest::DistanceHint) {
+ qSort(results.begin(), results.end(), [](const QPlaceResult &a, const QPlaceResult &b) -> bool {
+ return a.distance() < b.distance();
+ });
+ } else if (request().relevanceHint() == QPlaceSearchRequest::LexicalPlaceNameHint) {
+ qSort(results.begin(), results.end(), [](const QPlaceResult &a, const QPlaceResult &b) -> bool {
+ return a.place().name() < b.place().name();
+ });
+ }
+
+ setResults(results);
+
+ setFinished(true);
+ emit finished();
+}
+
+void QPlaceSearchReplyMapbox::onNetworkError(QNetworkReply::NetworkError error)
+{
+ Q_UNUSED(error)
+ QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
+ reply->deleteLater();
+ setError(CommunicationError, reply->errorString());
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/mapbox/qplacesearchreplymapbox.h b/src/plugins/geoservices/mapbox/qplacesearchreplymapbox.h
new file mode 100644
index 00000000..05ba8fc6
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qplacesearchreplymapbox.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtFoo module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLACESEARCHREPLYMAPBOX_H
+#define QPLACESEARCHREPLYMAPBOX_H
+
+#include <QtLocation/QPlaceSearchReply>
+#include <QNetworkReply>
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkReply;
+class QPlaceManagerEngineMapbox;
+class QPlaceResult;
+
+class QPlaceSearchReplyMapbox : public QPlaceSearchReply
+{
+ Q_OBJECT
+
+public:
+ QPlaceSearchReplyMapbox(const QPlaceSearchRequest &request, QNetworkReply *reply,
+ QPlaceManagerEngineMapbox *parent);
+ ~QPlaceSearchReplyMapbox();
+
+public slots:
+ void setError(QPlaceReply::Error errorCode, const QString &errorString);
+
+private slots:
+ void onReplyFinished();
+ void onNetworkError(QNetworkReply::NetworkError error);
+};
+
+QT_END_NAMESPACE
+
+#endif // QPLACESEARCHREPLYMAPBOX_H
diff --git a/src/plugins/geoservices/mapbox/qplacesearchsuggestionreplymapbox.cpp b/src/plugins/geoservices/mapbox/qplacesearchsuggestionreplymapbox.cpp
new file mode 100644
index 00000000..23d76175
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qplacesearchsuggestionreplymapbox.cpp
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtFoo module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qplacesearchsuggestionreplymapbox.h"
+#include "qplacemanagerenginemapbox.h"
+
+#include <QtCore/QJsonDocument>
+#include <QtCore/QJsonArray>
+#include <QtCore/QJsonObject>
+#include <QtNetwork/QNetworkReply>
+#include <QtPositioning/QGeoCircle>
+#include <QtPositioning/QGeoRectangle>
+#include <QtLocation/QPlaceResult>
+#include <QtLocation/QPlaceSearchRequest>
+
+QT_BEGIN_NAMESPACE
+
+QPlaceSearchSuggestionReplyMapbox::QPlaceSearchSuggestionReplyMapbox(QNetworkReply *reply, QPlaceManagerEngineMapbox *parent)
+: QPlaceSearchSuggestionReply(parent)
+{
+ Q_ASSERT(parent);
+ if (!reply) {
+ setError(UnknownError, QStringLiteral("Null reply"));
+ return;
+ }
+
+ connect(reply, &QNetworkReply::finished, this, &QPlaceSearchSuggestionReplyMapbox::onReplyFinished);
+ connect(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
+ this, &QPlaceSearchSuggestionReplyMapbox::onNetworkError);
+
+ connect(this, &QPlaceReply::aborted, reply, &QNetworkReply::abort);
+ connect(this, &QObject::destroyed, reply, &QObject::deleteLater);
+}
+
+QPlaceSearchSuggestionReplyMapbox::~QPlaceSearchSuggestionReplyMapbox()
+{
+}
+
+void QPlaceSearchSuggestionReplyMapbox::setError(QPlaceReply::Error errorCode, const QString &errorString)
+{
+ QPlaceReply::setError(errorCode, errorString);
+ emit error(errorCode, errorString);
+
+ setFinished(true);
+ emit finished();
+}
+
+void QPlaceSearchSuggestionReplyMapbox::onReplyFinished()
+{
+ QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
+ reply->deleteLater();
+
+ if (reply->error() != QNetworkReply::NoError)
+ return;
+
+ QJsonDocument document = QJsonDocument::fromJson(reply->readAll());
+ if (!document.isObject()) {
+ setError(ParseError, tr("Response parse error"));
+ return;
+ }
+
+ const QJsonArray features = document.object().value(QStringLiteral("features")).toArray();
+
+ QStringList suggestions;
+ for (const QJsonValue &feature : features) {
+ if (feature.isObject())
+ suggestions.append(feature.toObject().value(QStringLiteral("text")).toString());
+ }
+
+ setSuggestions(suggestions);
+
+ setFinished(true);
+ emit finished();
+}
+
+void QPlaceSearchSuggestionReplyMapbox::onNetworkError(QNetworkReply::NetworkError error)
+{
+ Q_UNUSED(error)
+ QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
+ reply->deleteLater();
+ setError(CommunicationError, reply->errorString());
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/mapbox/qplacesearchsuggestionreplymapbox.h b/src/plugins/geoservices/mapbox/qplacesearchsuggestionreplymapbox.h
new file mode 100644
index 00000000..8516c738
--- /dev/null
+++ b/src/plugins/geoservices/mapbox/qplacesearchsuggestionreplymapbox.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Mapbox, Inc.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtFoo module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLACESEARCHSUGGESTIONREPLYMAPBOX_H
+#define QPLACESEARCHSUGGESTIONREPLYMAPBOX_H
+
+#include <QtLocation/QPlaceSearchSuggestionReply>
+#include <QNetworkReply>
+
+QT_BEGIN_NAMESPACE
+
+class QNetworkReply;
+class QPlaceManagerEngineMapbox;
+class QPlaceResult;
+
+class QPlaceSearchSuggestionReplyMapbox : public QPlaceSearchSuggestionReply
+{
+ Q_OBJECT
+
+public:
+ QPlaceSearchSuggestionReplyMapbox(QNetworkReply *reply, QPlaceManagerEngineMapbox *parent);
+ ~QPlaceSearchSuggestionReplyMapbox();
+
+public slots:
+ void setError(QPlaceReply::Error errorCode, const QString &errorString);
+
+private slots:
+ void onReplyFinished();
+ void onNetworkError(QNetworkReply::NetworkError error);
+};
+
+QT_END_NAMESPACE
+
+#endif // QPLACESEARCHSUGGESTIONREPLYMAPBOX_H
diff --git a/src/plugins/geoservices/mapboxgl/mapboxgl.pro b/src/plugins/geoservices/mapboxgl/mapboxgl.pro
index f35f26dc..17b6f53a 100644
--- a/src/plugins/geoservices/mapboxgl/mapboxgl.pro
+++ b/src/plugins/geoservices/mapboxgl/mapboxgl.pro
@@ -35,16 +35,7 @@ load(qt_build_paths)
LIBS_PRIVATE += -L$$MODULE_BASE_OUTDIR/lib -lqmapboxgl$$qtPlatformTargetSuffix()
qtConfig(icu) {
- include(../../../3rdparty/icu_dependency.pri)
-}
-
-# When building for Windows with dynamic OpenGL, this plugin
-# can only run with ANGLE because Mapbox GL requires at least
-# OpenGL ES and does not use QOpenGLFunctions for resolving
-# the OpenGL symbols. -lopengl32 only gives OpenGL 1.1.
-win32:qtConfig(dynamicgl) {
- qtConfig(combined-angle-lib): LIBS_PRIVATE += -l$${LIBQTANGLE_NAME}
- else: LIBS_PRIVATE += -l$${LIBEGL_NAME} -l$${LIBGLESV2_NAME}
+ QMAKE_USE_PRIVATE += icu
}
PLUGIN_TYPE = geoservices
diff --git a/src/plugins/geoservices/mapboxgl/qgeomapmapboxgl.cpp b/src/plugins/geoservices/mapboxgl/qgeomapmapboxgl.cpp
index 8df00905..dd5c9a86 100644
--- a/src/plugins/geoservices/mapboxgl/qgeomapmapboxgl.cpp
+++ b/src/plugins/geoservices/mapboxgl/qgeomapmapboxgl.cpp
@@ -97,23 +97,26 @@ QSGNode *QGeoMapMapboxGLPrivate::updateSceneGraph(QSGNode *node, QQuickWindow *w
}
QMapboxGL *map = 0;
- if (m_useFBO) {
- if (!node) {
+ if (!node) {
+ QOpenGLContext *currentCtx = QOpenGLContext::currentContext();
+ if (!currentCtx) {
+ qWarning("QOpenGLContext is NULL!");
+ return node;
+ }
+ if (m_useFBO) {
QSGMapboxGLTextureNode *mbglNode = new QSGMapboxGLTextureNode(m_settings, m_viewportSize, window->devicePixelRatio(), q);
QObject::connect(mbglNode->map(), &QMapboxGL::mapChanged, q, &QGeoMapMapboxGL::onMapChanged);
m_syncState = MapTypeSync | CameraDataSync | ViewportSync;
node = mbglNode;
- }
- map = static_cast<QSGMapboxGLTextureNode *>(node)->map();
- } else {
- if (!node) {
+ } else {
QSGMapboxGLRenderNode *mbglNode = new QSGMapboxGLRenderNode(m_settings, m_viewportSize, window->devicePixelRatio(), q);
QObject::connect(mbglNode->map(), &QMapboxGL::mapChanged, q, &QGeoMapMapboxGL::onMapChanged);
m_syncState = MapTypeSync | CameraDataSync | ViewportSync;
node = mbglNode;
}
- map = static_cast<QSGMapboxGLRenderNode *>(node)->map();
}
+ map = (m_useFBO) ? static_cast<QSGMapboxGLTextureNode *>(node)->map()
+ : static_cast<QSGMapboxGLRenderNode *>(node)->map();
if (m_syncState & MapTypeSync) {
m_developmentMode = m_activeMapType.name().startsWith("mapbox://")
diff --git a/src/plugins/geoservices/mapboxgl/qgeoserviceproviderpluginmapboxgl.cpp b/src/plugins/geoservices/mapboxgl/qgeoserviceproviderpluginmapboxgl.cpp
index c7d5d3ee..dd25c99e 100644
--- a/src/plugins/geoservices/mapboxgl/qgeoserviceproviderpluginmapboxgl.cpp
+++ b/src/plugins/geoservices/mapboxgl/qgeoserviceproviderpluginmapboxgl.cpp
@@ -65,15 +65,6 @@ QGeoCodingManagerEngine *QGeoServiceProviderFactoryMapboxGL::createGeocodingMana
QGeoMappingManagerEngine *QGeoServiceProviderFactoryMapboxGL::createMappingManagerEngine(
const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
{
-#ifdef Q_OS_WIN
- if (QOpenGLContext::openGLModuleType() != QOpenGLContext::LibGLES) {
- qWarning("The Mapbox GL plugin only supports OpenGL ES on Windows. \
- Try setting the environment variable QT_OPENGL to 'angle'.");
-
- return 0;
- }
-#endif
-
return new QGeoMappingManagerEngineMapboxGL(parameters, error, errorString);
}
diff --git a/src/plugins/geoservices/mapboxgl/qmapboxglstylechange.cpp b/src/plugins/geoservices/mapboxgl/qmapboxglstylechange.cpp
index 69bb6e4b..f39bfae3 100644
--- a/src/plugins/geoservices/mapboxgl/qmapboxglstylechange.cpp
+++ b/src/plugins/geoservices/mapboxgl/qmapboxglstylechange.cpp
@@ -124,7 +124,10 @@ QMapbox::Feature featureFromMapPolygon(QDeclarativePolygonMapItem *mapItem)
coordinates << QMapbox::Coordinate { coordinate.latitude(), coordinate.longitude() };
}
}
- coordinates.append(coordinates.first());
+
+ if (!coordinates.empty())
+ coordinates.append(coordinates.first()); // closing the path
+
QMapbox::CoordinatesCollections geometry { { coordinates } };
return QMapbox::Feature(QMapbox::Feature::PolygonType, geometry, {}, getId(mapItem));
@@ -381,7 +384,7 @@ QList<QSharedPointer<QMapboxGLStyleChange>> QMapboxGLStyleSetPaintProperty::from
const QString id = getId(item);
changes << QSharedPointer<QMapboxGLStyleChange>(
- new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("fill-opacity"), item->mapItemOpacity()));
+ new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("fill-opacity"), item->color().alphaF() * item->mapItemOpacity()));
changes << QSharedPointer<QMapboxGLStyleChange>(
new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("fill-color"), item->color()));
changes << QSharedPointer<QMapboxGLStyleChange>(
@@ -398,7 +401,7 @@ QList<QSharedPointer<QMapboxGLStyleChange>> QMapboxGLStyleSetPaintProperty::from
const QString id = getId(item);
changes << QSharedPointer<QMapboxGLStyleChange>(
- new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("fill-opacity"), item->mapItemOpacity()));
+ new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("fill-opacity"), item->color().alphaF() * item->mapItemOpacity()));
changes << QSharedPointer<QMapboxGLStyleChange>(
new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("fill-color"), item->color()));
changes << QSharedPointer<QMapboxGLStyleChange>(
@@ -415,7 +418,7 @@ QList<QSharedPointer<QMapboxGLStyleChange>> QMapboxGLStyleSetPaintProperty::from
const QString id = getId(item);
changes << QSharedPointer<QMapboxGLStyleChange>(
- new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("fill-opacity"), item->mapItemOpacity()));
+ new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("fill-opacity"), item->color().alphaF() * item->mapItemOpacity()));
changes << QSharedPointer<QMapboxGLStyleChange>(
new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("fill-color"), item->color()));
changes << QSharedPointer<QMapboxGLStyleChange>(
@@ -432,7 +435,7 @@ QList<QSharedPointer<QMapboxGLStyleChange>> QMapboxGLStyleSetPaintProperty::from
const QString id = getId(item);
changes << QSharedPointer<QMapboxGLStyleChange>(
- new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("line-opacity"), item->mapItemOpacity()));
+ new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("line-opacity"), item->line()->color().alphaF() * item->mapItemOpacity()));
changes << QSharedPointer<QMapboxGLStyleChange>(
new QMapboxGLStyleSetPaintProperty(id, QStringLiteral("line-color"), item->line()->color()));
changes << QSharedPointer<QMapboxGLStyleChange>(
diff --git a/src/plugins/geoservices/mapboxgl/qsgmapboxglnode.cpp b/src/plugins/geoservices/mapboxgl/qsgmapboxglnode.cpp
index 82aa868f..7721fe61 100644
--- a/src/plugins/geoservices/mapboxgl/qsgmapboxglnode.cpp
+++ b/src/plugins/geoservices/mapboxgl/qsgmapboxglnode.cpp
@@ -68,8 +68,10 @@ void QSGMapboxGLTextureNode::resize(const QSize &size, qreal pixelRatio)
m_map->setFramebufferObject(m_fbo->handle());
QSGPlainTexture *fboTexture = static_cast<QSGPlainTexture *>(texture());
- if (!fboTexture)
+ if (!fboTexture) {
fboTexture = new QSGPlainTexture;
+ fboTexture->setHasAlphaChannel(true);
+ }
fboTexture->setTextureId(m_fbo->texture());
fboTexture->setTextureSize(fbSize);
@@ -92,6 +94,11 @@ void QSGMapboxGLTextureNode::render(QQuickWindow *window)
f->glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);
m_fbo->bind();
+
+ f->glClearColor(0.f, 0.f, 0.f, 0.f);
+ f->glColorMask(true, true, true, true);
+ f->glClear(GL_COLOR_BUFFER_BIT);
+
m_map->render();
m_fbo->release();
diff --git a/src/plugins/geoservices/nokia/qgeocodingmanagerengine_nokia.cpp b/src/plugins/geoservices/nokia/qgeocodingmanagerengine_nokia.cpp
index b3c74a63..68b2429e 100644
--- a/src/plugins/geoservices/nokia/qgeocodingmanagerengine_nokia.cpp
+++ b/src/plugins/geoservices/nokia/qgeocodingmanagerengine_nokia.cpp
@@ -111,18 +111,8 @@ QGeoCodeReply *QGeoCodingManagerEngineNokia::geocode(const QGeoAddress &address,
requestString += languageToMarc(locale().language());
bool manualBoundsRequired = false;
- if (bounds.type() == QGeoShape::RectangleType) {
- QGeoRectangle rect(bounds);
- if (rect.isValid()) {
- requestString += "&bbox=";
- requestString += trimDouble(rect.topLeft().latitude());
- requestString += ",";
- requestString += trimDouble(rect.topLeft().longitude());
- requestString += ";";
- requestString += trimDouble(rect.bottomRight().latitude());
- requestString += ",";
- requestString += trimDouble(rect.bottomRight().longitude());
- }
+ if (bounds.type() == QGeoShape::UnknownType) {
+ manualBoundsRequired = true;
} else if (bounds.type() == QGeoShape::CircleType) {
QGeoCircle circ(bounds);
if (circ.isValid()) {
@@ -134,7 +124,17 @@ QGeoCodeReply *QGeoCodingManagerEngineNokia::geocode(const QGeoAddress &address,
requestString += trimDouble(circ.radius());
}
} else {
- manualBoundsRequired = true;
+ QGeoRectangle rect = bounds.boundingGeoRectangle();
+ if (rect.isValid()) {
+ requestString += "&bbox=";
+ requestString += trimDouble(rect.topLeft().latitude());
+ requestString += ",";
+ requestString += trimDouble(rect.topLeft().longitude());
+ requestString += ";";
+ requestString += trimDouble(rect.bottomRight().latitude());
+ requestString += ",";
+ requestString += trimDouble(rect.bottomRight().longitude());
+ }
}
if (address.country().isEmpty()) {
diff --git a/src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp b/src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp
index d7e4cf8d..1ae01636 100644
--- a/src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp
+++ b/src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp
@@ -233,17 +233,28 @@ QStringList QGeoRoutingManagerEngineNokia::calculateRouteRequestString(const QGe
baseRequest += m_token;
}
- int numWaypoints = request.waypoints().size();
+ const QList<QVariantMap> metadata = request.waypointsMetadata();
+ const QList<QGeoCoordinate> waypoints = request.waypoints();
+ int numWaypoints = waypoints.size();
if (numWaypoints < 2)
return QStringList();
-
+ // Details: https://developer.here.com/documentation/routing/topics/resource-param-type-waypoint.html
for (int i = 0;i < numWaypoints;++i) {
+ const QGeoCoordinate &c = waypoints.at(i);
baseRequest += QStringLiteral("&waypoint");
baseRequest += QString::number(i);
baseRequest += QStringLiteral("=geo!");
- baseRequest += trimDouble(request.waypoints().at(i).latitude());
+ baseRequest += trimDouble(c.latitude());
baseRequest += ',';
- baseRequest += trimDouble(request.waypoints().at(i).longitude());
+ baseRequest += trimDouble(c.longitude());
+ baseRequest += QStringLiteral(";;"); // ;<TransitRadius>;<UserLabel>
+ if (metadata.size() > i) {
+ const QVariantMap &meta = metadata.at(i);
+ if (meta.contains(QStringLiteral("bearing"))) {
+ qreal bearing = meta.value(QStringLiteral("bearing")).toDouble();
+ baseRequest += ';' + QString::number(int(bearing));
+ }
+ }
}
QGeoRouteRequest::RouteOptimizations optimization = request.routeOptimization();
diff --git a/src/plugins/geoservices/nokia/qgeouriprovider.cpp b/src/plugins/geoservices/nokia/qgeouriprovider.cpp
index f36a6694..b471f7c1 100644
--- a/src/plugins/geoservices/nokia/qgeouriprovider.cpp
+++ b/src/plugins/geoservices/nokia/qgeouriprovider.cpp
@@ -61,7 +61,7 @@ QGeoUriProvider::QGeoUriProvider(
QString QGeoUriProvider::getCurrentHost() const
{
if (m_maxSubdomains) {
- QString result(m_firstSubdomain.toLatin1() + QRandomGenerator::bounded(m_maxSubdomains));
+ QString result(m_firstSubdomain.toLatin1() + QRandomGenerator::global()->bounded(m_maxSubdomains));
result += '.' + m_currentHost;
return result;
}
diff --git a/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp b/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp
index 693a80a1..6065870a 100644
--- a/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp
+++ b/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp
@@ -111,8 +111,8 @@ QGeoCodeReply *QGeoCodingManagerEngineOsm::geocode(const QString &address, int l
query.addQueryItem(QStringLiteral("format"), QStringLiteral("json"));
query.addQueryItem(QStringLiteral("accept-language"), locale().name().left(2));
//query.addQueryItem(QStringLiteral("countrycodes"), QStringLiteral("au,jp"));
- if (bounds.type() == QGeoShape::RectangleType) {
- query.addQueryItem(QStringLiteral("viewbox"), boundingBoxToLtrb(bounds));
+ if (bounds.type() != QGeoShape::UnknownType) {
+ query.addQueryItem(QStringLiteral("viewbox"), boundingBoxToLtrb(bounds.boundingGeoRectangle()));
query.addQueryItem(QStringLiteral("bounded"), QStringLiteral("1"));
}
query.addQueryItem(QStringLiteral("polygon_geojson"), QStringLiteral("1"));
diff --git a/src/plugins/geoservices/osm/qgeoroutereplyosm.cpp b/src/plugins/geoservices/osm/qgeoroutereplyosm.cpp
index 6924fda7..732e8d72 100644
--- a/src/plugins/geoservices/osm/qgeoroutereplyosm.cpp
+++ b/src/plugins/geoservices/osm/qgeoroutereplyosm.cpp
@@ -77,7 +77,7 @@ void QGeoRouteReplyOsm::networkReplyFinished()
QGeoRouteReply::Error error = parser->parseReply(routes, errorString, reply->readAll());
if (error == QGeoRouteReply::NoError) {
- setRoutes(routes.mid(0,1)); // TODO QTBUG-56426
+ setRoutes(routes.mid(0, request().numberAlternativeRoutes() + 1));
// setError(QGeoRouteReply::NoError, status); // can't do this, or NoError is emitted and does damages
setFinished(true);
} else {
diff --git a/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp b/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp
index 3f0062c0..9174ad62 100644
--- a/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp
+++ b/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp
@@ -220,15 +220,16 @@ QGeoTiledMappingManagerEngineOsm::QGeoTiledMappingManagerEngineOsm(const QVarian
if (parameters.contains(QStringLiteral("osm.mapping.providersrepository.disabled")))
disableRedirection = parameters.value(QStringLiteral("osm.mapping.providersrepository.disabled")).toBool();
- foreach (QGeoTileProviderOsm * provider, m_providers) {
+ for (QGeoTileProviderOsm * provider: qAsConst(m_providers)) {
// Providers are parented inside QGeoFileTileCacheOsm, as they are used in its destructor.
- if (disableRedirection)
+ if (disableRedirection) {
provider->disableRedirection();
-
- connect(provider, &QGeoTileProviderOsm::resolutionFinished,
- this, &QGeoTiledMappingManagerEngineOsm::onProviderResolutionFinished);
- connect(provider, &QGeoTileProviderOsm::resolutionError,
- this, &QGeoTiledMappingManagerEngineOsm::onProviderResolutionError);
+ } else {
+ connect(provider, &QGeoTileProviderOsm::resolutionFinished,
+ this, &QGeoTiledMappingManagerEngineOsm::onProviderResolutionFinished);
+ connect(provider, &QGeoTileProviderOsm::resolutionError,
+ this, &QGeoTiledMappingManagerEngineOsm::onProviderResolutionError);
+ }
}
updateMapTypes();
diff --git a/src/plugins/geoservices/osm/qgeotileproviderosm.cpp b/src/plugins/geoservices/osm/qgeotileproviderosm.cpp
index 95e5d44b..f7ab8c99 100644
--- a/src/plugins/geoservices/osm/qgeotileproviderosm.cpp
+++ b/src/plugins/geoservices/osm/qgeotileproviderosm.cpp
@@ -174,11 +174,11 @@ void QGeoTileProviderOsm::disableRedirection()
if (p->isValid() && !found) {
m_provider = p;
m_providerId = m_providerList.indexOf(p);
- m_status = Resolved;
found = true;
}
p->disconnect(this);
}
+ m_status = Resolved;
}
void QGeoTileProviderOsm::onResolutionFinished(TileProvider *provider)
diff --git a/src/plugins/geoservices/osm/qplacemanagerengineosm.cpp b/src/plugins/geoservices/osm/qplacemanagerengineosm.cpp
index dcf02b13..16632b67 100644
--- a/src/plugins/geoservices/osm/qplacemanagerengineosm.cpp
+++ b/src/plugins/geoservices/osm/qplacemanagerengineosm.cpp
@@ -134,25 +134,7 @@ QPlaceSearchReply *QPlaceManagerEngineOsm::search(const QPlaceSearchRequest &req
//queryItems.addQueryItem(QStringLiteral("accept-language"), QStringLiteral("en"));
- QGeoRectangle boundingBox;
- QGeoShape searchArea = request.searchArea();
- switch (searchArea.type()) {
- case QGeoShape::CircleType: {
- QGeoCircle c(searchArea);
- qreal radius = c.radius();
- if (radius < 0)
- radius = 50000;
-
- boundingBox = QGeoRectangle(c.center().atDistanceAndAzimuth(radius, -45),
- c.center().atDistanceAndAzimuth(radius, 135));
- break;
- }
- case QGeoShape::RectangleType:
- boundingBox = searchArea;
- break;
- default:
- ;
- }
+ QGeoRectangle boundingBox = request.searchArea().boundingGeoRectangle();
if (!boundingBox.isEmpty()) {
queryItems.addQueryItem(QStringLiteral("bounded"), QStringLiteral("1"));
diff --git a/src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java b/src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java
index edc39bd7..1ea0c071 100644
--- a/src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java
+++ b/src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java
@@ -229,8 +229,11 @@ public class QtPositioning implements LocationListener
static private void removeActiveListener(int androidClassKey)
{
QtPositioning listener = runningListeners.remove(androidClassKey);
- locationManager.removeUpdates(listener);
- listener.setActiveLooper(false);
+
+ if (listener != null) {
+ locationManager.removeUpdates(listener);
+ listener.setActiveLooper(false);
+ }
}
diff --git a/src/plugins/position/android/src/jnipositioning.cpp b/src/plugins/position/android/src/jnipositioning.cpp
index e79e64d5..9bef8d36 100644
--- a/src/plugins/position/android/src/jnipositioning.cpp
+++ b/src/plugins/position/android/src/jnipositioning.cpp
@@ -109,7 +109,7 @@ namespace AndroidPositioning {
QGeoPositionInfoSourceAndroid *src = qobject_cast<QGeoPositionInfoSourceAndroid *>(obj);
Q_ASSERT(src);
do {
- key = QRandomGenerator::get32();
+ key = QRandomGenerator::global()->generate();
} while (idToPosSource()->contains(key));
idToPosSource()->insert(key, src);
@@ -117,7 +117,7 @@ namespace AndroidPositioning {
QGeoSatelliteInfoSourceAndroid *src = qobject_cast<QGeoSatelliteInfoSourceAndroid *>(obj);
Q_ASSERT(src);
do {
- key = QRandomGenerator::get32();
+ key = QRandomGenerator::global()->generate();
} while (idToSatSource()->contains(key));
idToSatSource()->insert(key, src);
diff --git a/src/positioning/doc/snippets/cpp/cppqml.cpp b/src/positioning/doc/snippets/cpp/cppqml.cpp
index 5954ecf6..3db55714 100644
--- a/src/positioning/doc/snippets/cpp/cppqml.cpp
+++ b/src/positioning/doc/snippets/cpp/cppqml.cpp
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtPositioning module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/positioning/doc/snippets/cpp/main.cpp b/src/positioning/doc/snippets/cpp/main.cpp
index 7e893f53..285bf6af 100644
--- a/src/positioning/doc/snippets/cpp/main.cpp
+++ b/src/positioning/doc/snippets/cpp/main.cpp
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtPositioning module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/positioning/doc/snippets/doc_src_qtpositioning.qml b/src/positioning/doc/snippets/doc_src_qtpositioning.qml
index 1e5e4f9f..73b2fd56 100644
--- a/src/positioning/doc/snippets/doc_src_qtpositioning.qml
+++ b/src/positioning/doc/snippets/doc_src_qtpositioning.qml
@@ -1,12 +1,22 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/positioning/doc/src/cpp-position.qdoc b/src/positioning/doc/src/cpp-position.qdoc
index 34f39bdc..085aecd1 100644
--- a/src/positioning/doc/src/cpp-position.qdoc
+++ b/src/positioning/doc/src/cpp-position.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/positioning/doc/src/cpp-qml-positioning.qdoc b/src/positioning/doc/src/cpp-qml-positioning.qdoc
index 9245c171..6ae3f265 100644
--- a/src/positioning/doc/src/cpp-qml-positioning.qdoc
+++ b/src/positioning/doc/src/cpp-qml-positioning.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/positioning/doc/src/qml-position.qdoc b/src/positioning/doc/src/qml-position.qdoc
index 4b338fd2..7ca7eb1b 100644
--- a/src/positioning/doc/src/qml-position.qdoc
+++ b/src/positioning/doc/src/qml-position.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/positioning/doc/src/qtpositioning-examples.qdoc b/src/positioning/doc/src/qtpositioning-examples.qdoc
index 57d129a0..74992d93 100644
--- a/src/positioning/doc/src/qtpositioning-examples.qdoc
+++ b/src/positioning/doc/src/qtpositioning-examples.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/positioning/doc/src/qtpositioning-plugins.qdoc b/src/positioning/doc/src/qtpositioning-plugins.qdoc
index 4a56b65d..37d25fc5 100644
--- a/src/positioning/doc/src/qtpositioning-plugins.qdoc
+++ b/src/positioning/doc/src/qtpositioning-plugins.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/positioning/doc/src/qtpositioning-qml.qdoc b/src/positioning/doc/src/qtpositioning-qml.qdoc
index 0c947779..e839dc48 100644
--- a/src/positioning/doc/src/qtpositioning-qml.qdoc
+++ b/src/positioning/doc/src/qtpositioning-qml.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/positioning/doc/src/qtpositioning.qdoc b/src/positioning/doc/src/qtpositioning.qdoc
index d5b0eb39..81de8bec 100644
--- a/src/positioning/doc/src/qtpositioning.qdoc
+++ b/src/positioning/doc/src/qtpositioning.qdoc
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
@@ -11,8 +11,8 @@
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
@@ -20,7 +20,7 @@
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
diff --git a/src/positioning/positioning.pro b/src/positioning/positioning.pro
index 49cb9b48..666e9b1a 100644
--- a/src/positioning/positioning.pro
+++ b/src/positioning/positioning.pro
@@ -59,6 +59,7 @@ PRIVATE_HEADERS += \
qdoublematrix4x4_p.h \
qgeopath_p.h \
qgeopolygon_p.h \
+ qgeocoordinateobject_p.h \
qclipperutils_p.h
SOURCES += \
@@ -86,7 +87,8 @@ SOURCES += \
qlocationdata_simulator.cpp \
qwebmercator.cpp \
qdoublematrix4x4.cpp \
- qclipperutils.cpp
+ qclipperutils.cpp \
+ qgeocoordinateobject.cpp
HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS
diff --git a/src/positioning/qgeocoordinate.cpp b/src/positioning/qgeocoordinate.cpp
index 7a286f8a..12f5ad52 100644
--- a/src/positioning/qgeocoordinate.cpp
+++ b/src/positioning/qgeocoordinate.cpp
@@ -39,6 +39,7 @@
#include "qgeocoordinate.h"
#include "qgeocoordinate_p.h"
#include "qlocationutils_p.h"
+#include "qgeocoordinateobject_p.h"
#include <QDateTime>
#include <QHash>
@@ -250,6 +251,16 @@ QGeoCoordinate::QGeoCoordinate(const QGeoCoordinate &other)
: d(other.d)
{}
+QGeoCoordinate::QGeoCoordinate(const QGeoCoordinateObject &coordinateoObject) : d(coordinateoObject.coordinate().d)
+{
+}
+
+QGeoCoordinate::QGeoCoordinate(const QGeoCoordinateObject *coordinateObject) : d(new QGeoCoordinatePrivate)
+{
+ if (coordinateObject)
+ d = coordinateObject->coordinate().d;
+}
+
/*!
Assigns \a other to this coordinate and returns a reference to this coordinate.
*/
@@ -262,6 +273,18 @@ QGeoCoordinate &QGeoCoordinate::operator=(const QGeoCoordinate &other)
return (*this);
}
+QGeoCoordinate &QGeoCoordinate::operator=(const QGeoCoordinateObject &coordinateoObject)
+{
+ d = coordinateoObject.coordinate().d;
+ return (*this);
+}
+
+QGeoCoordinate &QGeoCoordinate::operator=(const QGeoCoordinateObject *coordinateoObject)
+{
+ d = coordinateoObject->coordinate().d;
+ return (*this);
+}
+
/*!
Destroys the coordinate object.
*/
@@ -291,6 +314,19 @@ bool QGeoCoordinate::operator==(const QGeoCoordinate &other) const
}
/*!
+
+*/
+bool QGeoCoordinate::operator==(const QGeoCoordinateObject &other) const
+{
+ return (*this == other.coordinate());
+}
+
+bool QGeoCoordinate::operator==(const QGeoCoordinateObject *other) const
+{
+ return (*this == other->coordinate());
+}
+
+/*!
\fn bool QGeoCoordinate::operator!=(const QGeoCoordinate &other) const;
Returns true if the latitude, longitude or altitude of this
diff --git a/src/positioning/qgeocoordinate.h b/src/positioning/qgeocoordinate.h
index ddb6274e..c5497dae 100644
--- a/src/positioning/qgeocoordinate.h
+++ b/src/positioning/qgeocoordinate.h
@@ -51,6 +51,7 @@ class QDebug;
class QDataStream;
class QGeoCoordinatePrivate;
+class QGeoCoordinateObject;
class Q_POSITIONING_EXPORT QGeoCoordinate
{
Q_GADGET
@@ -81,14 +82,26 @@ public:
QGeoCoordinate(double latitude, double longitude);
QGeoCoordinate(double latitude, double longitude, double altitude);
QGeoCoordinate(const QGeoCoordinate &other);
+ QGeoCoordinate(const QGeoCoordinateObject &coordinateoObject);
+ QGeoCoordinate(const QGeoCoordinateObject *coordinateObject);
~QGeoCoordinate();
QGeoCoordinate &operator=(const QGeoCoordinate &other);
+ QGeoCoordinate &operator=(const QGeoCoordinateObject &coordinateObject);
+ QGeoCoordinate &operator=(const QGeoCoordinateObject *coordinateoObject);
bool operator==(const QGeoCoordinate &other) const;
+ bool operator==(const QGeoCoordinateObject &other) const;
+ bool operator==(const QGeoCoordinateObject *other) const;
inline bool operator!=(const QGeoCoordinate &other) const {
return !operator==(other);
}
+ inline bool operator!=(const QGeoCoordinateObject &other) const {
+ return !operator==(other);
+ }
+ inline bool operator!=(const QGeoCoordinateObject *other) const {
+ return !operator==(*other);
+ }
bool isValid() const;
CoordinateType type() const;
diff --git a/src/positioning/qgeocoordinateobject.cpp b/src/positioning/qgeocoordinateobject.cpp
new file mode 100644
index 00000000..7900e578
--- /dev/null
+++ b/src/positioning/qgeocoordinateobject.cpp
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtPositioning module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgeocoordinateobject_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*
+
+ Note: This class only purpose is to enable conversion between QGeoCoordinate and QDeclarativeGeoWaypoint.
+ Since QGeoCoordinate lives in the QtPositioning module, this class acts as a base for QDeclarativeGeoWaypoint,
+ and contains the bare minimum to convert/compare to a QGeoCoordinate
+
+*/
+
+QGeoCoordinateObject::QGeoCoordinateObject(QObject *parent) : QObject(parent)
+{
+}
+
+QGeoCoordinateObject::QGeoCoordinateObject(const QGeoCoordinate &c, QObject *parent) : QObject(parent)
+{
+ setCoordinate(c);
+}
+
+QGeoCoordinateObject::~QGeoCoordinateObject()
+{
+
+}
+
+bool QGeoCoordinateObject::operator==(const QGeoCoordinateObject &other) const
+{
+ return m_coordinate == other.m_coordinate;
+}
+
+bool QGeoCoordinateObject::operator==(const QGeoCoordinate &other) const
+{
+ return m_coordinate == other;
+}
+
+QGeoCoordinate QGeoCoordinateObject::coordinate() const
+{
+ return m_coordinate;
+}
+
+void QGeoCoordinateObject::setCoordinate(const QGeoCoordinate &c)
+{
+ if (c == m_coordinate)
+ return;
+
+ m_coordinate = c;
+ emit coordinateChanged();
+}
+
+QT_END_NAMESPACE
+
+
diff --git a/src/positioning/qgeocoordinateobject_p.h b/src/positioning/qgeocoordinateobject_p.h
new file mode 100644
index 00000000..7061c28f
--- /dev/null
+++ b/src/positioning/qgeocoordinateobject_p.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtPositioning module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QGEOCOORDINATEOBJECT_P_H
+#define QGEOCOORDINATEOBJECT_P_H
+
+#include <QtPositioning/private/qpositioningglobal_p.h>
+#include <QObject>
+#include <QGeoCoordinate>
+#include <QVariantMap>
+
+QT_BEGIN_NAMESPACE
+
+class Q_POSITIONING_PRIVATE_EXPORT QGeoCoordinateObject : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QGeoCoordinate coordinate READ coordinate WRITE setCoordinate NOTIFY coordinateChanged)
+
+public:
+ QGeoCoordinateObject(QObject *parent = 0);
+ QGeoCoordinateObject(const QGeoCoordinate &c, QObject *parent = 0);
+ virtual ~QGeoCoordinateObject();
+
+ bool operator==(const QGeoCoordinate &other) const;
+ bool operator==(const QGeoCoordinateObject &other) const;
+ inline bool operator!=(const QGeoCoordinate &other) const {
+ return !operator==(other);
+ }
+ inline bool operator!=(const QGeoCoordinateObject &other) const {
+ return !operator==(other);
+ }
+
+ QGeoCoordinate coordinate() const;
+ void setCoordinate(const QGeoCoordinate &c);
+
+Q_SIGNALS:
+ void coordinateChanged();
+
+protected:
+ QGeoCoordinate m_coordinate;
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(QGeoCoordinateObject*)
+
+#endif // QGEOCOORDINATEOBJECT_P_H
diff --git a/src/positioning/qgeopath.cpp b/src/positioning/qgeopath.cpp
index 5e7a4077..6fd02d77 100644
--- a/src/positioning/qgeopath.cpp
+++ b/src/positioning/qgeopath.cpp
@@ -176,6 +176,9 @@ bool QGeoPath::operator!=(const QGeoPath &other) const
return !(*d == *other.d_func());
}
+/*!
+ Sets all the elements of the path.
+*/
void QGeoPath::setPath(const QList<QGeoCoordinate> &path)
{
Q_D(QGeoPath);
@@ -183,14 +186,41 @@ void QGeoPath::setPath(const QList<QGeoCoordinate> &path)
}
/*!
- Returns all the elements. Equivalent to QGeoShape::center().
- The center coordinate, in case of a QGeoPath, is the center of its bounding box.
+ Returns all the elements of the path.
*/
const QList<QGeoCoordinate> &QGeoPath::path() const
{
Q_D(const QGeoPath);
return d->path();
}
+/*!
+ Sets all the elements of the path.
+
+ \internal
+*/
+void QGeoPath::setVariantPath(const QVariantList &path)
+{
+ Q_D(QGeoPath);
+ QList<QGeoCoordinate> p;
+ for (const auto &c: path) {
+ if (c.canConvert<QGeoCoordinate>())
+ p << c.value<QGeoCoordinate>();
+ }
+ d->setPath(p);
+}
+/*!
+ Returns all the elements of the path.
+
+ \internal
+*/
+QVariantList QGeoPath::variantPath() const
+{
+ Q_D(const QGeoPath);
+ QVariantList p;
+ for (const auto &c: d->path())
+ p << QVariant::fromValue(c);
+ return p;
+}
void QGeoPath::setWidth(const qreal &width)
{
diff --git a/src/positioning/qgeopath.h b/src/positioning/qgeopath.h
index ad41c23c..178ac3bf 100644
--- a/src/positioning/qgeopath.h
+++ b/src/positioning/qgeopath.h
@@ -41,6 +41,7 @@
#define QGEOPATH_H
#include <QtPositioning/QGeoShape>
+#include <QtCore/QVariantList>
QT_BEGIN_NAMESPACE
@@ -50,7 +51,7 @@ class QGeoPathPrivate;
class Q_POSITIONING_EXPORT QGeoPath : public QGeoShape
{
Q_GADGET
- Q_PROPERTY(QList<QGeoCoordinate> path READ path WRITE setPath)
+ Q_PROPERTY(QVariantList path READ variantPath WRITE setVariantPath)
Q_PROPERTY(qreal width READ width WRITE setWidth)
public:
@@ -71,6 +72,8 @@ public:
void setPath(const QList<QGeoCoordinate> &path);
const QList<QGeoCoordinate> &path() const;
+ void setVariantPath(const QVariantList &path);
+ QVariantList variantPath() const;
void setWidth(const qreal &width);
qreal width() const;
diff --git a/src/positioningquick/positioningquick.pro b/src/positioningquick/positioningquick.pro
new file mode 100644
index 00000000..75bd68a3
--- /dev/null
+++ b/src/positioningquick/positioningquick.pro
@@ -0,0 +1,10 @@
+TARGET = QtPositioningQuick
+QT = quick-private positioning-private qml-private core-private
+CONFIG += simd optimize_full
+
+INCLUDEPATH += $$PWD
+
+SOURCES += $$files(*.cpp)
+HEADERS += $$files(*.h)
+
+load(qt_module)
diff --git a/src/imports/positioning/qdeclarativeposition.cpp b/src/positioningquick/qdeclarativeposition.cpp
index b543700b..7e72f358 100644
--- a/src/imports/positioning/qdeclarativeposition.cpp
+++ b/src/positioningquick/qdeclarativeposition.cpp
@@ -195,6 +195,11 @@ void QDeclarativePosition::setPosition(const QGeoPositionInfo &info)
emit magneticVariationValidChanged();
}
+const QGeoPositionInfo &QDeclarativePosition::position() const
+{
+ return m_info;
+}
+
/*!
\qmlproperty coordinate Position::coordinate
diff --git a/src/imports/positioning/qdeclarativeposition_p.h b/src/positioningquick/qdeclarativeposition_p.h
index 208d81cc..141c37b7 100644
--- a/src/imports/positioning/qdeclarativeposition_p.h
+++ b/src/positioningquick/qdeclarativeposition_p.h
@@ -56,11 +56,12 @@
#include <QtCore/QObject>
#include <QtCore/QDateTime>
#include <QtQml/qqml.h>
+#include <QtPositioningQuick/private/qpositioningquickglobal_p.h>
#include <QtPositioning/QGeoPositionInfo>
QT_BEGIN_NAMESPACE
-class QDeclarativePosition : public QObject
+class Q_POSITIONINGQUICK_PRIVATE_EXPORT QDeclarativePosition : public QObject
{
Q_OBJECT
@@ -114,6 +115,7 @@ public:
double magneticVariation() const;
void setPosition(const QGeoPositionInfo &info);
+ const QGeoPositionInfo &position() const;
Q_SIGNALS:
void latitudeValidChanged();
diff --git a/src/imports/positioning/qdeclarativepositionsource.cpp b/src/positioningquick/qdeclarativepositionsource.cpp
index 05232d51..cfb1df29 100644
--- a/src/imports/positioning/qdeclarativepositionsource.cpp
+++ b/src/positioningquick/qdeclarativepositionsource.cpp
@@ -259,11 +259,11 @@ void QDeclarativePositionSource::setNmeaSource(const QUrl &nmeaSource)
// ways: "file:///", "qrc:///", "/", "" in platform dependent manner.
QString localFileName = nmeaSource.toString();
if (!QFile::exists(localFileName)) {
- if (localFileName.startsWith("qrc:///")) {
+ if (localFileName.startsWith(QStringLiteral("qrc:///"))) {
localFileName.remove(0, 7);
- } else if (localFileName.startsWith("file:///")) {
+ } else if (localFileName.startsWith(QStringLiteral("file:///"))) {
localFileName.remove(0, 7);
- } else if (localFileName.startsWith("qrc:/")) {
+ } else if (localFileName.startsWith(QStringLiteral("qrc:/"))) {
localFileName.remove(0, 5);
}
if (!QFile::exists(localFileName) && localFileName.startsWith('/')) {
@@ -289,7 +289,7 @@ void QDeclarativePositionSource::setNmeaSource(const QUrl &nmeaSource)
delete m_nmeaFile;
m_nmeaFile = new QFile(localFileName);
if (!m_nmeaFile->exists()) {
- localFileName.prepend(":");
+ localFileName.prepend(':');
m_nmeaFile->setFileName(localFileName);
}
if (m_nmeaFile->exists()) {
@@ -699,6 +699,11 @@ QDeclarativePositionSource::SourceError QDeclarativePositionSource::sourceError(
return m_sourceError;
}
+QGeoPositionInfoSource *QDeclarativePositionSource::positionSource() const
+{
+ return m_positionSource;
+}
+
void QDeclarativePositionSource::componentComplete()
{
if (!m_positionSource) {
diff --git a/src/imports/positioning/qdeclarativepositionsource_p.h b/src/positioningquick/qdeclarativepositionsource_p.h
index f7852346..bb9b618a 100644
--- a/src/imports/positioning/qdeclarativepositionsource_p.h
+++ b/src/positioningquick/qdeclarativepositionsource_p.h
@@ -56,6 +56,7 @@
#include <QtCore/QObject>
#include <QtNetwork/QAbstractSocket>
#include <QtQml/QQmlParserStatus>
+#include <QtPositioningQuick/private/qpositioningquickglobal_p.h>
#include <QtPositioning/QGeoPositionInfoSource>
QT_BEGIN_NAMESPACE
@@ -63,7 +64,7 @@ QT_BEGIN_NAMESPACE
class QFile;
class QTcpSocket;
-class QDeclarativePositionSource : public QObject, public QQmlParserStatus
+class Q_POSITIONINGQUICK_PRIVATE_EXPORT QDeclarativePositionSource : public QObject, public QQmlParserStatus
{
Q_OBJECT
@@ -120,6 +121,7 @@ public:
PositioningMethods supportedPositioningMethods() const;
PositioningMethods preferredPositioningMethods() const;
SourceError sourceError() const;
+ QGeoPositionInfoSource *positionSource() const;
// Virtuals from QQmlParserStatus
void classBegin() { }
diff --git a/src/positioningquick/qpositioningquickglobal.h b/src/positioningquick/qpositioningquickglobal.h
new file mode 100644
index 00000000..214e4628
--- /dev/null
+++ b/src/positioningquick/qpositioningquickglobal.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtPositioning module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QPOSITIONINGQUICKGLOBAL_H
+#define QPOSITIONINGQUICKGLOBAL_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_STATIC
+# if defined(QT_BUILD_POSITIONINGQUICK_LIB)
+# define Q_POSITIONINGQUICK_EXPORT Q_DECL_EXPORT
+# else
+# define Q_POSITIONINGQUICK_EXPORT Q_DECL_IMPORT
+# endif
+#else
+# define Q_POSITIONINGQUICK_EXPORT
+#endif
+
+QT_END_NAMESPACE
+
+#endif // QPOSITIONINGQUICKGLOBAL_H
diff --git a/src/positioningquick/qpositioningquickglobal_p.h b/src/positioningquick/qpositioningquickglobal_p.h
new file mode 100644
index 00000000..46e40f25
--- /dev/null
+++ b/src/positioningquick/qpositioningquickglobal_p.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtPositioning module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QPOSITIONINGQUICKGLOBAL_P_H
+#define QPOSITIONINGQUICKGLOBAL_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qpositioningquickglobal.h"
+
+QT_BEGIN_NAMESPACE
+
+#define Q_POSITIONINGQUICK_PRIVATE_EXPORT Q_POSITIONINGQUICK_EXPORT
+
+QT_END_NAMESPACE
+
+#endif // QPOSITIONINGQUICKGLOBAL_P_H
diff --git a/src/src.pro b/src/src.pro
index 0c0bf50b..74c5ac4c 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -1,19 +1,24 @@
TEMPLATE = subdirs
-SUBDIRS += 3rdparty/clip2tri 3rdparty/clipper 3rdparty/poly2tri
-3rdparty/clip2tri.depends = 3rdparty/clipper 3rdparty/poly2tri
+clip2tri.subdir = 3rdparty/clip2tri
+poly2tri.subdir = 3rdparty/poly2tri
+clipper.subdir = 3rdparty/clipper
+
+SUBDIRS += clip2tri clipper poly2tri
+clip2tri.depends = clipper poly2tri
SUBDIRS += positioning
-positioning.depends = 3rdparty/clip2tri
+positioning.depends = clip2tri
qtHaveModule(quick) {
- SUBDIRS += location
- location.depends += positioning 3rdparty/clip2tri
+ SUBDIRS += positioningquick location
+ positioningquick.depends += positioning
+ location.depends += positioning clip2tri
plugins.depends += location
SUBDIRS += imports
- imports.depends += positioning location
+ imports.depends += positioningquick positioning location
}
plugins.depends += positioning