woosmap_flutter
The Woosmap Flutter SDK is a library that embeds interactive maps directly into your application. You can also add stores overlay to the map to call out points of interest and get relative information.
The SDK offers an interface to manage the Indoor Mapview and subscribe to events on the map.
Please get your email and token from your pro account. You may ask for one if necessary, or you can test with our developers' credentials if you lack time.
Android | iOS | |
---|---|---|
Support SDK | 33+ | 13.0+ |
Usage
Add woosmap_flutter as a dependency in your pubspec.yaml
file.
How to display Map
- Instantiating a WoosmapMapViewWidget.
Note: Default constructor of
WoosmapMapViewWidget
is deprecated. Though it will work the way it used to in past, we suggest you use newWoosmapMapViewWidget.create
to createWoosmapMapViewWidget
object.
MarkerOptions markerOptions = MarkerOptions(position: LatLng(lat: 51.522, lng: -0.13));
markerOptions.icon = WoosIcon(url: "https://images.woosmap.com/dot-marker.png", scaledSize: WoosSize(height: 64, width: 46));
testMarker = Marker.create(
markerOptions,
_controller!,
click: (value) {
txtLogController?.text = "click, ${txtLogController?.text}";
},
mouseover: (value) {
txtLogController?.text = "mouseover, ${txtLogController?.text}";
},
mouseout: (value) {
txtLogController?.text = "mouseout, ${txtLogController?.text}";
},
clickable_changed: (value) {
txtLogController?.text = "clickable_changed, ${txtLogController?.text}";
},
cursor_changed: (value) {
txtLogController?.text = "cursor_changed, ${txtLogController?.text}";
},
icon_changed: (value) {
txtLogController?.text = "icon_changed, ${txtLogController?.text}";
},
position_changed: (value) {
txtLogController?.text = "position_changed, ${txtLogController?.text}";
},
dragstart: (value) {
txtLogController?.text = "dragstart, ${txtLogController?.text}";
},
drag: (value) {
txtLogController?.text = "drag, ${txtLogController?.text}";
},
dragend: (value) {
txtLogController?.text = "dragend, ${txtLogController?.text}";
},
draggable_changed: (value) {
txtLogController?.text = "draggable_changed, ${txtLogController?.text}";
},
visible_changed: (value) {
txtLogController?.text = "visible_changed, ${txtLogController?.text}";
},
zIndex_changed: (value) {
txtLogController?.text = "zIndex_changed, ${txtLogController?.text}";
},
);
testMarker?.add();
Building Directions Request
You can calculate directions and plot by using the WoosmapMapViewWidget.route
method. This method is an interface to the Route endpoint of Woosmap Distance API. This service compute travel distance, time and path for a pair of origin and destination.
You may either display these directions results using custom overlays or use the WoosmapMapViewWidget.setRoute
method to render these results.
WoosmapMapViewWidget.create(
wooskey: "<<YOUR WOOSMAP KEY>>",
onRef: (p0) async {
_controller = p0;
},
mapOptions: MapOptions(
center: LatLng.fromJson({"lat": 51.52, "lng": -0.13}),
zoom: 5
),
routeIndex_changed: (index) {
debugPrint(jsonEncode(index));
},
)
To display route on map.
_controller?.route(DirectionRequest(
origin: LatLng(lat: 48.86288, lng: 2.34946),
destination: LatLng(lat: 52.52457, lng: 13.42347),
unitSystem: UnitSystem.metric,
travelMode: TravelMode.driving,
provideRouteAlternatives: true
))
.then((route) {
_controller?.setRoute(route: route);
});
To clear displayed route on map.
_controller?.setRoute(route: null);
Please check the javascript guide for more implementation. javascript guide
How to display a Indoor maps
- Instantiating a WoosmapMapViewWidget.
Note: Default constructor of
WoosmapMapViewWidget
is deprecated. We suggest you use newWoosmapMapViewWidget.create
which acceptsIndoorWidgetOptions
andIndoorRendererOptions
objects.
WoosmapMapViewWidget.create(
wooskey: AppConstants.of(context)?.wooskey ?? "",
widget: true,
activate_indoor_product: true,
indoorRendererConfiguration: IndoorRendererOptions(
centerMap: true,
defaultFloor: 3
),
indoorWidgetConfiguration: IndoorWidgetOptions (
units: UnitSystem.metric,
ui: IndoorWidgetOptionsUI(
primaryColor: "#318276",
secondaryColor: "#004651"
),
),
onRef: (p0) async {
_controller = p0;
reloadMenu();
},
indoor_venue_loaded: (message) {
debugPrint(jsonEncode(message));
},
indoor_feature_selected: (message) {
debugPrint(jsonEncode(message));
},
indoor_level_changed: (message) {
debugPrint("$message");
},
indoor_user_location: (message) {
debugPrint(jsonEncode(message));
},
indoor_directions: (message) {
_controller?.setDirections(message);
debugPrint(jsonEncode(message));
},
indoor_highlight_step: (message) {
debugPrint(jsonEncode(message));
},
);
- Accessing various functions in
WoosmapMapViewWidget
- Load Indoor map
_controller.setVenue('wgs_mtp');
- Show all venue
_controller.loadIndoorMap('');
- Change Indoor Floor
_controller.setFloor(3);
- Display use position on map
_controller.setUserLocation(43.606573820824764, 3.92177514731884, 3, 0, true);
- Showing Information about any indoor area
_controller.highlightFeatureByRef('tropiques');
- Change Direction mode (Widget specific)
_controller.setDirectionsMode('wheelchair');
- Filter POI to display only labels and icons of POIs which are matching the filters
_controller.filterPois(advancedFilter: 'room:=meeting');
you can also pass an optional boolean parameter ignoreZoomRules
. If true, ignores the zoom rules for the filtered POIs. Default value if false.
- Fetching and displaying direction
Note: Class
DirectionParameter
is deprecated. We suggest you use newIndoorDirectionRequest
instead.
By using Lat/Lng
_controller.directions(IndoorDirectionRequest(
venueId: 'wgs_mtp',
origin: LatLng(lat: 43.60664187325, lng: 3.921814671575),
originLevel: 3,
destination: LatLng(lat: 43.60665215333, lng: 3.921680093435),
destinationLevel: 3,
language: "en",
units: UnitSystem.metric,
mode: "wheelchair",
))
.then((route) => {_controller.setDirections(route)});
By using Poi ID
_controller.directions(IndoorDirectionRequest(
venueId: 'wgs_mtp',
originId: 3694972,
destinationId: 3694921,
language: "en",
units: UnitSystem.metric,
mode: "wheelchair",
))
.then((route) => {_controller?.setDirections(route)});
By using Poi Ref
_controller.directions(IndoorDirectionRequest(
venueId: 'wgs_mtp',
originId: "ref:meeting002",
destinationId: "ref:tropiques",
language: "en",
units: UnitSystem.metric,
mode: "wheelchair"
))
.then((route) => {_controller.setDirections(route)});
By using WayPoint
Valid Waypoint formats are lat,lng,level
or poiid
or ref:poiref
_controller.directions(IndoorDirectionRequest(
venueId: 'wgs_mtp',
originId: "ref:meeting002",
destinationId: "ref:tropiques",
waypoints: ["ref:meeting001", "ref:tropiques"]
))
.then((route) => {_controller.setDirections(route)});
Indoor Navigation
To initiate navigation experince you need to call following methods of the WoosmapController
object in the same order as given below.
-
directions
- As explained in the earlier sectiondirections
method will find the route between two points inside an indoor venue. This method returns aroute
object upon it's completion. -
setDirections
- This method will plot the givenroute
on the map. You can pass theroute
object returned bydirections
method. -
startNavigation
- This method will initiate the "Turn By Turn" navigation experience.
_controller.startNavigation();
exitNavigation
- This method will result in the exit from "Turn By Turn" navigation mode.
_controller.exitNavigation();
clearDirections
- Removes the plotted path on the map. If the navigation experience is started then it first exits from the navigation then removes the path.
_controller.clearDirections();
Please note that setDirections
method will no longer trigger navigation. Method startNavigation
should explicitly be called to initiate the navigation.
Supporting Indoor function
Future<void> setUserLocation({required double lat,required double lng,required int level,int? bearing,bool? forcefocus})
-: Set the current user location. A blue dot is going to be displayed.
_controller.setUserLocation(
lat: 43.606573820824764,
lng: 3.92177514731884,
level: 3,
forcefocus: true);
Future<IndoorPosition> getUserLocation()
-: Returns the current user location.
IndoorPosition currentPosition =
await _controller.getUserLocation();
-
Future<bool> isUserInsideVenue({required num lat, required num lng})
-: Detects whether user location is found inside venue’s bounding boxbool? status; try { IndoorPosition? currentPosition = await _controller.getUserLocation(); if (currentPosition == null) return null; status = await _controller.isUserInsideVenue( lat: currentPosition.position.lat, lng: currentPosition.position.lng); } catch (e) { return null; }
-
Future<int> getLevel()
:- Get the displayed level.
result = await _controller.getLevel();
Future<void> setVenue(String venueId)
-: Renders map with the selected venue
_controller.setVenue(`test`);
-
Future<void> setFloor(int floor)
-: Sets the floor for the venue_controller?.setFloor(3);
-
Future<void> highlightFeatureByRef({required String byref, WoosPadding? padding})
-: Renders a map with a POI highlighted by ref_controller?.highlightFeatureByRef( byref: 'tropiques', padding: WoosPadding(top: 300, bottom: 0, left: 0, right: 0));
-
Future<void> highlightFeature({required String featureId, required bool silent, WoosPadding? padding})
-: Renders a map with a POI highlighted by pk or id
_controller.highlightFeature(
featureId: '34349', silent: false);
Future<void> setDirectionsMode(String mode)
-: Sets the routing profile (or directions mode) (‘security’ | ‘wheelchair’) for way finding
_controller.setDirectionsMode('wheelchair');
Future<void> filterPois({required String advancedFilter, bool ignoreZoomRules = false})
-: Filter the map to display only labels and icons of POIs which are matching the filters
_controller.filterPois(advancedFilter: 'room:=meeting');
Supporting IndoorWidget function
11. Future<void> showItinerary({dynamic origin, dynamic destination})
-: Opens the widget’s panel in itinerary mode.
_controller.showItinerary();
_controller.showItinerary(
origin: '9754000', destination: '9758902');
_controller.showItinerary(
origin: '43.606573820824764,3.92177514731884,3', destination: '9758902');
_controller.showItinerary(
origin: '<<User position>>', destination: '9758902');
How to add a store overlay
- Instantiating a WoosmapMapViewWidget.
WoosmapMapViewWidget.create(
wooskey: "<<YOUR WOOSMAP KEY>>",
onRef: (p0) async {
_controller = p0;
},
mapOptions: MapOptions(
center: LatLng.fromJson({"lat": 19.115932, "lng": 72.907852}),
zoom: 10
),
click: (message) {
debugPrint("idle");
},
bounds_changed: () {
debugPrint("idle");
},
center_changed: () {
debugPrint("idle");
},
dblclick: (m) {
debugPrint("idle");
},
drag: () {
debugPrint("idle");
},
dragend: () {
debugPrint("idle");
},
dragstart: () {
debugPrint("idle");
},
idle: () {
debugPrint("idle");
},
mousemove: (x) {
debugPrint("idle");
},
mouseout: (x) {
debugPrint("idle");
},
mouseover: (x) {
debugPrint("idle");
},
rightclick: (x) {
debugPrint("idle");
},
zoom_changed: () {
debugPrint("idle");
},
);
- Configuring store overlay.
Note: Default constructor of
StoreOverlay
is deprecated. Though it will work the way it used to in past, we suggest you use newStoreOverlay.create
to createStoreOverlay
object.
Using StoreOverlay.create
///Defined TypedStyleRule
TypedStyleRule typedStyleRule = TypedStyleRule(
color: "#1D1D1D",
icon: WoosIcon(
url: "https://images.woosmap.com/starbucks-marker-black.svg",
scaledSize: WoosSize(width: 34, height: 40)
),
type: "takeaway",
selectedIcon: WoosIcon(
url: "https://images.woosmap.com/starbucks-marker-selected.svg",
scaledSize: WoosSize(width: 43, height: 50)
)
);
///Defined StyleRule
StyleRule styleRule = StyleRule(
color: "#008a2f",
icon: WoosIcon(
url: "https://images.woosmap.com/starbucks-marker.svg",
scaledSize: WoosSize(width: 34, height: 40)
),
size: 8,
minSize: 1,
selectedIcon: WoosIcon(
url: "https://images.woosmap.com/starbucks-marker-selected.svg",
scaledSize: WoosSize(width: 50, height: 43)
)
);
///Create Style with StyleRule and TypedStyleRule
Style style = Style(
breakPoint: 14,
defaultStyleRule: styleRule,
rules: [typedStyleRule]
);
storesOverlay = StoreOverlay.create(style, _controller!);
storesOverlay?.add();
Android Platform Settings
This plugin uses Platform Views to embed the Android’s WebView within the Flutter app.
You should however make sure to set the correct minSdkVersion
in android/app/build.gradle
if it was previously lower than 19:
android {
compileSdkVersion 33
defaultConfig {
minSdkVersion 19
targetSdkVersion 33
}
}
Add the following permission inside the manifest tag in the AndroidManifest.xml
file located at android/app/src/main
.
<uses-permission android:name="android.permission.INTERNET"/>
Services
The Woosmap API is a RESTful API built on HTTP. It has predictable resource URLs. It returns HTTP response codes to indicate errors. It also accepts and returns JSON in the HTTP body.
Localities API
Woosmap Localities API is a web service that returns a great amount of geographical places in response to an HTTP request. Among others are city names, postal codes, suburbs, addresses or airports. Request is done over HTTPS using GET. Response is formatted as JSON. You must specify a key in your request, included as the value of a key parameter for your public key or private_key for your private key. This key identifies your application for purposes of quota management.
-
Autocomplete for Localities
Autocomplete on worldwide suggestions for a for text-based geographic searches. It can match on full words as well as substrings. You can therefore send queries as the user types, to provide on-the-fly city names, postal codes or suburb name suggestions.
Request parameters
input
: The text string on which to search, for example: "london"types
: "locality" "postal_code" "address" "admin_level" "country" "airport" "train_station" "metro_station" "shopping" "museum" "tourist_attraction" "amusement_park" "art_gallery" "zoo"components
: A grouping of places to which you would like to restrict your results. Components can be used to filter over countries.language
: The language code, using ISO 3166-1 Alpha-2 country codes, indicating in which language the results should be returnedlocation
: This parameter is used to add a bias to the autocomplete feature. The location defines the point around which to retrieve results in priority.radius
: This parameter may be used in addition to the location parameter to define the distance in meters within which the API will return results in priority.data
: Two values for this parameter: standard or advanced. By default, if the parameter is not defined, value is set as standard. The advanced value opens suggestions to worldwide postal codes in addition to postal codes for Western Europe. A dedicated option subject to specific billing on your license is needed to use this parameter.extended
:If set, this parameter allows a refined search over locality names that bears the same postal code.customDescription
: This parameter allows to choose the description format for all or some of the suggestion types selected. The custom formats are described as follows (available fields depend on the returned type): custom_description=type_A:"{field_1}, {field_2},...
"|type_B:"{field_1}, {field_2},...
"
LocalitiesAutocompleteRequest request = LocalitiesAutocompleteRequest( input: "87 Rue montmatre", ); WoosmapApi woosmapApi = WoosmapApi(WoosKey(publicKey: "YOUR-PUBLIC-KEY")); woosmapApi.localities.autocomplete(request).then((value) { debugPrint(jsonEncode(value?.toJson())); }).catchError((error) { debugPrint("An error occurred: ${error.message}"); });
-
Details of a Locality
Provides details of an autocomplete suggestion (using the suggestion’s
publicId
).Request parameters
publicId
: A textual identifier that uniquely identifies a locality, returned from a Localities Autocomplete.language
: The language code, using ISO 3166-1 Alpha-2 country codes, indicating in which language the results should be returnedfields
: Used to limit the returning fields, default it is geometrycountryCodeFormat
: To specify the format for the short country code expected to be returned in the address_components field (default is alpha3).
LocalitiesDetailsRequest request = LocalitiesDetailsRequest( publicId: "1234567890", ); WoosmapApi woosmapApi = WoosmapApi(WoosKey(publicKey: "YOUR-PUBLIC-KEY")); woosmapApi.localities.details(request).then((value) { debugPrint(jsonEncode(value?.toJson())); }).catchError((error) { debugPrint("An error occurred: ${error.message}"); });
-
Geocode a locality or Reverse Geocode a latlng
Provides details for an address or a geographic position. Either parameter
address
orlatlng
is required.Request parameters
address
: The input string to geocode. Can represent an address, a street, a locality or a postal code.latLng
: The latlng parameter is used for reverse geocoding, it’s required if the address parameter is missing.components
: A grouping of places to which you would like to restrict your results. Components can be used to filter over countries. Countries must be passed as an ISO 3166-1 Alpha-2 or Alpha-3 compatible country code.language
: The language code, using ISO 3166-1 Alpha-2 country codes, indicating in which language the results should be returnedfields
: Used to limit the returning fieldsdata
: Two values for this parameter: standard or advanced. By default, if the parameter is not defined, value is set as standard. The advanced value opens suggestions to worldwide postal codes in addition to postal codes for Western Europe. A dedicated option subject to specific billing on your license is needed to use this parameter.countryCodeFormat
: To specify the format for the short country code expected to be returned in the address_components field.listSubBuildings
: Allows to retrieve all addresses at the same location for a common street number or building. WhenlistSubBuildings=true
and according to actual addresses at the provided location, results may contain an additional keysubBuildings
as a list of address summaries. It will provide apublicId
and adescription
for every address at the provided location (flats, organisations..).
LocalitiesGeocodeRequest request = LocalitiesGeocodeRequest( address: "87 Rue montmatre", ); WoosmapApi woosmapApi = WoosmapApi(WoosKey(publicKey: "YOUR-PUBLIC-KEY")); woosmapApi.localities.geocode(request).then((value) { debugPrint(jsonEncode(value?.toJson())); }).catchError((error) { debugPrint("An error occurred: ${error.message}"); });
Store Search API
Stores Search API lets you search among your own Points of Interest. Find stores by geography, by attributes or by autocomplete on store names.
-
Autocomplete for assets
Autocomplete on localizedNames with highlighted results on asset name. Use the field localized in your query parameter to search for localized names.
Request parameters
query
: Search query combining one or more search clauses. Example:query=name:'My cool store'|type:'click_and_collect'
language
: The preferred language to match against name (defaults on Accept-Language header)limit
: You can then request stores by page usinglimit
parameters
StoresAutocompleteRequest request = StoresAutocompleteRequest( query: "name:'My cool store'|type:'click_and_collect'", ); WoosmapApi woosmapApi = WoosmapApi(WoosKey(publicKey: "YOUR-PUBLIC-KEY")); woosmapApi.stores.autocomplete(request).then((value) { debugPrint(jsonEncode(value?.toJson())); }).catchError((error) { debugPrint("An error occurred: ${error.message}"); });
-
Search for assets
Used to retrieve assets from query.
Request parameters
query
: Search query combining one or more search clauses. Example:query=name:'My cool store'|type:'click_and_collect'
latLng
: To bias the results around a specific latlngradius
: To bias the results within a given circular area.polyline
: Find stores nearby an encoded polyline and inside a defined radius.storesByPage
: You can then request stores by page usingpage
andstoresByPage
parameters (Default is 100, max is 300).page
: Page number when accessing paginated storeszone
: whether to search for stores intersecting a zone
StoresSearchRequest request = StoresSearchRequest( query: "idStore:31625406", ); WoosmapApi woosmapApi = WoosmapApi(WoosKey(publicKey: "YOUR-PUBLIC-KEY")); woosmapApi.stores.search(request).then((value) { debugPrint(jsonEncode(value?.toJson())); }).catchError((error) { debugPrint("An error occurred: ${error.message}"); });
For help getting started with Flutter development, view the online documentation, which offers tutorials, samples, guidance on mobile development, and a full API reference.