转换画布'鼠标指向地理坐标

时间:2017-12-23 00:09:20

标签: python python-3.x canvas tkinter geo

我尝试使用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个画布像素的值而我所要做的就是增加一个额外的数字:

coord y to latitude:

  1. 米兰-RomeY = 450-150 = 300
  2. MilanLat-RomeLat = 40.100-39.850 = 0.350
  3. 因此Y轴上的300个像素等于0.350度
  4. 因此Y轴上的1个像素等于0,350 / 300 = 0.1166666 ......
  5. 0.11666 * 450(MilanY)= 0.525所以我需要加40.100-0.525 = 39.575
  6. 相应经度。

    所以我在画布中计算城市纬度的功能是:

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

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

    • 然而,对于比米兰更北的每个城市(2的最北部) 在开始时选择的城市)由该函数计算的纬度是 对应的距离比它应该的更远。
    • 对于比罗马更南的每个城市,纬度都更大(城市比他们的北方更远
    • 对于离开米兰的每个城市来说,经度更远的东方
    • 对于罗马的每个城市,经度较小(城市离开 到了米兰,位于更远西部的城市正在逐渐被测量 东边比他们应该的更远,罗马的距离相反 东部的2个城市)

    我的思维过程是否有问题,或者地图比例是否有问题? 是否有任何特定的模块你会推荐(我已经尝试过寻找这样的模块但是找不到任何用于canvas gif的应用程序)并且有没有办法解决这个问题而无需安装额外的模块?

0 个答案:

没有答案