You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy MapView点击添加Marker定位错误问题求助

问题解决:MapMarker点击添加后位置错误

你的代码核心问题是**on_map_touch_down方法的参数顺序错误**,导致传递给get_latlon_at的不是正确的触摸坐标,进而计算出错误的经纬度,让标记出现在地图角落。

在KV语言的绑定语句on_touch_down: root.on_map_touch_down(self, *args)中,self指代当前的MapView实例,*args包含触摸事件对象。但你定义的方法把第一个参数(实际是MapView)当成了touch,真正的触摸事件被塞到了args里,这就导致获取的坐标完全不符合点击位置。

修正后的代码

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy_garden.mapview import MapMarker


Builder.load_string(
'''
#:import MapView kivy_garden.mapview.MapView
#:import MapMarker kivy_garden.mapview.MapMarker

<SimpleRec>
    name: "simple_rec"

    MDBoxLayout:

        MapView:
            id: smap
            lat: 48
            lon: 7.82
            zoom: 11
            on_touch_down: root.on_map_touch_down(self, *args)
'''
)


class SimpleRec(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    # 修正参数顺序:self(Screen实例)→ mapview(MapView实例)→ touch(触摸事件)
    def on_map_touch_down(self, mapview, touch, *args):
        # 先判断触摸是否在MapView范围内,避免误触其他控件
        if not mapview.collide_point(*touch.pos):
            return
        lat, lon = mapview.get_latlon_at(*touch.pos)
        print(f"{lat} {lon}")
        marker = MapMarker(lat=lat, lon=lon)
        mapview.add_marker(marker)


class MainApp(MDApp):
    def build(self):
        screen_manager = ScreenManager()
        simple_rec = SimpleRec(name='simple_rec')
        screen_manager.add_widget(simple_rec)
        return screen_manager


if __name__ == '__main__':
    MainApp().run()

额外优化说明

  • 添加了mapview.collide_point(*touch.pos)判断,确保只有点击在MapView区域内才会添加标记,避免误触屏幕其他区域触发事件
  • 改用mapview参数来调用方法,比依赖self.ids.smap更清晰,也符合回调传参的逻辑

内容的提问来源于stack exchange,提问作者jan h

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:53:29