Shapefile 中包含的 Cartopy 图特定属性

Cartopy Plot Specific Attributes Contained In Shapefile

我有一个从 U.S 人口普查局获得的新罕布什尔州主要道路 (TIGER/Line) 的 shapefile(找到文件 here),我正尝试使用Cartopy/Matplotlib 串联。

Shapefile 的属性

shapefile 属性分为四个 类:LINEARIDFULLNAMERTTYPMTFCC

第一种方法 |绘制所有线条

第一种方法是使用 cartopy.feature 加载 shapefile 并绘制它,可以在以下代码片段中看到。这按预期工作,并绘制了 shapefile 中包含的每条道路线:

from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature
roads = '/path/to/file/majorroads.shp'
roads_feature = ShapelyFeature(Reader(roads).geometries(), crs.LambertConformal(), facecolor='none', edgecolor='gray')
ax.add_feature(roads_feature, linewidth=0.75)

第二种方法 |绘制特定属性

第二种方法是使用 Cartopy Reader 定位并仅绘制满足特定属性的线条。在阅读了来自 NASA 的 this 文章后,我使用示例编写了以下代码:

from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature
roads = '/path/to/file/majorroads.shp'
roads_feature = Reader(roads)
parts = roads_feature.records()
for part in parts:
    if part.attributes['FULLNAME'] == 'US Hwy 202':
        ax.add_geometries(part.attributes, linewidth=0.50, facecolor='none', edgecolor='gray')

这没有在 shapefile 中绘制所需的线条。可以进行哪些更正以确保此代码正常工作?

执行此任务的最佳解决方案是利用 Python 中的 Geopandas 库。我的代码的灵感来自 this 网络文章,但是我在下面的答案中扩展了它的使用。

代码段

import geopandas as gpd
data = gpd.read_file('/path/to/file/majorroads.shp')
sorted = data[(data.RTTYP == 'I') | (data.RTTYP == 'U') | (data.FULLNAME == 'State Rte 101') | (data.FULLNAME == 'Rte 101')]
ax.add_geometries(sorted.geometry, crs=crs.LambertConformal(), linewidth=1.00, facecolor='none', edgecolor='gray')

重要提示

shapefile 被读入熟悉的数据帧结构,如 Pandas 使用中所见。您会注意到:data[(data.RTTYP == 'I') | (data.RTTYP == 'U') | (data.FULLNAME == 'State Rte 101') | (data.FULLNAME == 'Rte 101')]

这种按元素逻辑的使用源自 this example,它可以扩展到其他更大的、数据丰富的 shapefile