gpt4 book ai didi

python - 在 shapefile (Python) 中查找补丁子集的 map 边界

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:22 25 4
gpt4 key购买 nike

我试图在 Python 的 shapefile 中绘制一些区域的 map 。我的基本方法是这样的:

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

现在我的问题是 shapefile 覆盖了更大的地理区域,但我只想绘制该区域的一个子集(想想我有一个英国 shapefile,但想绘制威尔士所有地区的 map ) .现在我可以识别正确的区域并且只添加上面示例中的那些补丁,但是 matplotlib 仍然会在 shapefile 中绘制所有区域的边界,并且由 fiona 的 bounds 方法识别的边界显然是独立的我选择的补丁子集。

我有两个与此相关的问题:

  1. 如何让 matplotlib 仅绘制 shapefile 中定义的部分补丁的边界?

  2. 我怎样才能获得补丁子集的边界,类似于 fiona 的 bound 方法对整个 shapefile 的作用?

最佳答案

为了回答第二部分,这里有一个函数可以达到预期的结果:

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

这可能不是最有效的方法,初始化步骤可能需要更改,但这个想法应该很容易适用于类似情况。

关于python - 在 shapefile (Python) 中查找补丁子集的 map 边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34632802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com