毕业季,同窗去哪儿?

正值毕业季,同窗好友们大部分都签约工作了;还有的准研究生们,在今天2.20日也查询到自己考研成绩,希望大家都心想事成,去到满意的地方,开始新的生活。
在这里插入图片描述
这两天班长做了一个小统计,毕业去向表(大致是姓名和目前状态签约XXX考研XXX

在这里插入图片描述
嗯,都是听过或没听过名字的公司或学校名!
在这里插入图片描述
一个校园内,我们很近;天南海北,我们很远!
在这里插入图片描述

我们都来自重庆交通大学-物联网工程专业,我们大多数的选择去到了上海、杭州、深圳、四川、重庆。在这里插入图片描述
地图上的距离好像也不是那么远!有空,还可以聚聚~
在这里插入图片描述
以下是地图绘制的过程~

一、地图绘制

  • 语言python
  • 基于xlrd插件处理表格
  • 百度地图api定位地点
  • pyecharts绘制地图

二、过程

1. 基于xlrd插件处理表格

表格数据大致三类:
在这里插入图片描述
提取出表格姓名和已签约公司或考研学校,将学生信息存入集合中
[ ['小红', '四川XX集团'], ['小明', '广州XX电子有限公司'],['小吴', ''], ['小王', '重庆大学']]

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import xlrd

def read_xsls(xlsx_path):
    list = []
    # 打开excel文件,创建一个workbook对象,book对象也就是fruits.xlsx文件,表含有sheet名
    rbook = xlrd.open_workbook(xlsx_path)
    # sheets方法返回对象列表,[<xlrd.sheet.Sheet object at 0x103f147f0>]
    rbook.sheets()
    # xls默认有3个工作簿,Sheet1,Sheet2,Sheet3
    rsheet = rbook.sheet_by_index(0)  # 取第一个工作簿

    # 循环工作簿的所有行
    for row in rsheet.get_rows():
        student_column = row[0]  # 姓名所在的列
        student_value = student_column.value  # 姓名名
        if student_value != '姓名':  # 排除第一行
            state_column = row[3]  # 公司所在的列
            state_value = state_column.value
            sign = str(state_value)[0:2]
            if sign == '签约':
                company = str(state_value)[2:]
                list.append([student_value, company])
                # 打印
                print(student_value, "\t", company)
            if sign == '考研':
                school = str(state_value)[2:]
                list.append([student_value, school])
                # 打印
                print(student_value, "\t", school)
            if sign == '求职':
                list.append([student_value, ''])
                print(student_value, "\t", state_value)
    return list


if __name__ == '__main__':
    xlsx_path = './data.xlsx'
    studentlist = read_xsls(xlsx_path)
    print("读取学生信息:", studentlist)

2. 百度地图api定位地点

首先需要在百度地图注册账号获得ak(appkey)应用秘钥,
步骤:

  • 进入控制台-》应用管理-》创建应用
  • 强调:选择浏览器端(python采用request访问机制,模拟浏览器进行请求定位)
  • 白名单:* (所有域名可使用此ak秘钥)
    在这里插入图片描述

获得你的ak秘钥:
在这里插入图片描述
百度api-python使用如下:采取requests模拟浏览器访问api获得返回值

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import json
import requests
import urllib.parse
url = 'http://api.map.baidu.com/geocoding/v3/'

ak = "36RTGvTpxEdBHAZL817U5PSIGffRmwOe"#你的ak秘钥


def getGPS(addr):
    data1 = {
        "address": addr
    }
    data2 = {
        'output': 'json',
        'ak': ak
    }
    query_string1 = urllib.parse.urlencode(data1)
    query_string2 = urllib.parse.urlencode(data2)
    getUrl = url + '?' + query_string1 + '&' + query_string2
    result = (json.loads(requests.get(getUrl).text)["result"])[
        "location"]    # {'lng': XX.XXXXXXXXXXX, 'lat': XX.XXXXXXXXXXXXXX}

    lng = result["lng"]
    lat = result["lat"]
    print((lng, lat))
    return lng, lat


getGPS("重庆交通大学")

返回经纬度:(106.54271560556826, 29.65925719891873)

3. pyecharts绘制地图

安装echarts和中国地图:

pip install pyecharts
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg

使用方法:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import urllib.parse
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import ChartType, SymbolType
from pyecharts.types import LineStyle


def draw_geo():
    g = Geo()
    g.add_schema(maptype="china")

    # 加入自定义的点,格式为
    g.add_coordinate('geo', 106.54271560556826, 29.65925719891873)
    # 为自定义的点添加属性
    g.add('geo', [('geo', 51)],
          type_=ChartType.EFFECT_SCATTER,)
    g.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    g.set_global_opts(title_opts=opts.TitleOpts(title="自定义点"))
    # 在 html(浏览器) 中渲染图表
    g.render('render.html')
    print("绘图成功保存在render.html")


draw_geo()

效果图:
在这里插入图片描述

三、完整代码

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import xlrd
import json
import requests
import urllib.parse
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import ChartType, SymbolType
from pyecharts.types import LineStyle
url = 'http://api.map.baidu.com/geocoding/v3/'

ak = "36RTGvTpxEdBHAZL817U5PSIGffRmwOe"

# 获取经纬度方法
def getGPS(addr):
    data1 = {
        "address": addr
    }
    data2 = {
        'output': 'json',
        'ak': ak
    }
    query_string1 = urllib.parse.urlencode(data1)
    query_string2 = urllib.parse.urlencode(data2)
    getUrl = url + '?' + query_string1 + '&' + query_string2
    result = (json.loads(requests.get(getUrl).text)["result"])[
        "location"]    # {'lng': XX.XXXXXXXXXXX, 'lat': XX.XXXXXXXXXXXXXX}

    lng = result["lng"]
    lat = result["lat"]
    #print((lng, lat))
    return lng, lat

# 读取表格
def read_xsls(xlsx_path):
    list = []
    # 打开excel文件,创建一个workbook对象,book对象也就是fruits.xlsx文件,表含有sheet名
    rbook = xlrd.open_workbook(xlsx_path)
    # sheets方法返回对象列表,[<xlrd.sheet.Sheet object at 0x103f147f0>]
    rbook.sheets()
    # xls默认有3个工作簿,Sheet1,Sheet2,Sheet3
    rsheet = rbook.sheet_by_index(0)  # 取第一个工作簿

    # 循环工作簿的所有行
    for row in rsheet.get_rows():
        student_column = row[0]  # 姓名所在的列
        student_value = student_column.value  # 姓名名
        if student_value != '姓名':  # 排除第一行
            state_column = row[3]  # 公司所在的列
            state_value = state_column.value
            sign = str(state_value)[0:2]
            if sign == '签约':
                company = str(state_value)[2:]
                list.append([student_value, company])
                # 打印
                #print(student_value, "\t", company)
            if sign == '考研':
                school = str(state_value)[2:]
                list.append([student_value, school])
                # 打印
                #print(student_value, "\t", school)
            if sign == '求职':
                list.append([student_value, ''])
                #print(student_value, "\t", state_value)

    return list

# 批量标经纬度
def get_positions(list):
    list_GPS = []
    for item in list:
        place = item[1]
        # print(place)
        if len(place) != 0:
            lng, lat = getGPS(place)
            list_GPS.append([item[0], item[1], lng, lat])
    # print(list_GPS)
    return list_GPS

# 绘图
def draw_geo(list_GPS):
    g = Geo()
    g.add_schema(maptype="china")
    for item in list_GPS:
        # 加入自定义的点,格式为
        g.add_coordinate(item[0][0:1], item[2], item[3])
        # 为自定义的点添加属性
        g.add(item[0][0:1], [(item[0][0:1], item[1])],
              type_=ChartType.EFFECT_SCATTER,)
    g.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
                      linestyle_opts=opts.LineStyleOpts(2))
    g.set_global_opts(title_opts=opts.TitleOpts(title="物联网1601班"))
    # 在 html(浏览器) 中渲染图表
    g.render('render.html')
    print("绘图成功保存在render.html")


if __name__ == '__main__':
    xlsx_path = './data.xlsx'
    studentlist = read_xsls(xlsx_path)
    print("读取学生信息:", studentlist)
    list_GPS = get_positions(studentlist)
    print("获取学生信息有效定位:", list_GPS)
    draw_geo(list_GPS)

效果:
在这里插入图片描述
如果还需要美化,可以修改g.set_series_opts()这一部分哦!

最后,

在这里插入图片描述

发布了213 篇原创文章 · 获赞 376 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/cungudafa/article/details/104416072