本文概述
在本教程中, 你将了解两个流行于地理空间数据的软件包: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()
<matplotlib.axes._subplots.AxesSubplot at 0x1cfe68c1358>
你可能会看到, 与框架相比, 美国地图相对较小。这是因为这些信息包括分布在各地的阿拉斯加, 夏威夷和波多黎各。出于本教程的目的, 你可以排除阿拉斯加和夏威夷, 因为飓风没有在这两个州附近发生。你还可以添加图形大小和颜色来自定义你自己的图:
# 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()
<class 'pandas.core.frame.DataFrame'>
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="<", markersize=10, cmap='cool', label="Wind speed(mph)")
_ = 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
评论前必须登录!
注册