Map
Examples#
Example 1#
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
animate_opacity
#
animate_opacity: AnimationValue | None = None
animate_position
#
animate_position: AnimationValue | None = None
animate_rotation
#
animate_rotation: AnimationValue | None = None
animate_scale
#
animate_scale: AnimationValue | None = None
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.
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 | ///
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:
///
expand
#
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.
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.
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:
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_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.
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).
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 circle360°
ismath.pi * 2
radians,90°
ispi / 2
,45°
ispi / 4
, etc.Rotate
- allows to specify rotationangle
as well asalignment
- the location of rotation center.
/// details | Example type: example For example:
///
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
///
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.
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:
|
zoom
|
The zoom level to be applied.
TYPE:
|
animation_curve
|
The curve of the animation. If
TYPE:
|
animation_duration
|
The duration of the animation.
If None (the default),
TYPE:
|
cancel_ongoing_animations
|
Whether to cancel/stop all ongoing map-animations before starting this new one.
TYPE:
|
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:
|
zoom
|
The zoom level to be applied. If provided,
must be greater than or equal to
TYPE:
|
rotation
|
Rotation (in degrees) to be applied.
TYPE:
|
offset
|
The offset to be used. Only works when
TYPE:
|
animation_curve
|
The curve of the animation. If None (the default),
TYPE:
|
animation_duration
|
The duration of the animation.
If None (the default),
TYPE:
|
cancel_ongoing_animations
|
Whether to cancel/stop all ongoing map-animations before starting this new one.
TYPE:
|
RAISES | DESCRIPTION |
---|---|
AssertionError
|
If |
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),
TYPE:
|
animation_duration
|
The duration of the animation.
If None (the default),
TYPE:
|
cancel_ongoing_animations
|
Whether to cancel/stop all ongoing map-animations before starting this new one.
TYPE:
|
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:
|
animation_curve
|
The curve of the animation. If None (the default),
TYPE:
|
animation_duration
|
The duration of the animation.
If None (the default),
TYPE:
|
cancel_ongoing_animations
|
Whether to cancel/stop all ongoing map-animations before starting this new one.
TYPE:
|
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),
TYPE:
|
animation_duration
|
The duration of the animation.
If None (the default),
TYPE:
|
cancel_ongoing_animations
|
Whether to cancel/stop all ongoing map-animations before starting this new one.
TYPE:
|
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),
TYPE:
|
animation_duration
|
The duration of the animation.
If None (the default),
TYPE:
|
cancel_ongoing_animations
|
Whether to cancel/stop all ongoing map-animations before starting this new one.
TYPE:
|
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:
|
animation_curve
|
The curve of the animation. If None (the default),
TYPE:
|
animation_duration
|
The duration of the animation.
If None (the default),
TYPE:
|
cancel_ongoing_animations
|
Whether to cancel/stop all ongoing map-animations before starting this new one.
TYPE:
|