使用Python创建省份城市地图选择器

news2024/9/19 10:14:03

在这篇博客中,我们将探讨如何使用Python创建一个简单而实用的省份城市地图选择器。这个项目不仅能帮助我们学习Python的基础知识,还能让我们了解如何处理JSON数据和集成网页浏览器到桌面应用程序中。
C:\pythoncode\new\geographicgooglemap.py

全部代码

import wx
import wx.html2
import json

class MapSelector(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='省份城市地图选择器')
        panel = wx.Panel(self)

        # 加载省份和城市数据
        with open('area-city.json', 'r', encoding='utf-8') as f:
            self.data = json.load(f)

        # 创建控件
        self.province_cb = wx.ComboBox(panel, choices=[p['name'] for p in self.data], style=wx.CB_READONLY)
        self.city_cb = wx.ComboBox(panel, style=wx.CB_READONLY)
        self.confirm_btn = wx.Button(panel, label='确定')
        self.browser = wx.html2.WebView.New(panel)

        # 绑定事件
        self.province_cb.Bind(wx.EVT_COMBOBOX, self.on_province_select)
        self.confirm_btn.Bind(wx.EVT_BUTTON, self.on_confirm)

        # 设置布局
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.province_cb, 0, wx.ALL | wx.EXPAND, 5)
        sizer.Add(self.city_cb, 0, wx.ALL | wx.EXPAND, 5)
        sizer.Add(self.confirm_btn, 0, wx.ALL | wx.EXPAND, 5)
        sizer.Add(self.browser, 1, wx.ALL | wx.EXPAND, 5)
        panel.SetSizer(sizer)

        self.SetSize(800, 600)

    def on_province_select(self, event):
        province = self.province_cb.GetStringSelection()
        for p in self.data:
            if p['name'] == province:
                cities = p['districts']
                self.city_cb.Clear()
                self.city_cb.AppendItems([city['name'] for city in cities])
                break

    def on_confirm(self, event):
        province = self.province_cb.GetStringSelection()
        city = self.city_cb.GetStringSelection()
        if province and city:
            # 使用高德地图API显示城市地图
            # url = f"https://www.amap.com/search?query={city}"
            url = f"https://www.google.com/maps/place/{city}"
            self.browser.LoadURL(url)

if __name__ == '__main__':
    app = wx.App()
    frame = MapSelector()
    frame.Show()
    app.MainLoop()

项目概述

我们的目标是创建一个应用程序,它具有以下功能:

  1. 从JSON文件加载中国的省份和城市数据
  2. 提供两个下拉框,分别用于选择省份和城市
  3. 当选择一个省份时,自动更新城市下拉框的选项
  4. 点击确定按钮后,在嵌入的网页浏览器中显示所选城市的高德地图

技术栈

  • Python 3.x
  • wxPython:用于创建图形用户界面
  • wxPython的webview扩展:用于嵌入网页浏览器
  • JSON:用于存储和处理省份和城市数据

实现步骤

1. 数据准备

首先,我们需要准备一个包含省份和城市信息的JSON文件。文件结构如下:

[
  {
    "name": "省份名称",
    "districts": [
      {
        "name": "城市名称",
        "center": "经度,纬度"
      },
      // 更多城市...
    ]
  },
  // 更多省份...
]

2. 创建GUI

使用wxPython,我们创建了一个包含两个下拉框(ComboBox)、一个按钮和一个网页浏览器控件的窗口。

3. 加载数据

在程序初始化时,我们从JSON文件中加载省份和城市数据。

4. 实现交互逻辑

  • 当选择一个省份时,更新城市下拉框的选项。
  • 当点击确定按钮时,在网页浏览器中加载所选城市的高德地图。

核心代码

以下是实现这个项目的核心Python代码:

import wx
import wx.html2
import json

class MapSelector(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='省份城市地图选择器')
        panel = wx.Panel(self)

        # 加载省份和城市数据
        with open('area-city.json', 'r', encoding='utf-8') as f:
            self.data = json.load(f)

        # 创建控件
        self.province_cb = wx.ComboBox(panel, choices=[p['name'] for p in self.data], style=wx.CB_READONLY)
        self.city_cb = wx.ComboBox(panel, style=wx.CB_READONLY)
        self.confirm_btn = wx.Button(panel, label='确定')
        self.browser = wx.html2.WebView.New(panel)

        # 绑定事件
        self.province_cb.Bind(wx.EVT_COMBOBOX, self.on_province_select)
        self.confirm_btn.Bind(wx.EVT_BUTTON, self.on_confirm)

        # 设置布局
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.province_cb, 0, wx.ALL | wx.EXPAND, 5)
        sizer.Add(self.city_cb, 0, wx.ALL | wx.EXPAND, 5)
        sizer.Add(self.confirm_btn, 0, wx.ALL | wx.EXPAND, 5)
        sizer.Add(self.browser, 1, wx.ALL | wx.EXPAND, 5)
        panel.SetSizer(sizer)

        self.SetSize(800, 600)

    def on_province_select(self, event):
        province = self.province_cb.GetStringSelection()
        for p in self.data:
            if p['name'] == province:
                cities = p['districts']
                self.city_cb.Clear()
                self.city_cb.AppendItems([city['name'] for city in cities])
                break

    def on_confirm(self, event):
        province = self.province_cb.GetStringSelection()
        city = self.city_cb.GetStringSelection()
        if province and city:
            url = f"https://www.amap.com/search?query={city}"
            self.browser.LoadURL(url)

if __name__ == '__main__':
    app = wx.App()
    frame = MapSelector()
    frame.Show()
    app.MainLoop()

运行项目

要运行这个项目,您需要:

  1. 安装必要的Python库:

    pip install wxPython
    pip install wxPython-webview
    
  2. 准备 ‘area-city.json’ 文件,确保它与Python脚本在同一目录下。

  3. 运行Python脚本。

效果如下

在这里插入图片描述

相关链接

https://github.com/nicez2/china-area-json/blob/master/area-city.json
https://github.com/nicez2/china-area-json/blob/master/area-province.json

总结

通过这个项目,我们学习了:

  1. 如何使用wxPython创建基本的图形用户界面
  2. 如何处理JSON数据
  3. 如何在wxPython应用中嵌入网页浏览器
  4. 如何实现简单的用户交互逻辑

这个项目为更复杂的地理信息应用程序奠定了基础。您可以进一步扩展它,例如添加更多的地理信息,实现地图标记功能,或者集成其他地图API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Camtasia 2024破解版安装教程+汉化补丁激活2024 破解版激活码

最近,我在网上冲浪的时候,发现了一款录屏软件——Camtasia 2024。它不仅功能丰富,而且操作简单,简直是我的录屏利器!今天,我就来给大家分享一下这款软件的最新功能,让你们也感受一下它的魔力&am…

【LeetCode:3137. K 周期字符串需要的最少操作次数 | 哈希表 + 子串计数】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

政务网站(.gov)专用SSL/HTTPS证书

政府网站在选择SSL证书时不仅需要遵循网络安全法规以及密评整改,更要提升公众信任度。国产服务商提供的专业版SSL证书,全方位符合政务部门对SSL证书的要求 1 算法要求 政务服务网站需要落实等保制度、密评制度,在密码应用上可选择国密算法S…

从0到1教你搭建Android自动化python+appium环境(超详细~)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、需要软件 1. JDK:JAVA安装后配置JDK环境 2. SDK:SDK下载后配置adb环境 3. Python:pyhton语言 4. Pycharm:python脚本编译工具 5. Appium-python-clien…

如何巧妙构建“LDAPS”服务器利用JNDI注入

前段时间看到群友问了这样一个问题: ldap:和rmi:关键字被拦截了,是否还可以进行JNDI注入。方法很简单,就是使用ldaps,但后来发现很多人并不知道怎么搭建LDAPS服务器,正好CoNote里有这个功能,写篇简单的文章…

【大模型】LLM工作原理简述

LLM,即large-language-model,大语言模型。 我们可以观察LLM大模型比如豆包在回复的时候,是不是一个一个字,行业里称之为流式输出的方式给你呈现内容的。为什么会这样呢?这是因为,大模型确实是在一个字一个…

Libero编译怪事(1)计数达不到目标值

最近在开发Libero工程,芯片是AGLN250V2。 其中一段计数的程序,声明了一个integer参数。当该参数大于某一值时,执行状态跳转。 编译烧写后,程序一直无法实现跳转。 以为是由于integer是有符号的,可能出现负值&#x…

IDEA中查看接口的所有实现类和具体实现类

1.IDEA中接口的所有实现类查看 1.CTRLH(hierarchy 结构) 我们选中要查看的接口 按住快捷键ctrlh 在界面右侧可以看到该接口的所有可能实现类 2.右击diagrams->show diagram 选中要查看的接口 右击选择diagrams->show diagram 即可以以图表的方式查看接口和所有实现类…

英智金融行业AI Agent,在金融领域全场景下的业务创新与应用实践

随着全球经济的数字化转型,金融行业也在迅速演变。传统的金融服务已经无法完全满足现代客户对快速、个性化和高效服务的需求。与此同时,市场竞争的加剧、监管环境的变化以及客户期望的提升,促使金融机构不断寻求新的技术来优化运营效率、提升…

设计模式---简单工厂模式

简单工厂模式(Simple Factory Pattern) 是一种创建型设计模式,它定义了一个工厂类,通过这个工厂类可以创建不同类型的对象。简单工厂模式的主要目的是将对象的创建逻辑集中在一个地方,简化客户端的代码,使得…

代码复现改进

代码复现,文献复现,文章复现, 算法复现,科研复现 Matlab,Python中英文均可 保证质量,加快你的研究速度 代码改进跑通,模型优化改进

Java - IDEA开发

使用IDEA开发Java程序步骤: 创建工程 Project;创建模块 Module;创建包 Package;创建类;编写代码; 如何查看JDK版本 Package介绍: package是将项目中的各种文件,比如源代码、编译生成的字节码、配置文件、…

Linux驱动开发基础(设备树)

所学来自百问网 目录 1. 引入设备树的原因 2. 设备树语法 2.1 Devicetree格式 2.1.1 DTS文件格式 2.1.2 node的格式 2.1.3 properties的格式 2.1.4 dts 文件包含dtsi文件 2.2 常用属性 2.2.1 #address-cells、#size-cells 2.2.2 compatible 2.2.3 model 2.2.4 st…

使用 Go 语言将 Base64 编码转换为 PDF 文件

使用Go语言将PDF文件转换为Base64编码-CSDN博客文章浏览阅读104次,点赞2次,收藏5次。本文介绍了如何使用 Go 语言将 PDF 文件转换为 Base64 编码,并保存到文件中。https://blog.csdn.net/qq_45519030/article/details/141224319 在现代编程中…

一、前后端分离通用权限系统(1)

🌻🌻 目录 一、项目介绍1.1 项目简介1.1.1 项目特色1.1.2 项目背景1.1.3 前置知识1.1.4 项目大纲 1.2 项目详细介绍1.2.1 介绍1.2.2 核心技术1.2.3 项目模块1.2.4 数据库设计 二、搭建环境2.1、搭建项目结构2.1.1、搭建父工程 gansu-auth-parent2.1.2、搭…

Unity 求坐标点在扇形区域内的投影

视频效果&#xff1a; 代码: /// <summary>/// 投影在扇形区域内的点/// </summary>/// <param name"targetPos">目标点</param>/// <param name"fanRadius">扇形半径</param>/// <param name"fanAngle"…

企业为什么需要安装加密软件

1. 数据保护 防止数据泄露&#xff1a;加密软件通过对敏感数据进行加密处理&#xff0c;确保即使数据在传输或存储过程中被截获&#xff0c;也无法被未授权人员读取或利用&#xff0c;从而有效防止数据泄露。 完整性保护&#xff1a;加密不仅保护数据的机密性&#xff0c;还通…

Vue3+ElementPlus,侧边栏菜单折叠时,图标不显示踩坑笔记

问题如下&#xff1a; 折叠前&#xff1a; 折叠后&#xff1a; 一般有三个问题&#xff0c;会导致这个错误&#xff1a; 排查1 动态图标渲染时&#xff0c;要写el-icon&#xff0c;否则也是不显示的 排查2 嵌套路由需要写在插槽里面&#xff0c;不是嵌套路由则需要写在插…

Ubuntu中服务部署

Ubuntu中服务部署 一、root用户密码一、SSH远程连接二、JDK1.8安装1、解压上传的安装包2、配置jdk环境变量 三、minio安装1、官网下载安装包2、上传文件并授权3、书写启动脚本4、启动及说明5、启动异常 四、nacos安装1、下载上传安装包&#xff0c;并解压2、修改启动脚本3、配置…

【网络安全】重置密码token泄露,实现账户接管

未经许可&#xff0c;不得转载。 文章目录 正文 正文 对某站点测试过程中&#xff0c;登录账户触发忘记密码功能点&#xff0c;其接口、请求及响应如下&#xff1a; PUT /api/v1/people/forgot_password 可以看到&#xff0c;重置密码token和密码哈希均在响应中泄露。 删除co…