Найти границы карты для подмножества патчей в шейп-файле (Python)
Я пытаюсь нарисовать карту некоторых регионов в шейп-файле в Python. Мой основной подход заключается в следующем:
shp = fiona.open("C:/Users/nils/Documents/Maps/my_shapefile.shp")
bds = shp.bounds
ll = (bds[0], bds[1])
ur = (bds[2], bds[3])
coords = list(ll + ur)
w, h = coords[2] - coords[0], coords[3] - coords[1]
# Make figure instance, add Basemap and CCG boundaries from shapefile
fig, ax = plt.subplots(figsize=(12,10))
m = Basemap(projection="tmerc", lon_0 = -2., lat_0 = 49., ellps="WGS84",
llcrnrlon = coords[0], llcrnrlat = coords[1],
urcrnrlon = coords[2], urcrnrlat = coords[3],
lat_ts = 0, resolution="i", suppress_ticks=True)
m.readshapefile("C:/Users/nils/Documents/Maps/my_shapefile.shp", "Regions")
# Extract polygon coordinates of and names of regions to plot from shapefile
to_plot = ["region_A", "region_B", "region_C"]
poly = []; name = []
for coordinates, region in zip(m.Regions, m.Regions_info):
if any(substr in region["name"] for substr in to_plot):
poly.append(Polygon(coordinates))
name.append(region["name"])
# Turn polygons into patches using descartes
patches = []
for i in poly:
patches.append(PolygonPatch(i, facecolor='#006400', edgecolor='#787878', lw=0.25, alpha=0.5))
# Add PatchCollection to basemap
ax.add_collection(PatchCollection(patches, match_original=True))
Теперь моя проблема с этим заключается в том, что шейп-файл охватывает большую географическую область, но я хочу только построить подмножество этой области (подумайте, например, у меня есть шейп-файл Великобритании, но я хочу построить карту всех регионов в Уэльсе). Теперь я могу определить правильные регионы и добавить только эти патчи, как в примере выше, но matplotlib по-прежнему будет отображать границы всех областей в шейп-файле и границы, определенные fiona. bounds
метод, очевидно, не зависит от подмножества патчей, которые я выбрал.
У меня есть два вопроса, касающихся этого:
Как я могу заставить matplotlib рисовать только границы подмножества патчей, определенных в шейп-файле?
Как я могу получить границы подмножества патчей, аналогичных тем, что у Фионы
bound
метод делает для всего шейп-файла?
2 ответа
Чтобы ответить и на вторую часть, вот функция, которая достигает желаемого результата:
def get_bounds(patch_list):
m = Basemap()
# Read in shapefile, without drawing anything
m.readshapefile("C:/Users/ngudat/Documents/Maps/CCG/CCG_boundaries_2015", "patches", drawbounds=False)
# initialize boundaries (this is a bit of a manual step, might be better to intialize to boundaries of first patch or something)
lon_min = 0.
lon_max = -3.
lat_min = 60.
lat_max = 0.
for (shape, patch_name) in zip(m.patches, m.patches_info):
if patches["name"] in patch_list:
lon, lat = zip(*shape)
if min(lon) < lon_min:
lon_min = min(lon)
if max(lon) > lon_max:
lon_max = max(lon)
if min(lat) < lat_min:
lat_min = min(lat)
if max(lat) > lat_max:
lat_max = max(lat)
return lon_min, lat_min, lon_max, lat_max
Вероятно, не самый эффективный способ сделать это, и шаг инициализации, возможно, придется изменить, но идея должна легко применяться к подобным ситуациям.
Чтобы (частично) ответить на мой первый вопрос, один из способов добиться этого - позвонить readshapefile
с drawbounds=False
; в этом случае на карте не будет никаких границ, но границы моего выбора регионов будут нарисованы с помощью патчей в любом случае.