.. _mapbox_point_field_map_widgets: MapBox Point Field Widget ========================= Preview ^^^^^^^ .. image:: ../_static/images/mapbox-point-field-map-widget.png Requirements ^^^^^^^^^^^^ **Mapbox Access Token**: To generate an access token, please follow `MapBox account `_ page instructions. .. note:: The widget has a Place Geocoder Autocomplete component by default. You can find a specific address coordinates with it. .. note:: The widget has built-in geocoding support. The autocomplete input will be populated by `MapBox geocoding `_ API when the user choose a point on the map manually. Settings ^^^^^^^^ | **access_token**: Put the access token (required) | | *default:* ``None`` | **markerFitZoom**: When the marker is initialized google's default zoom is set to Max. This method sets the zoom level a reasonable distance and center the marker on the map. | | *default:* ``14`` | **showZoomNavigation**: Whether or not to display the map zoom navigation buttons. | | *default:* ``True`` | **mapOptions**: Specify custom map options parameters in ``dict`` type with this attribute, note that, custom options and the widget default options dictionary keys will be merged when the settings loaded. See the full list of map options parameters `here `__. | | *default*: .. code-block:: python { "zoom": 12, "style": "mapbox://styles/mapbox/streets-v11", "scrollZoom": False, "animate": False, "center": TIMEZONE_COORDINATES.get(getattr(django_settings, "TIME_ZONE", "UTC")) # (latitude, longitude), } .. note:: If mapOptions `center` setting isn't overridden in the project settings file, the widget will be centered the map regarding timezone setting. There is a `list of coordinates `_ for timezones in the project code. | **geocoderOptions**: Specify custom geocoder options parameters in ``dict`` type with this attribute, note that, custom options and the widget default options dictionary keys will be merged when the settings loaded. See the full list of geocoder options parameters `here `__. | | *default*: .. code-block:: python { "zoom": 6, "flyTo": False, "style": "mapbox://styles/mapbox/streets-v11", "reverseGeocode": True, "marker": False } Usage ^^^^^ **Settings** Set the widget settings with ``MAP_WIDGETS`` attribute in django settings: .. code-block:: python MAP_WIDGETS = { "MapboxPointFieldWidget": { "access_token": MAPBOX_ACCESS_TOKEN, "markerFitZoom": 12, "mapOptions": { "animate": True, "zoom": 10, "center": (51.515618, -0.091998) }, "geocoderOptions": { "zoom": 7 } } } Use the widget in Django Admin or Forms: .. code-block:: python from django.contrib.gis import admin from mapwidgets.widgets import MapboxPointFieldWidget class NeighbourAdmin(admin.ModelAdmin): autocomplete_fields = ('neighbour_of_house',) formfield_overrides = { models.PointField: {"widget": MapboxPointFieldWidget} } .. code-block:: python from django.contrib.gis.forms import PointField from mapwidgets.widgets import MapboxPointFieldWidget class HouseCreateForm(forms.ModelForm): location_has_default = PointField(widget=MapboxPointFieldWidget) class Meta: model = House fields = ("name", "location", "location_has_default") widgets = { "location": GooglePointFieldWidget, } Custom settings can provide individual form fields separately with `settings` as a parameter. .. code-block:: python from django.contrib.gis import forms from django.contrib.gis.forms import PointField from mapwidgets.widgets import MapboxPointFieldWidget FIRST_WIDGET_SETTINGS = { "MapboxPointFieldWidget": ( ("zoom", 15), ("mapCenterLocation", [60.7177013, -22.6300491]), ), } SECOND_WIDGET_SETTINGS = { "MapboxPointFieldWidget": ( ("zoom", 15), ("mapCenterLocation", [60.7177013, -22.6300491]), ), } class HouseCreateForm(forms.ModelForm): location_has_default = PointField(widget=MapboxPointFieldWidget(settings=SINGLE_MAP_SETTINGS)) location = PointField(widget=MapboxPointFieldWidget(settings=SECOND_WIDGET_SETTINGS)) class Meta: model = House fields = ("name", "location", "location_has_default") Javascript Triggers ^^^^^^^^^^^^^^^^^^^ If you need to develop your map UI on front-end side, you can use map widget jQuery triggers. * **google_point_map_widget:marker_create**: Triggered when user create marker on map. (callback params: place, lat, lng, locationInputElem, mapWrapID) * **google_point_map_widget:marker_change**: Triggered when user change marker position on map. (callback params: place, lat, lng, locationInputElem, mapWrapID) * **google_point_map_widget:marker_delete**: Triggered when user delete marker on map. (callback params: lat, lng, locationInputElem, mapWrapID) * **google_point_map_widget:place_changed**: Triggered when user update the place via geocoder input. (callback params: place, lat, lng, locationInputElem, mapWrapID) .. code-block:: javascript (function ($){ $(document).on("mapbox_point_map_widget:marker_create", function (e, lat, lng, locationInputElem, mapWrapID) { console.log("EVENT: marker_create"); // django widget textarea widget (hidden) console.log(locationInputElem); // django widget textarea widget (hidden) console.log(lat, lng); // created marker coordinates console.log(mapWrapID); // map widget wrapper element ID }); $(document).on("mapbox_point_map_widget:marker_change", function (e, lat, lng, locationInputElem, mapWrapID) { console.log("EVENT: marker_change"); // django widget textarea widget (hidden) console.log(locationInputElem); // django widget textarea widget (hidden) console.log(lat, lng); // changed marker coordinates console.log(mapWrapID); // map widget wrapper element ID }); $(document).on("mapbox_point_map_widget:marker_delete", function (e, lat, lng, locationInputElem, mapWrapID) { console.log("EVENT: marker_delete"); // django widget textarea widget (hidden) console.log(locationInputElem); // django widget textarea widget (hidden) console.log(lat, lng); // deleted marker coordinates console.log(mapWrapID); // map widget wrapper element ID }) $(document).on("mapbox_point_map_widget:place_changed", function (e, place, lat, lng, locationInputElem, mapWrapID) { console.log("EVENT: place_changed"); // django widget textarea widget (hidden) console.log(place); // mapbox geocoder place object console.log(locationInputElem); // django widget textarea widget (hidden) console.log(lat, lng); // created marker coordinates console.log(mapWrapID); // map widget wrapper element ID }); })(jQuery) Javascript Objects ^^^^^^^^^^^^^^^^^^ The widget JS objects ``mapboxMapObj`` and ``mapboxMapWidgetObj`` can reach out via the map HTML elements using with jQuery `$.data`. Use jquery selector format like ``$("#{django-form-field-name}-map-elem")`` in order to get jquery object. See examples in the `demo project templates `_.