Спецификация Cartopy Plot c, содержащаяся в шейп-файле - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть шейп-файл основных дорог в Нью-Гемпшире (TIGER / Line), полученный из Бюро переписей США (файл найден здесь ), и я пытаюсь нанести их на карту, используя тандем Cartopy / Matplotlib.

Атрибуты шейп-файла

Атрибут shapefile разделен на четыре класса: LINEARID, FULLNAME, RTTYP, & MTFCC

Первый подход | Plot All Lines

Первый подход состоял в том, чтобы загрузить шейп-файл с помощью cartopy.feature и построить его, что можно увидеть в следующем фрагменте кода. Это сработало, как и ожидалось, и построило каждую дорожную линию, содержащуюся в шейп-файле:

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)

Второй подход | Спецификация графика c Атрибут

Второй подход состоял в том, чтобы использовать Cartopy Reader для определения местоположения и отображения только тех линий графика, которые соответствуют указанному атрибуту c. Прочитав эту статью из НАСА, я использовал примеры для написания следующего кода:

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')

Это не отображало нужные линии в шейп-файле. Какие исправления могут быть сделаны, чтобы этот код работал правильно?

1 Ответ

0 голосов
/ 23 февраля 2020

Лучшее решение для выполнения этой задачи - использовать библиотеку Geo pandas в Python. Мой код был вдохновлен этой веб-статьей, однако я немного расширил его использование в ответе ниже.

Фрагмент кода

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')

Важные замечания

Шейп-файл считывается в привычную структуру фрейма данных, как видно при использовании Pandas. Вы заметите: data[(data.RTTYP == 'I') | (data.RTTYP == 'U') | (data.FULLNAME == 'State Rte 101') | (data.FULLNAME == 'Rte 101')]

Это использование поэлементной логики c было получено из этого примера , который можно расширить до других более крупных, богатых данными шейп-файлов

...