任务描述

本关任务:利用 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')