项目背景
跨国公司拥有跨境运输和国内运输两种模式,希望通过地图直观的表现出航线,并可视化出不同的运输方式。
国际航线:
准备步骤 接入要使用到的包
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ChartType, SymbolType
from pyecharts.charts import Map
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType
import os
import numpy as np
import pandas as pd
第一步 数据清理: 从复杂的进出口表中选取需要的信息,如起始点,终点,运输方式等
inbound_raw_data=pd.read_excel(路径)
inbound_filtered=inbound_raw_data[['Supplier','Sea/Air','FG W']]
inbound_filtered['Destination']='China'
inbound_filtered=inbound_filtered.rename(columns={'Supplier':'origin','Sea/Air':'Transportation'})
#讲字段的大小写统一
Trans_map={'Air':'AIR',
'Sea':'SEA',
'Train':'TRAIN',
'AIR':'AIR',
'SEA':'SEA',
'TRAIN':'TRAIN'}
inbound_filtered['Transportation']=inbound_filtered['Transportation'].map(Trans_map)
inbound_group=inbound_filtered.groupby(['origin','Transportation','Destination'],as_index=False).agg({'FG W':sum})
print(inbound_group.head())
countries_map={'FRANCE':'France',
'JAPAN':'Japan',
'KOREA':'Korea',
'SINGAPORE':'Singapore',
'SPAIN':'Spain',
'USA':'United States',
'HONGKONG':'Hongkong',
'INDONESIA':'Indonesia',
'MALAYSIA':'Malaysia',
'France':'France'}
inbound_group['origin']=inbound_group['origin'].map(countries_map)
第二步 将处理好的数据转化为一一对应的列表。
inbound_all_weight=inbound_group.drop(columns=['Transportation','Destination'])
inbound_Air_line=inbound_Air.drop(columns=['Transportation','FG W'])
inbound_all_weight=inbound_all_weight.groupby(['origin'],as_index=False).sum()
print(inbound_all_weight)
#Data1是起始地点的载货重量 所以只需要orgin和weight 一一对应
data1=[]
for index in range(len(inbound_all_weight)):
city_ionfo=[inbound_all_weight['origin'].values[index],inbound_all_weight['FG W'].values[index]]
data1.append(city_ionfo)
#Data2是起止地点
data2=[]
for index in range(len(inbound_Air_line)):
city_ionfo_2=[inbound_Air_line['origin'].values[index],inbound_Air_line['Destination'].values[index]]
data2.append(city_ionfo_2)
print(data2)
第三步 将海运和陆运也标记上
inbound_Sea=inbound_group.query('Transportation=="SEA"')
inbound_Sea_line=inbound_Sea.drop(columns=['Transportation','FG W'])
inbound_Sea_line=inbound_Sea_line.dropna()
inbound_Sea_line=inbound_Sea_line.drop_duplicates(['origin'])
data3=[]
for index in range(len(inbound_Sea_line)):
city_ionfo_3=[inbound_Sea_line['origin'].values[index],inbound_Sea_line['Destination'].values[index]]
data3.append(city_ionfo_3)
print(data3)
inbound_train=inbound_group.query('Transportation=="TRAIN"')
inbound_train_line=inbound_train.drop(columns=['Transportation','FG W'])
inbound_train_line=inbound_train_line.dropna()
data4=[]
for index in range(len(inbound_train_line)):
city_ionfo_4=[inbound_train_line['origin'].values[index],inbound_train_line['Destination'].values[index]]
data4.append(city_ionfo_4)
print(data4)
第四步 Echarts的Geo模块处理国内的数据很简单 使用对应的城市名可以自动定位,但是国际城市需要自己添加经纬度。使用add_coordinate
geo = Geo()
geo.add_coordinate(name="China",longitude=120.6,latitude=31.3)
geo.add_coordinate(name="France",longitude=2.2,latitude=48.52)
geo.add_coordinate(name="Japan",longitude=138.4,latitude=34.8)
geo.add_coordinate(name="Korea",longitude=126.58,latitude=37.33)
geo.add_coordinate(name="Singapore",lo