任务描述
本关任务:利用 Python 实现动画观察近 30 天 4.5 级以上地震发生情况。
相关知识
为了完成本关任务,你需要掌握:1.如何用 Python 从网络获取所需数据;2.如何用 Python 绘制地图
从网络获取数据
URL 处理模块(库)
在这里插入代码片
import urllib.request as req
创建一个表示远程 url 的类文件对象
urllib.urlopen(" ")
如同本地文件一样读取内容
print data的输出结果:
摘取动画所需数据
数据分析
整体数据可以通过换行符\n断行;
第一行是标题;
每行数据以,间隔,分别处于 0, 1, 2, 3,4 位置的是 time latitude longitude depth magnitude;
最后还有一个空行。
切分并赋值
分析后决定各存储的数据类型、大小;
变量初始化;
切分数据、赋值(数据类型隐式转换)。
逆序处理
数组切片 [: : -1] 。
绘制地图
地图绘制库 Basemap
Plotting data on a map (Example Gallery)
载入地图绘制库
from mpl_toolkits.basemap import Basemap
构建地图
map = Basemap(projection=‘robin')
设置地图参数
示例:绘制首都北京
查找北京的纬度 (116.39, 39.91) ;
将经纬度转换为图像中的位置;
在相应位置绘制首都符号和汉字“北京”。
示例代码:
# 构建地图:
map = Basemap(projection='robin', lon_0=0, resolution='c')
# 北京的纬度和经度
latitudeBeijing = 39.91
longitudeBeijing = 116.39
# 将经纬度转换为图像中的位置(注意参数分别是经度、纬度)
x, y = map(longitudeBeijing, latitudeBeijing)
# 绘制圈中点的首都符号:
map.scatter(x, y, s = 10, marker='o', color='r') # 实心红点
map.scatter(x, y, s = 60, marker='o', color='None’, edgecolor='r') # 空心红圈
# 标记汉字“北京”字样
plt.text(x, y, u'北京', color = 'b', fontsize=10)
过滤掉视图中不可见内容
判断绘制点是否落在地图的可见区域:
# 判断该点是否落在正面可以看到的经度范围(-90,90)
if -90<=longitude<=90:
x, y = map(longitude, latitude)
# 绘制圈中点的首都符号,并显示首都名称:
map.scatter( … )
map.scatter( … )
plt.text(x+350000, y+150000, … )
编程要求
根据提示,在右侧编辑器补充代码,绘制世界地图并用从地震网获取的数据在地图上标出近一个月发生 4.5 级以上地震的地点。
地震数据汇总的网址链接如下:http://earthquake.usgs.gov/earthquakes/feed/v1.0/csv.php
# 请编写代码实现地震地图的绘制
import urllib.request as req
import numpy as np
import warnings
warnings.filterwarnings("ignore")
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
# 请在此添加实现代码 #
# ********** Begin *********#
# 从网络获取数据:
# 地震数据汇总地址:http://earthquake.usgs.gov/earthquakes/feed/v1.0/csv.php
feed="http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/"
# 过去30天强度大于4.5的地震数据文件:
#url指网址
url = feed + "4.5_month.csv"
wfp = req.urlopen(url)
data = wfp.read()
# 地震数据处理及切分:
data = data.decode("utf-8").split('\n')[1:-1]
N = len(data)
latitude=np.zeros(N) #纬度
longitude=np.zeros(N) #经度
magnitude=np.zeros(N) #地震强度
times=['']*N #发生时间
for i in range(N):
row = data[i].split(',')
latitude[i], longitude[i], depth, magnitude[i] = row[1:5]
times[i] = row[0][:10]+' ' + row[0][11:19]
# 数据从从近到远的,需要逆序重排
latitude = latitude[::-1]
longitude = longitude[::-1]
times = times[::-1]
# 构建地图:
map = Basemap(projection='robin', lon_0=0, resolution='c')
#设定了投影方法,球形的地球表面投影到平面地图
# 绘制地图(元素):
map.drawcoastlines(linewidth=0.25) #绘制海岸线
map.drawcountries(linewidth=0.25) #绘制国界线
map.drawmapboundary(fill_color=(0.8, 0.95, 1.0)) #画出地图边界,并填充背景(海洋)
map.fillcontinents(color=(1,0.9,0.7),
lake_color=(0.8, 0.95, 1.0),zorder=0) #填充大陆
for i in range(N):
# 绘制圈中点的首都符号:
x, y = map(longitude[i], latitude[i]) # 将经纬度转换为图像中的位置
map.scatter(x, y, s = 40, marker='o', color='r') # 实心红点 # 实心红点
# ********** End **********#
plt.savefig('./practice/practice.png')