本文概述
![]()
在本教程中, 你将了解两个流行于地理空间数据的软件包:geopandas和Shapely。然后, 你将应用这两个软件包使用Python读取地理空间数据, 并绘制8月30日至9月18日飓风佛罗伦萨的踪迹。
什么是地理空间数据?
空间数据, 地理空间数据, GIS数据或地理数据是数字数据的名称, 该数字数据根据地理坐标系识别诸如建筑物, 街道, 城镇, 城市, 国家等物理对象的地理位置。 。从空间数据中, 你不仅可以找到位置, 还可以找到任何对象的长度, 大小, 面积或形状。可以获取的一种空间数据的示例是:对象的坐标, 例如纬度, 经度和海拔。地理信息系统(GIS)或其他专用软件应用程序可用于访问, 可视化, 操纵和分析地理空间数据。
为什么选择地理空间数据?
地理空间数据在我们的日常生活中具有大量应用。一个示例是你用于从一个位置导航到其他位置的地图应用程序。你每天可能会看到的另一个天气频道。
![]()
是的, 地理空间数据用于表示某物相对于其周围其他事物的位置信息:城市地图上的房屋, 世界地图上的飓风等。因此, 在本教程中, 你将了解破坏性的佛罗伦萨飓风并跟踪其位置。
聊够了, 让我们动手吧
包装要求
不要跳过。这是重要的部分。如果不确定你是否满足要求, 请再次检查。首先, 你需要安装以下所有软件包。
熊猫:提供数据结构和数据分析工具
Numpy:使用Python进行科学计算的基本软件包
SciPy :(发音为” Sigh Pie”)是用于数学, 科学和工程的基于Python的开源软件生态系统
RTree:libspatialindex的ctypes Python包装器, 提供许多高级空间索引功能
GDAL:栅格和矢量地理空间数据格式的转换器库
Fiona:Fiona读写空间数据文件
匀称:几何对象, 谓词和运算
GeoPandas:扩展了熊猫使用的数据类型, 以允许对几何类型进行空间操作。
PySAL:一个用Python编写的空间分析函数库, 旨在支持高级应用程序的开发。
Matplotlib:Python 2D绘图库
Missingno:缺少Python的数据可视化模块
按照上述顺序安装所有软件包, 以确保一切正常。有些软件包是其他软件包的先决条件, 例如:安装GeoPandas, 需要Shapely和安装Shapely;应该安装RTree, GDAL和Fiona。安装软件包的最简单方法是:pip install PACKAGE_NAME
如果你使用的是Windows, 但无法通过该方式安装软件包, 请访问此网站以下载相关的软件包, 并点安装PATH_TO_PACKAGE。
关于数据:
如你所知, 可怕的飓风佛罗伦萨刚刚经过美国东海岸的一部分, 估计造成170亿美元的损失。本教程将帮助你找出它的来源, 何时何地变得更强大, 并更多地了解这种自然灾害并在Python中进行分析。有许多网站提供有关此飓风的信息。例如, 此网站提供了1902年至2018年美国几次暴风雨和飓风的数据, 因此有大量可用数据供你以后使用。在本教程中, 你将仅使用飓风佛罗伦萨数据
你还将使用来自互联网的美国地图地理空间数据。埃里克·塞莱斯特(Eric Celeste)的这篇博客文章提供了美国各州和各州的各种边界数据文件。本教程中使用的数据是美国5m GeoJSON文件。
# Load all importance packages
import geopandas
import numpy as np
import pandas as pd
from shapely.geometry import Point
import missingno as msn
import seaborn as sns
import matplotlib.pyplot as plt
% matplotlib inline
首先, 让我们看一下第一个地理空间数据框:美国州地理数据
# Getting to know GEOJSON file:
country = geopandas.read_file("data/gz_2010_us_040_00_5m.json")
country.head()
![]()
检查刚刚加载的数据框的类型, 你会看到它是地理数据框, 它具有Pandas数据框的所有常规特征。
type(country)
geopandas.geodataframe.GeoDataFrame
检查包含坐标的列的数据类型:GeoSeries。
type(country.geometry)
geopandas.geoseries.GeoSeries
GeoSeries中的每个值都是一个Shapely对象。有可能:
点
线
多边形
多多边形
每个对象都可以用于不同类型的物理对象, 例如:用于建筑物的点, 用于街道的线, 用于城市的多边形和用于内部有多个城市的国家的MultiPolygon。有关每个几何对象的更多信息, 请阅读本文:https://shapely.readthedocs.io/en/stable/manual.html#geometric-objects
type(country.geometry[0])
shapely.geometry.multipolygon.MultiPolygon
与Pandas DataFrame相似, GeoDataFrame也具有属性图, 该属性图利用数据框中的几何图形来绘制地图:
country.plot()
![]()
你可能会看到, 与框架相比, 美国地图相对较小。这是因为这些信息包括分布在各地的阿拉斯加, 夏威夷和波多黎各。出于本教程的目的, 你可以排除阿拉斯加和夏威夷, 因为飓风没有在这两个州附近发生。你还可以添加图形大小和颜色来自定义你自己的图:
# Exclude Alaska and Hawaii for now
country[country['NAME'].isin(['Alaska', 'Hawaii']) == False].plot(figsize=(30, 20), color='#3B3C6E');
![]()
没那么难, 对!现在你有了美国地图, 让我们加载飓风数据:
florence = pd.read_csv('data/florence.csv')
florence.head()
![]()
探索性数据分析
加载任何数据集时, 这始终是你要做的第一件事:
检查信息, 数据类型
任何遗漏的值
统计数据
florence.info()
RangeIndex: 105 entries, 0 to 104
Data columns (total 11 columns):
AdvisoryNumber 105 non-null object
Date 105 non-null object
Lat 105 non-null float64
Long 105 non-null float64
Wind 105 non-null int64
Pres 105 non-null int64
Movement 105 non-null object
Type 105 non-null object
Name 105 non-null object
Received 105 non-null object
Forecaster 104 non-null object
dtypes: float64(2), int64(2), object(7)
memory usage: 9.1+ KB
使用missingno包检查缺失值。这是使用可视化显示丢失数据的有用软件包。如你在下面看到的, ” Forecaster”列中只有一个缺少的值, 对于本教程而言, 你不需要。因此, 你现在可以忽略它。
# Notice you can always adjust the color of the visualization
msn.bar(florence, color='darkolivegreen');
![]()
查看一些统计信息, 其中一些信息可能非常有用, 例如平均风速, 飓风的最大和最小风速等。
# Statistical information
florence.describe()
岁月
long
风
压力
计数
105.000000
105.000000
105.000000
105.000000
意思
25.931429
56.938095
74.428571
981.571429
小时
7.975917
20.878865
36.560765
22.780667
我
12.900000
18.400000
25.000000
939.000000
25%
18.900000
41.000000
40.000000
956.000000
50%
25.100000
60.000000
70.000000
989.000000
75%
33.600000
76.400000
105.000000
1002.000000
最大值
42.600000
82.900000
140.000000
1008.000000
对于大多数数据, 你将需要清理并仅处理需要处理的内容。在这里, 你只需要时间和坐标:纬度和经度, 风速, 压力和名称。移动和类型是可选的, 但其余的可以删除。
# dropping all unused features:
florence = florence.drop(['AdvisoryNumber', 'Forecaster', 'Received'], axis=1)
florence.head()
![]()
通常, 如果你自己绘制数据, 则无需格外注意坐标。但是, 如果你希望它看起来与地图上的外观相似, 则检查经度和纬度非常重要。这里的经度是西, 你需要在数字前添加”-“以正确绘制数据:
# Add "-" in front of the number to correctly plot the data:
florence['Long'] = 0 - florence['Long']
florence.head()
![]()
然后, 你可以组合纬度和经度以创建飓风坐标, 随后将其转换为GeoPoint以进行可视化。
# Combining Lattitude and Longitude to create hurricane coordinates:
florence['coordinates'] = florence[['Long', 'Lat']].values.tolist()
florence.head()
![]()
# Change the coordinates to a geoPoint
florence['coordinates'] = florence['coordinates'].apply(Point)
florence.head()
![]()
检查佛罗伦萨数据框的类型和佛罗伦萨数据的列坐标。它是pandas DataFrame和pandas系列。
type(florence)
pandas.core.frame.DataFrame
type(florence['coordinates'])
pandas.core.series.Series
将数据转换为地理空间数据后, 我们将再次检查佛罗伦萨数据框的类型和佛罗伦萨数据的列坐标。现在是Geo DataFrame和GeoSeries。
# Convert the count df to geodf
florence = geopandas.GeoDataFrame(florence, geometry='coordinates')
florence.head()
![]()
type(florence)
geopandas.geodataframe.GeoDataFrame
type(florence['coordinates'])
geopandas.geoseries.GeoSeries
请注意, 即使现在它是一个Geo DataFrame和Geo系列, 它的行为仍然像普通的DataFrame和一个Series。这意味着你仍然可以对数据帧执行过滤, 分组依据, 或提取列的最小值, 最大值或平均值。
# Filtering from before the hurricane was named.
florence[florence['Name']=='Six']
![]()
# Groupping by name to see how many names it has in the data set:
florence.groupby('Name').Type.count()
Name
FLORENCE 6
Florence 85
SIX 4
Six 10
Name: Type, dtype: int64
计算飓风佛罗伦萨的平均风速:
print("Mean wind speed of Hurricane Florence is {} mph and it can go up to {} mph maximum".format(round(florence.Wind.mean(), 4), florence.Wind.max()))
Mean wind speed of Hurricane Florence is 74.4286 mph and it can go up to 140 mph maximum
因此, 佛罗伦萨飓风的平均风速为每小时74.43英里(每小时119.78公里), 最大时速为140英里每小时(每小时225.308公里)。为了想象这种风速有多可怕, 由英国皇家海军开发的Beaufort Wind Scale网站显示了风在水上和陆地上的出现。以每小时48至55英里的速度, 它已经可以折断并连根拔起树木, 并造成”相当大的结构破坏”。
![]()
你现在不想在那儿。
可视化
与pandas Dataframe相似, GeoDataFrame也具有.plot属性。但是, 此属性利用GeoDataFrame中的坐标将其映射出来。让我们来看看:
florence.plot(figsize=(20, 10));
![]()
发生了什么?你所看到的只是一堆没有导航的点。有什么问题吗?
不, 一切都很好。由于此数据框在每个时间点仅具有飓风佛罗伦萨的坐标信息(位置), 因此我们只能在空白地图上绘制位置。
因此, 下一步是在美国地图上绘制飓风的位置, 以查看飓风袭击的地点以及当时的飓风强度。为此, 你将使用美国地图坐标(我们在开始时加载的数据)作为基础, 并在其上方绘制飓风佛罗伦萨的位置。
# Plotting to see the hurricane overlay the US map:
fig, ax = plt.subplots(1, figsize=(30, 20))
base = country[country['NAME'].isin(['Alaska', 'Hawaii']) == False].plot(ax=ax, color='#3B3C6E')
# plotting the hurricane position on top with red color to stand out:
florence.plot(ax=base, color='darkred', marker="*", markersize=10);
![]()
看起来很棒!现在, 我们将用更多详细信息完成它, 例如:
添加标题
根据风速为飓风位置上色, 以查看飓风袭击每个城市时的强度。
拆下轴
添加图例
将结果保存到图像文件中以备后用
fig, ax = plt.subplots(1, figsize=(20, 20))
base = country[country['NAME'].isin(['Alaska', 'Hawaii']) == False].plot(ax=ax, color='#3B3C6E')
florence.plot(ax=base, column='Wind', marker="
_ = ax.axis('off')
plt.legend()
ax.set_title("Hurricane Florence in US Map", fontsize=25)
plt.savefig('Hurricane_footage.png', bbox_inches='tight');
![]()
因此, 飓风在东海岸附近离岸时最强烈。当飓风接近陆地时, 飓风开始失去力量, 但是在每小时60到77英里的风速下, 飓风仍然会造成可怕的破坏。
总结
做得好!你已经了解了一些在Python中处理地理空间数据的必要步骤。你还将学习如何绘制地理空间数据, 以及如何自定义图表的形状, 颜色和叠加以显示故事。如果你想练习自己的技能, 则可以在线获取大量的地理空间数据, 以进行尝试。我上面提供的天气网站就是一个例子。
对于资源, 请看一本书:Karim Bahgat(2015)撰写的” Python地理空间开发要点”, 以获取更深入的指导。
如果你想与我联系, 可以给我发送电子邮件dqvu.ubc@gmail.com或通过LinkedIn与我联系。祝你学习愉快并保持安全!
如果你想了解有关Python中地理空间数据的更多信息, 请参加srcmini的Python中地理空间数据可视化课程。
以下是本教程中使用的数据:
export.csv
佛罗伦萨
gz_2010_us_040_00_5m
hurricane_data