将画布的鼠标坐标转换为地理坐标

2024-04-24 13:52:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图用pythontkinter和Canvas创建一张意大利所有城市的地图。 我在网上找到了一张意大利地图,上面有几个突出显示的城市,然后把它插入了我的Canvas。之后,我使用一个函数来确定两个突出显示的城市的画布坐标:

import tkinter as tk

class Map():
    #Creator-Function
    def __init__(self,parent):
        self.canvas=tk.Canvas(width=995,height=971,bg='black')
        self.canvas.pack(expand=0,fill='none')
        self.gif=tk.PhotoImage(file='mapOfItl.gif')
        self.canvas.create_image(497.5,485.5, image = self.gif)
        self.canvas.bind('<Button-1>',self.callback)


#Event on mouse-click function
def callback(self,event):
    print(self.long,self.lat,event.x,971-event.y)#lat increases opposite to canvas' y coordinate
root=tk.Tk()
app=Map(root)
root.mainloop()

例如,我点击罗马,得到x=250y=150 米兰得到x=125 y=450

请注意,这些不是原始数字。

然后我搜索了米兰的地理坐标,找到了:米兰的纬度=40.100,经度=19.870,罗马的纬度=39.850,经度=21.975(这里我再次使用随机数)

之后,通过减去米兰和罗马的经度/纬度和画布坐标(x=经度,y=纬度),我能够找到经度和纬度上的1个画布像素分别与画布宽度和画布高度的值,我所要做的就是添加一个额外的数:

坐标y到纬度:

  1. 米兰-罗米=450-150=300
  2. MilanLat RomeLat=40.100-39.850=0.350
  3. 所以Y轴上的300像素等于0.350度
  4. 所以Y轴上的1个像素等于0350/300=0.1166666。。。你知道吗
  5. 0.11666*450(米兰尼)=0.525所以我需要加上40.100-0.525=39.575

相应的经度。你知道吗

所以我在画布上计算城市纬度的函数是:

def callback(self,event):
    self.lat=event.y*0.1166666...+39.575
    self.long=.....

不过,该计划似乎适用于米兰和罗马之间的每个城市:

  • 但是对于每一个比米兰更北的城市 开始时选择的城市)该函数计算的纬度为 比它应该的位置更靠南。你知道吗
  • 对于每一个比罗马更南的城市,纬度都更大(城市比他们应该的更北)
  • 对于每一个离开米兰的城市来说,距离都在更远的东方
  • 罗马右边的每一个城市的长度都较小(左边的城市) 在米兰,位于更西边的城市正在被测量 比他们应该去的更远的东方,相反的是最远的罗马 两市之东)

我的思维过程有问题吗,或者地图的比例有问题吗? 有没有什么特别的模块,你会推荐(我试图寻找这样一个模块,但找不到任何画布gif的应用程序),有没有办法解决这个问题,而不必安装一个额外的模块?你知道吗


Tags: 函数selfeventdef画布callback地图root