Skip to content

Map

Examples#

Example 1#

example_1.py
import random

import flet as ft

import flet_map as ftm


def main(page: ft.Page):
    marker_layer_ref = ft.Ref[ftm.MarkerLayer]()
    circle_layer_ref = ft.Ref[ftm.CircleLayer]()

    def handle_tap(e: ftm.MapTapEvent):
        if e.name == "tap":
            marker_layer_ref.current.markers.append(
                ftm.Marker(
                    content=ft.Icon(
                        ft.Icons.LOCATION_ON, color=ft.CupertinoColors.DESTRUCTIVE_RED
                    ),
                    coordinates=e.coordinates,
                )
            )
        elif e.name == "secondary_tap":
            circle_layer_ref.current.circles.append(
                ftm.CircleMarker(
                    radius=random.randint(5, 10),
                    coordinates=e.coordinates,
                    color=ft.Colors.random(),
                    border_color=ft.Colors.random(),
                    border_stroke_width=4,
                )
            )
        page.update()

    page.add(
        ft.Text("Click anywhere to add a Marker, right-click to add a CircleMarker."),
        ftm.Map(
            expand=True,
            initial_center=ftm.MapLatitudeLongitude(15, 10),
            initial_zoom=4.2,
            interaction_configuration=ftm.InteractionConfiguration(
                flags=ftm.InteractionFlag.ALL
            ),
            on_tap=handle_tap,
            on_secondary_tap=handle_tap,
            on_long_press=handle_tap,
            on_event=print,
            layers=[
                ftm.TileLayer(
                    url_template="https://tile.openstreetftm.org/{z}/{x}/{y}.png",
                    on_image_error=lambda e: print("TileLayer Error"),
                ),
                ftm.RichAttribution(
                    attributions=[
                        ftm.TextSourceAttribution(
                            text="OpenStreetMap Contributors",
                            on_click=lambda e: e.page.launch_url(
                                "https://openstreetftm.org/copyright"
                            ),
                        ),
                        ftm.TextSourceAttribution(
                            text="Flet",
                            on_click=lambda e: e.page.launch_url("https://flet.dev"),
                        ),
                    ]
                ),
                ftm.SimpleAttribution(
                    text="Flet",
                    alignment=ft.Alignment.TOP_RIGHT,
                    on_click=lambda e: print("Clicked SimpleAttribution"),
                ),
                ftm.MarkerLayer(
                    ref=marker_layer_ref,
                    markers=[
                        ftm.Marker(
                            content=ft.Icon(ft.Icons.LOCATION_ON),
                            coordinates=ftm.MapLatitudeLongitude(30, 15),
                        ),
                        ftm.Marker(
                            content=ft.Icon(ft.Icons.LOCATION_ON),
                            coordinates=ftm.MapLatitudeLongitude(10, 10),
                        ),
                        ftm.Marker(
                            content=ft.Icon(ft.Icons.LOCATION_ON),
                            coordinates=ftm.MapLatitudeLongitude(25, 45),
                        ),
                    ],
                ),
                ftm.CircleLayer(
                    ref=circle_layer_ref,
                    circles=[
                        ftm.CircleMarker(
                            radius=10,
                            coordinates=ftm.MapLatitudeLongitude(16, 24),
                            color=ft.Colors.RED,
                            border_color=ft.Colors.BLUE,
                            border_stroke_width=4,
                        ),
                    ],
                ),
                ftm.PolygonLayer(
                    polygons=[
                        ftm.PolygonMarker(
                            label="Popular Touristic Area",
                            label_text_style=ft.TextStyle(
                                color=ft.Colors.BLACK,
                                size=15,
                                weight=ft.FontWeight.BOLD,
                            ),
                            color=ft.Colors.with_opacity(0.3, ft.Colors.BLUE),
                            coordinates=[
                                ftm.MapLatitudeLongitude(10, 10),
                                ftm.MapLatitudeLongitude(30, 15),
                                ftm.MapLatitudeLongitude(25, 45),
                            ],
                        ),
                    ],
                ),
                ftm.PolylineLayer(
                    polylines=[
                        ftm.PolylineMarker(
                            border_stroke_width=3,
                            border_color=ft.Colors.RED,
                            gradient_colors=[ft.Colors.BLACK, ft.Colors.BLACK],
                            color=ft.Colors.with_opacity(0.6, ft.Colors.GREEN),
                            coordinates=[
                                ftm.MapLatitudeLongitude(10, 10),
                                ftm.MapLatitudeLongitude(30, 15),
                                ftm.MapLatitudeLongitude(25, 45),
                            ],
                        ),
                    ],
                ),
            ],
        ),
    )


ft.run(main)

Map #

Bases: ConstrainedControl

An interactive map that displays various layers.

animate_offset #

animate_offset: AnimationValue | None = None

Enables implicit animation of the offset property.

More information here.

animate_opacity #

animate_opacity: AnimationValue | None = None

Enables implicit animation of the opacity property.

More information here.

animate_position #

animate_position: AnimationValue | None = None

Enables implicit animation of the positioning properties (left, right, top and bottom).

More information here.

animate_rotation #

animate_rotation: AnimationValue | None = None

Enables implicit animation of the rotate property.

More information here.

animate_scale #

animate_scale: AnimationValue | None = None

Enables implicit animation of the scale property.

More information here.

animate_size #

animate_size: AnimationValue | None = None

TBD

animation_curve #

animation_curve: AnimationCurve = FAST_OUT_SLOWIN

The default animation curve to be used for map-animations when calling instance methods like zoom_in(), rotate_from(), move_to() etc.

animation_duration #

animation_duration: DurationValue = field(
    default_factory=lambda: Duration(milliseconds=500)
)

The default animation duration to be used for map-animations when calling instance methods like zoom_in(), rotate_from(), move_to() etc.

aspect_ratio #

aspect_ratio: Number | None = None

TBD

badge #

badge: BadgeValue | None = None

A badge to show on top of this control.

bgcolor #

bgcolor: ColorValue = GREY_300

The background color of this control.

bottom #

bottom: Number | None = None

The distance that the child's bottom edge is inset from the bottom of the stack.

Note

Effective only if this control is a descendant of one of the following: Stack control, Page.overlay list.

col #

col: ResponsiveNumber = 12

If a parent of this control is a ResponsiveRow, this property is used to determine how many virtual columns of a screen this control will span.

Can be a number or a dictionary configured to have a different value for specific breakpoints, for example col={"sm": 6}.

This control spans the 12 virtual columns by default.

/// details | Dimensions type: info | Breakpoint | Dimension | |---|---| | xs | <576px | | sm | ≥576px | | md | ≥768px | | lg | ≥992px | | xl | ≥1200px | | xxl | ≥1400px | ///

data #

data: Any = skip_field()

Arbitrary data of any type.

disabled #

disabled: bool = False

Every control has disabled property which is False by default - control and all its children are enabled.

Note

The value of this property will be propagated down to all children controls recursively.

/// details | Example type: example For example, if you have a form with multiple entry controls you can disable them all together by disabling container:

ft.Column(
    disabled = True,
    controls=[
        ft.TextField(),
        ft.TextField()
    ]
)
///

expand #

expand: bool | int | None = None

Specifies whether/how this control should expand to fill available space in its parent layout.

More information here.

Note

Has effect only if the direct parent of this control is one of the following controls, or their subclasses: Column, Row, View, Page.

expand_loose #

expand_loose: bool = False

Allows the control to expand along the main axis if space is available, but does not require it to fill all available space.

More information here.

Note

If expand_loose is True, it will have effect only if:

  • expand is not None and
  • the direct parent of this control is one of the following controls, or their subclasses: Column, Row, View, Page.

height #

height: Number | None = None

Imposed Control height in virtual pixels.

initial_camera_fit #

initial_camera_fit: CameraFit | None = None

Defines the visible bounds when the map is first loaded. Takes precedence over initial_center/initial_zoom.

initial_center #

initial_center: MapLatitudeLongitude = field(
    default_factory=lambda: MapLatitudeLongitude(
        latitude=50.5, longitude=30.51
    )
)

The initial center of the map.

initial_rotation #

initial_rotation: Number = 0.0

The rotation (in degrees) when the map is first loaded.

initial_zoom #

initial_zoom: Number = 13.0

The zoom when the map is first loaded. If initial_camera_fit is defined this has no effect.

interaction_configuration #

interaction_configuration: InteractionConfiguration = field(
    default_factory=lambda: InteractionConfiguration()
)

The interaction configuration.

keep_alive #

keep_alive: bool = False

Whether to enable the built in keep-alive functionality.

If the map is within a complex layout, such as a ListView, the map will reset to it's inital position after it appears back into view. To ensure this doesn't happen, enable this flag to prevent it from rebuilding.

key #

key: KeyValue | None = None

layers #

layers: list[MapLayer]

A list of layers to be displayed (stack-like) on the map.

left #

left: Number | None = None

The distance that the child's left edge is inset from the left of the stack.

Note

Effective only if this control is a descendant of one of the following: Stack control, Page.overlay list.

max_zoom #

max_zoom: Number | None = None

The maximum (highest) zoom level of every layer. Each layer can specify additional zoom level restrictions.

min_zoom #

min_zoom: Number | None = None

The minimum (smallest) zoom level of every layer. Each layer can specify additional zoom level restrictions.

offset #

offset: OffsetValue | None = None

Applies a translation transformation before painting the control.

The translation is expressed as an Offset scaled to the control's size. So, Offset(x=0.25, y=0), for example, will result in a horizontal translation of one quarter the width of this control.

/// details | Example type: example The following example displays container at 0, 0 top left corner of a stack as transform applies -1 * 100, -1 * 100 (offset * control's size) horizontal and vertical translations to the control:

import flet as ft

def main(page: ft.Page):
    page.add(
        ft.Stack(
            width=1000,
            height=1000,
            controls=[
                ft.Container(
                    bgcolor="red",
                    width=100,
                    height=100,
                    left=100,
                    top=100,
                    offset=ft.Offset(-1, -1),
                )
            ],
        )
    )

ft.run(main)
///

on_animation_end #

on_animation_end: (
    ControlEventHandler[ConstrainedControl] | None
) = None

Called when animation completes.

Can be used to chain multiple animations.

The data property of the event handler argument contains the name of the animation.

More information here.

on_event #

on_event: EventHandler[MapEvent] | None = None

Fires when any map events occurs.

on_hover #

on_hover: EventHandler[MapHoverEvent] | None = None

Fires when a hover event occurs.

on_init #

on_init: ControlEventHandler[Map] | None = None

Fires when the map is initialized.

on_long_press #

on_long_press: EventHandler[MapTapEvent] | None = None

Fires when a long press event occurs.

on_pointer_cancel #

on_pointer_cancel: EventHandler[MapPointerEvent] | None = (
    None
)

Fires when a pointer cancel event occurs.

on_pointer_down #

on_pointer_down: EventHandler[MapPointerEvent] | None = None

Fires when a pointer down event occurs.

on_pointer_up #

on_pointer_up: EventHandler[MapPointerEvent] | None = None

Fires when a pointer up event occurs.

on_position_change #

on_position_change: (
    EventHandler[MapPositionChangeEvent] | None
) = None

Fires when the map position changes.

on_secondary_tap #

on_secondary_tap: EventHandler[MapTapEvent] | None = None

Fires when a secondary tap event occurs.

on_tap #

on_tap: EventHandler[MapTapEvent] | None = None

Fires when a tap event occurs.

opacity #

opacity: Number = 1.0

Defines the transparency of the control.

Value ranges from 0.0 (completely transparent) to 1.0 (completely opaque without any transparency).

page #

page: Page | BasePage | None

The page to which this control belongs to.

parent #

parent: BaseControl | None

The direct ancestor(parent) of this control.

It defaults to None and will only have a value when this control is mounted (added to the page tree).

The Page control (which is the root of the tree) is an exception - it always has parent=None.

right #

right: Number | None = None

The distance that the child's right edge is inset from the right of the stack.

Note

Effective only if this control is a descendant of one of the following: Stack control, Page.overlay list.

rotate #

rotate: RotateValue | None = None

Transforms this control using a rotation around its center.

The value of rotate property could be one of the following types:

  • number - a rotation in clockwise radians. Full circle 360° is math.pi * 2 radians, 90° is pi / 2, 45° is pi / 4, etc.
  • Rotate - allows to specify rotation angle as well as alignment - the location of rotation center.

/// details | Example type: example For example:

ft.Image(
    src="https://picsum.photos/100/100",
    width=100,
    height=100,
    border_radius=5,
    rotate=Rotate(angle=0.25 * pi, alignment=ft.Alignment.CENTER_LEFT)
)
///

rtl #

rtl: bool = False

Whether the text direction of the control should be right-to-left (RTL).

scale #

scale: ScaleValue | None = None

Scales this control along the 2D plane. Default scale factor is 1.0, meaning no-scale.

Setting this property to 0.5, for example, makes this control twice smaller, while 2.0 makes it twice larger.

Different scale multipliers can be specified for x and y axis, by setting Control.scale property to an instance of Scale class. Either scale or scale_x and scale_y could be specified, but not all of them.

/// details | Example type: example

ft.Image(
    src="https://picsum.photos/100/100",
    width=100,
    height=100,
    border_radius=5,
    scale=ft.Scale(scale_x=2, scale_y=0.5)
)
///

tooltip #

tooltip: TooltipValue | None = None

The tooltip ot show when this control is hovered over.

top #

top: Number | None = None

The distance that the child's top edge is inset from the top of the stack.

Note

Effective only if this control is a descendant of one of the following: Stack control, Page.overlay list.

visible #

visible: bool = True

Every control has visible property which is True by default - control is rendered on the page. Setting visible to False completely prevents control (and all its children if any) from rendering on a page canvas. Hidden controls cannot be focused or selected with a keyboard or mouse and they do not emit any events.

width #

width: Number | None = None

Imposed Control width in virtual pixels.

before_event #

before_event(e: ControlEvent)

before_update #

before_update()

build #

build()

Called once during control initialization to define its child controls. self.page is available in this method.

center_on #

center_on(
    point: MapLatitudeLongitude,
    zoom: Number | None,
    animation_curve: AnimationCurve | None = None,
    animation_duration: DurationValue | None = None,
    cancel_ongoing_animations: bool = False,
) -> None

Centers the map on the given point.

PARAMETER DESCRIPTION
point

The point on which to center the map.

TYPE: MapLatitudeLongitude

zoom

The zoom level to be applied.

TYPE: Number | None

animation_curve

The curve of the animation. If None (the default), Map.animation_curve will be used.

TYPE: AnimationCurve | None DEFAULT: None

animation_duration

The duration of the animation. If None (the default), Map.animation_duration will be used.

TYPE: DurationValue | None DEFAULT: None

cancel_ongoing_animations

Whether to cancel/stop all ongoing map-animations before starting this new one.

TYPE: bool DEFAULT: False

clean #

clean() -> None

did_mount #

did_mount()

init #

init()

is_isolated #

is_isolated()

move_to #

move_to(
    destination: MapLatitudeLongitude | None = None,
    zoom: Number | None = None,
    rotation: Number | None = None,
    animation_curve: AnimationCurve | None = None,
    animation_duration: DurationValue | None = None,
    offset: OffsetValue = (0, 0),
    cancel_ongoing_animations: bool = False,
) -> None

Moves to a specific location.

PARAMETER DESCRIPTION
destination

The destination point to move to.

TYPE: MapLatitudeLongitude | None DEFAULT: None

zoom

The zoom level to be applied. If provided, must be greater than or equal to 0.0.

TYPE: Number | None DEFAULT: None

rotation

Rotation (in degrees) to be applied.

TYPE: Number | None DEFAULT: None

offset

The offset to be used. Only works when rotation is None.

TYPE: OffsetValue DEFAULT: (0, 0)

animation_curve

The curve of the animation. If None (the default), Map.animation_curve will be used.

TYPE: AnimationCurve | None DEFAULT: None

animation_duration

The duration of the animation. If None (the default), Map.animation_duration will be used.

TYPE: DurationValue | None DEFAULT: None

cancel_ongoing_animations

Whether to cancel/stop all ongoing map-animations before starting this new one.

TYPE: bool DEFAULT: False

RAISES DESCRIPTION
AssertionError

If zoom is not None and is negative.

reset_rotation #

reset_rotation(
    animation_curve: AnimationCurve | None = None,
    animation_duration: DurationValue | None = None,
    cancel_ongoing_animations: bool = False,
) -> None

Resets the map's rotation to 0 degrees.

PARAMETER DESCRIPTION
animation_curve

The curve of the animation. If None (the default), Map.animation_curve will be used.

TYPE: AnimationCurve | None DEFAULT: None

animation_duration

The duration of the animation. If None (the default), Map.animation_duration will be used.

TYPE: DurationValue | None DEFAULT: None

cancel_ongoing_animations

Whether to cancel/stop all ongoing map-animations before starting this new one.

TYPE: bool DEFAULT: False

rotate_from #

rotate_from(
    degree: Number,
    animation_curve: AnimationCurve | None = None,
    animation_duration: DurationValue | None = None,
    cancel_ongoing_animations: bool = False,
) -> None

Applies a rotation of degree to the current rotation.

PARAMETER DESCRIPTION
degree

The number of degrees to increment to the current rotation.

TYPE: Number

animation_curve

The curve of the animation. If None (the default), Map.animation_curve will be used.

TYPE: AnimationCurve | None DEFAULT: None

animation_duration

The duration of the animation. If None (the default), Map.animation_duration will be used.

TYPE: DurationValue | None DEFAULT: None

cancel_ongoing_animations

Whether to cancel/stop all ongoing map-animations before starting this new one.

TYPE: bool DEFAULT: False

update #

update() -> None

will_unmount #

will_unmount()

zoom_in #

zoom_in(
    animation_curve: AnimationCurve | None = None,
    animation_duration: DurationValue | None = None,
    cancel_ongoing_animations: bool = False,
) -> None

Zooms in by one zoom-level from the current one.

PARAMETER DESCRIPTION
animation_curve

The curve of the animation. If None (the default), Map.animation_curve will be used.

TYPE: AnimationCurve | None DEFAULT: None

animation_duration

The duration of the animation. If None (the default), Map.animation_duration will be used.

TYPE: DurationValue | None DEFAULT: None

cancel_ongoing_animations

Whether to cancel/stop all ongoing map-animations before starting this new one.

TYPE: bool DEFAULT: False

zoom_out #

zoom_out(
    animation_curve: AnimationCurve | None = None,
    animation_duration: DurationValue | None = None,
    cancel_ongoing_animations: bool = False,
) -> None

Zooms out by one zoom-level from the current one.

PARAMETER DESCRIPTION
animation_curve

The curve of the animation. If None (the default), Map.animation_curve will be used.

TYPE: AnimationCurve | None DEFAULT: None

animation_duration

The duration of the animation. If None (the default), Map.animation_duration will be used.

TYPE: DurationValue | None DEFAULT: None

cancel_ongoing_animations

Whether to cancel/stop all ongoing map-animations before starting this new one.

TYPE: bool DEFAULT: False

zoom_to #

zoom_to(
    zoom: Number,
    animation_curve: AnimationCurve | None = None,
    animation_duration: DurationValue | None = None,
    cancel_ongoing_animations: bool = False,
) -> None

Zoom the map to a specific zoom level.

PARAMETER DESCRIPTION
zoom

The zoom level to zoom to.

TYPE: Number

animation_curve

The curve of the animation. If None (the default), Map.animation_curve will be used.

TYPE: AnimationCurve | None DEFAULT: None

animation_duration

The duration of the animation. If None (the default), Map.animation_duration will be used.

TYPE: DurationValue | None DEFAULT: None

cancel_ongoing_animations

Whether to cancel/stop all ongoing map-animations before starting this new one.

TYPE: bool DEFAULT: False