Skip to content

Labels in map #162

Description

@saberchaghamirza

if you chanage a icon=False you can make lables
map.set_marker(center_lat, center_lon,icon=False,text=label_text,font=label_font,text_angle=text_angle)
and original code will be like this:::

class CanvasPositionMarker:
def init(self,
map_widget: "TkinterMapView",
position: tuple,
text: str = None,
text_color: str = "#652A22",
text_anchor: str = "center",
text_angle: int=0,
font=None,
marker_color_circle: str = "#9B261E",
marker_color_outside: str = "#C5542D",
command: Callable = None,
command_right: Callable = None,
image: tkinter.PhotoImage = None,
icon: tkinter.PhotoImage = None,
icon_anchor: str = "center",
image_zoom_visibility: tuple = (0, float("inf")),
data: any = None):

    self.map_widget = map_widget
    self.position = position
    self.text_color = text_color
    self.marker_color_circle = marker_color_circle
    self.marker_color_outside = marker_color_outside
    self.text = text
    self.text_y_offset = 0  # vertical offset pf text from marker position in px
    self.text_anchor=text_anchor
    self.text_angle=text_angle
    self.image = image
    self.icon = icon
    self.icon_anchor = icon_anchor  # can be center, n, nw, w, sw, s, ew, e, ne
    self.image_hidden = False
    self.image_zoom_visibility = image_zoom_visibility
    self.deleted = False
    self.command = command
    self.command_right=command_right
    self.data = data

    self.polygon = None
    self.big_circle = None
    self.canvas_text = None
    self.canvas_image = None
    self.canvas_icon = None

    if font is None:
        if sys.platform == "darwin":
            self.font = "Tahoma 13 bold"
        else:
            self.font = "Tahoma 11 bold"
    else:
        self.font = font

    self.calculate_text_y_offset()

def calculate_text_y_offset(self):
    if self.icon is False:
               self.text_y_offset=-5
    elif self.icon is not None:
        if self.icon_anchor in ("center", "e", "w"):
            self.text_y_offset = -round(self.icon.height() / 2) - 5
        elif self.icon_anchor in ("nw", "n", "ne"):
            self.text_y_offset = -5
        elif self.icon_anchor in ("sw", "s", "se"):
            self.text_y_offset = -self.icon.height() - 5
        else:
            raise ValueError(f"CanvasPositionMarker: wring anchor value: {self.icon_anchor}")

    else:
        self.text_y_offset = -56

def delete(self):
    if self in self.map_widget.canvas_marker_list:
        self.map_widget.canvas_marker_list.remove(self)

    self.map_widget.canvas.delete(self.polygon)
    self.map_widget.canvas.delete(self.big_circle)
    self.map_widget.canvas.delete(self.canvas_text)
    self.map_widget.canvas.delete(self.canvas_icon)
    self.map_widget.canvas.delete(self.canvas_image)

    self.polygon, self.big_circle, self.canvas_text, self.canvas_image, self.canvas_icon = None, None, None, None, None
    self.deleted = True
    self.map_widget.canvas.update()

def set_position(self, deg_x, deg_y):
    self.position = (deg_x, deg_y)
    self.draw()

def set_text(self, text):
    self.text = text
    self.draw()

def change_icon(self, new_icon: tkinter.PhotoImage):
    if self.icon is None:
        raise AttributeError("CanvasPositionMarker: marker needs icon image in constructor to change icon image later")
    else:
        self.icon = new_icon
        self.calculate_text_y_offset()
        self.map_widget.canvas.itemconfigure(self.canvas_icon, image=self.icon)

def hide_image(self, image_hidden: bool):
    self.image_hidden = image_hidden
    self.draw()

def mouse_enter(self, event=None):
    if sys.platform == "darwin":
        self.map_widget.canvas.config(cursor="pointinghand")
    elif sys.platform.startswith("win"):
        self.map_widget.canvas.config(cursor="hand2")
    else:
        self.map_widget.canvas.config(cursor="hand2")  # not tested what it looks like on Linux!

def mouse_leave(self, event=None):
    self.map_widget.canvas.config(cursor="arrow")

def click(self, event=None):
    if self.command is not None:
        self.command(self)
def clickright(self, event=None):
    if self.command_right is not None:
        self.command_right(self)
def get_canvas_pos(self, position):
    tile_position = decimal_to_osm(*position, round(self.map_widget.zoom))

    widget_tile_width = self.map_widget.lower_right_tile_pos[0] - self.map_widget.upper_left_tile_pos[0]
    widget_tile_height = self.map_widget.lower_right_tile_pos[1] - self.map_widget.upper_left_tile_pos[1]

    canvas_pos_x = ((tile_position[0] - self.map_widget.upper_left_tile_pos[0]) / widget_tile_width) * self.map_widget.width
    canvas_pos_y = ((tile_position[1] - self.map_widget.upper_left_tile_pos[1]) / widget_tile_height) * self.map_widget.height

    return canvas_pos_x, canvas_pos_y

def draw(self, event=None):
    canvas_pos_x, canvas_pos_y = self.get_canvas_pos(self.position)

    if not self.deleted:
        if 0 - 50 < canvas_pos_x < self.map_widget.width + 50 and 0 < canvas_pos_y < self.map_widget.height + 70:

            # draw icon image for marker
            if self.icon is False:
                pass
            elif self.icon is not None:
                if self.canvas_icon is None:
                    self.canvas_icon = self.map_widget.canvas.create_image(canvas_pos_x, canvas_pos_y,
                                                                           anchor=self.icon_anchor,
                                                                           image=self.icon,
                                                                           tag="marker")
                    if self.command is not None:
                        self.map_widget.canvas.tag_bind(self.canvas_icon, "<Enter>", self.mouse_enter)
                        self.map_widget.canvas.tag_bind(self.canvas_icon, "<Leave>", self.mouse_leave)
                        self.map_widget.canvas.tag_bind(self.canvas_icon, "<Button-1>", self.click)
                    if self.command_right is not None:
                        self.map_widget.canvas.tag_bind(self.canvas_icon, "<Enter>", self.mouse_enter)
                        self.map_widget.canvas.tag_bind(self.canvas_icon, "<Leave>", self.mouse_leave)
                        self.map_widget.canvas.tag_bind(self.canvas_icon, "<Button-3>", self.clickright)
                else:
                    self.map_widget.canvas.coords(self.canvas_icon, canvas_pos_x, canvas_pos_y)

                
            # draw standard icon shape
            else:
                if self.polygon is None:
                    self.polygon = self.map_widget.canvas.create_polygon(canvas_pos_x - 14, canvas_pos_y - 23,
                                                                         canvas_pos_x, canvas_pos_y,
                                                                         canvas_pos_x + 14, canvas_pos_y - 23,
                                                                         fill=self.marker_color_outside, width=2,
                                                                         outline=self.marker_color_outside, tag="marker")
                    if self.command is not None:
                        self.map_widget.canvas.tag_bind(self.polygon, "<Enter>", self.mouse_enter)
                        self.map_widget.canvas.tag_bind(self.polygon, "<Leave>", self.mouse_leave)
                        self.map_widget.canvas.tag_bind(self.polygon, "<Button-1>", self.click)
                    if self.command_right is not None:
                        self.map_widget.canvas.tag_bind(self.polygon, "<Enter>", self.mouse_enter)
                        self.map_widget.canvas.tag_bind(self.polygon, "<Leave>", self.mouse_leave)
                        self.map_widget.canvas.tag_bind(self.polygon, "<Button-3>", self.clickright)
                else:
                    self.map_widget.canvas.coords(self.polygon,
                                                  canvas_pos_x - 14, canvas_pos_y - 23,
                                                  canvas_pos_x, canvas_pos_y,
                                                  canvas_pos_x + 14, canvas_pos_y - 23)
                if self.big_circle is None:
                    self.big_circle = self.map_widget.canvas.create_oval(canvas_pos_x - 14, canvas_pos_y - 45,
                                                                         canvas_pos_x + 14, canvas_pos_y - 17,
                                                                         fill=self.marker_color_circle, width=6,
                                                                         outline=self.marker_color_outside, tag="marker")
                    if self.command is not None:
                        self.map_widget.canvas.tag_bind(self.big_circle, "<Enter>", self.mouse_enter)
                        self.map_widget.canvas.tag_bind(self.big_circle, "<Leave>", self.mouse_leave)
                        self.map_widget.canvas.tag_bind(self.big_circle, "<Button-1>", self.click)
                    if self.command_right is not None:
                        self.map_widget.canvas.tag_bind(self.big_circle, "<Enter>", self.mouse_enter)
                        self.map_widget.canvas.tag_bind(self.big_circle, "<Leave>", self.mouse_leave)
                        self.map_widget.canvas.tag_bind(self.big_circle, "<Button-3>", self.clickright)
                else:
                    self.map_widget.canvas.coords(self.big_circle,
                                                  canvas_pos_x - 14, canvas_pos_y - 45,
                                                  canvas_pos_x + 14, canvas_pos_y - 17)

            if self.text is not None:
                if self.canvas_text is None:
                    self.canvas_text = self.map_widget.canvas.create_text(canvas_pos_x, canvas_pos_y + self.text_y_offset,
                                                                          anchor=self.text_anchor,
                                                                          text=self.text,
                                                                          fill=self.text_color,
                                                                          font=self.font,
                                                                          tag=("marker", "marker_text"),
                                                                          angle=self.text_angle
                                                                          )
                    if self.command is not None:
                        self.map_widget.canvas.tag_bind(self.canvas_text, "<Enter>", self.mouse_enter)
                        self.map_widget.canvas.tag_bind(self.canvas_text, "<Leave>", self.mouse_leave)
                        self.map_widget.canvas.tag_bind(self.canvas_text, "<Button-1>", self.click)
                    if self.command_right is not None:
                        self.map_widget.canvas.tag_bind(self.canvas_text, "<Enter>", self.mouse_enter)
                        self.map_widget.canvas.tag_bind(self.canvas_text, "<Leave>", self.mouse_leave)
                        self.map_widget.canvas.tag_bind(self.canvas_text, "<Button-3>", self.clickright)
                else:
                    self.map_widget.canvas.coords(self.canvas_text, canvas_pos_x, canvas_pos_y + self.text_y_offset)
                    self.map_widget.canvas.itemconfig(self.canvas_text, text=self.text)
            else:
                if self.canvas_text is not None:
                    self.map_widget.canvas.delete(self.canvas_text)

            if self.image is not None and self.image_zoom_visibility[0] <= self.map_widget.zoom <= self.image_zoom_visibility[1]\
                    and not self.image_hidden:

                if self.canvas_image is None:
                    self.canvas_image = self.map_widget.canvas.create_image(canvas_pos_x, canvas_pos_y + (self.text_y_offset - 30),
                                                                            anchor=tkinter.S,
                                                                            image=self.image,
                                                                            tag=("marker", "marker_image"))
                else:
                    self.map_widget.canvas.coords(self.canvas_image, canvas_pos_x, canvas_pos_y + (self.text_y_offset - 30))
            else:
                if self.canvas_image is not None:
                    self.map_widget.canvas.delete(self.canvas_image)
                    self.canvas_image = None
        else:
            self.map_widget.canvas.delete(self.canvas_icon)
            self.map_widget.canvas.delete(self.canvas_text)
            self.map_widget.canvas.delete(self.polygon)
            self.map_widget.canvas.delete(self.big_circle)
            self.map_widget.canvas.delete(self.canvas_image)
            self.canvas_text, self.polygon, self.big_circle, self.canvas_image, self.canvas_icon = None, None, None, None, None

        self.map_widget.manage_z_order()

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions