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
相关产品推荐
相关产品推荐

