Verde是Python用于地理空间数据处理的一个库,由于采用了一些机器学习的方法,所以除了科学计算三件套之外,还需要基于sklearn模块。考虑到依赖关系,这里比较推荐用conda安装。
conda install verde --channel conda-forge
通过函数grid_coordinates可以创建一个网格坐标,其功能与numpy中的meshgrid相似,示例如下
import matplotlib.pyplot as plt
import verde as vd
# 分别是西、东、南、北
W, E, S, N = 0, 1000, 0, 1000
ew, ns = vd.grid_coordinates((W, E, S, N), spacing=100)
padded = vd.pad_region((W, E, S, N), pad=50)
print(ew.shape, ns.shape)
# (11, 11) (11, 11)
print(padded)
# (-50, 1050, -50, 1050)
其中,grid_coordinates用于生成网格,(W, E, S, N)表示网格范围,是一个矩形,spacing为网格间距,当输入为一个整型时,表示网格形状为正方形。其输出ew和ns分别代表东西、南北方向的网点坐标。
pad_region会在(W, E, S, N)外侧伸展pad尺寸。
下面绘制这个网格,此图来自于官网,但和官网相比,对代码进行了一点精简。
def drawGrid(W,S,E,N,ew,ns,padded,ax,**kwargs):
ax.vlines(ew[0], ymin=S, ymax=N, linestyles="dotted")
ax.hlines(ns[:, 1], xmin=E, xmax=W, linestyles="dotted")
ax.scatter(ew, ns, **kwargs)
plt.xlim(padded[:2])
plt.ylim(padded[2:])
fig = plt.figure()
ax = fig.add_subplot()
ax.add_patch(
plt.Rectangle((W, S), E, N, fill=None, label="Region Bounds"))
drawGrid(W,S,E,N,ew,ns,padded,ax,
label="Square Region Grid Nodes",
marker=".", color="black", s=100)
plt.xlabel("east-west")
plt.ylabel("sourth-north")
plt.legend(loc="upper center", bbox_to_anchor=(0.5, 1.15))
plt.show()
grid_coordinates函数中有个参数adjust,用于参数调整,提供region和spacing两种选项,下面为其示例。
region_ew, region_ns = vd.grid_coordinates(
(W, E, S, N), spacing=300, adjust="region")
spacing_ew, spacing_ns = vd.grid_coordinates(
(W, E, S, N), spacing=300, adjust="spacing")
plt.figure(figsize=(6, 6))
ax = plt.subplot(111)
ax.add_patch(
plt.Rectangle((W, S), E, N, fill=None, label="Region Bounds"))
drawGrid(W,S,E,N,region_ew,region_ns,padded,ax,
label="Adjusted Region Grid Nodes",
marker=">", color="blue", alpha=0.75, s=100)
drawGrid(W,S,E,N,spacing_ew,spacing_ns,padded,ax,
label="Adjusted Spacing Grid Nodes",
marker=">", color="orange", alpha=0.75, s=100)
plt.xlabel("Easting")
plt.ylabel("Northing")
plt.legend(loc="upper center", bbox_to_anchor=(0.5, 1.18))
plt.show()
效果如下
其中,spacnig_ew为
[ 0. 333.33333333 666.66666667 1000 0. 333.33333333 666.66666667 1000 0. 333.33333333 666.66666667 1000 0. 333.33333333 666.66666667 1000 ] \begin{bmatrix} 0. & 333.33333333& 666.66666667&1000\\ 0. & 333.33333333& 666.66666667&1000\\ 0. & 333.33333333& 666.66666667&1000\\ 0. & 333.33333333& 666.66666667&1000 \end{bmatrix} ?0.0.0.0.?333.33333333333.33333333333.33333333333.33333333?666.66666667666.66666667666.66666667666.66666667?1000100010001000? ?