2

我不确定如何从 Python 中的 shapefile 绘制虚线。看来 readshapefile() 没有任何线型供我设置。下面我有一个工作代码,我在其中获取一个 shapefile 并绘制它,但它只绘制一条实线。有什么想法可以让我朝着正确的方向前进吗?谢谢!

shapefile 可在此处找到:http: //www.natice.noaa.gov/products/daily_products.html,其中开始日期为 2 月 15 日,结束日期为 2 月 17 日,日期类型为 Ice Edge。它应该是第一个链接。

#!/awips2/python/bin/python

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

map = Basemap(llcrnrlon=-84.37,llcrnrlat=42.11,urcrnrlon=-20.93,urcrnrlat=66.48,
     resolution='i', projection='tmerc', lat_0 = 55., lon_0 = -50.)

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='#ddaa66',lake_color='aqua')
map.drawcoastlines(zorder = 3)

map.readshapefile('nic_autoc2018046n_pl_a', 'IceEdge', zorder = 2, color = 'blue')

plt.show()
4

1 回答 1

1

从底图文档:

返回包含形状文件信息的元组 (num_shapes, type, min, max)。num_shapes 是形状的数量,type 是类型代码(shapelib 模块中定义的 SHPT* 常量之一,参见 http://shapelib.maptools.org/shp_api.html),min和 max 是 4 元素列表顶点的最小值和最大值。 如果 drawbounds=True 一个 matplotlib.patches.LineCollection 对象被附加到元组。

drawboundsTrue默认的,所以你所要做的就是收集返回值readshapefile并改变linestyle返回LineCollection对象的值,这可以用LineCollection.set_linestyle(). 所以原则上你可以改变你绘制的形状文件的线条样式,如下所示:

result = m.readshapefile('shapefiles/nic_autoc2018046n_pl_a', 'IceEdge', zorder = 10, color = 'blue')#, drawbounds = False)
col = result[-1]
col.set_linestyle('dotted')
plt.show()

但是,您shapefile包含 5429 个不同长度的单独线段,并且 matplotlib 似乎无法处理如此大量的非连续线。至少在我的机器上,绘图没有在一小时内完成,所以我中断了这个过程。我用你的文件玩了一下,似乎很多行都不必要地分成了几段(我猜这是因为冰盖轮廓以某种方式在瓷砖上确定,然后拼凑在一起,但只有提供者才会真正知道)。也许将相邻的部分拼凑在一起会有所帮助,但我不确定。

我还想知道结果是否会用虚线看起来那么好,因为有很多急弯。下面我展示了一张图片,其中我只使用此代码绘制了 100 个最长的线段(省略了较粗的线):drawcoastlines

import numpy as np
result = m.readshapefile('shapefiles/nic_autoc2018046n_pl_a', 'IceEdge', zorder = 10, color = 'blue')#, drawbounds = False)

col = result[-1]
segments = col.get_segments()
seglens =  [len(seg) for seg in col.get_segments()]

segments = np.array(segments)
seglens  = np.array(seglens)

idx = np.argsort(seglens)
seglens  = seglens[idx]
segments = segments[idx]

col.remove()

new_col = LineCollection(segments[-100:],linewidths = 2, linestyles='dotted', colors='b')
ax.add_collection(new_col)

plt.show()

结果如下所示:

第二个代码补丁的结果

于 2018-02-23T20:38:01.713 回答