我正在尝试使用 Python-Tkinter 创建包含意大利所有城市的地图Canvas
。
我在网上找到了一张意大利地图的图片,其中突出显示了一些城市,并将其插入到我的Canvas
。之后,我使用一个函数来确定 2 个突出显示的城市的画布坐标:
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=250 y=150
和米兰得到 x=125 y=450
请注意,这些不是原始数字。
然后我搜索了米兰的地理坐标,发现:米兰的纬度=40.100和经度=19.870以及罗马的纬度=39.850和经度=21.975(我再次在这里使用随机数)
之后,通过减去米兰和罗马的经度/纬度和画布坐标(x=经度,y=纬度),我能够分别找到经度和纬度中 1 个画布像素的值与画布宽度和画布高度以及所有我的值。必须做的是添加一个额外的数字:
坐标 y 到纬度:
- 米兰-罗马Y=450-150=300
- 米兰经纬度-罗马纬度=40.100-39.850=0.350
- 因此 Y 轴上的 300 个像素等于 0.350 度
- 所以 Y 轴上的 1 个像素等于 0,350/300=0.1166666...
- 0.11666*450(MilanY)=0.525 所以我需要添加 40.100-0.525=39.575
相应地为经度。
所以我在画布中计算城市纬度的函数是:
def callback(self,event):
self.lat=event.y*0.1166666...+39.575
self.long=.....
然而,该程序似乎适用于米兰和罗马之间的每个城市:
- 然而,对于比米兰更北的每个城市(两个城市中最北的一个)
开始时选择的城市)该函数计算出的纬度为
对应的位置比应有的位置更靠南。
- 对于每一个比罗马更南的城市来说,纬度都更大(城市比它们应该的更北)
- 对于米兰以外的每个城市,经度都位于更东的位置
- 对于罗马右侧的每个城市,经度都较小(左侧的城市
米兰这座位于更西边的城市正在被测量
比他们应有的更远的东方,而最远的罗马则相反
2个城市以东)
是我的思维过程有问题,还是地图比例有问题?
是否有您推荐的任何特定模块(我尝试过寻找这样的模块,但找不到任何画布 gif 的应用程序)并且有没有一种方法可以解决此问题而无需安装额外的模块?