- 积分
- 5607
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2018-11-4
- 最后登录
- 1970-1-1
|
发表于 2022-11-18 09:14:39
|
显示全部楼层
回帖奖励 +8 金钱
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import xarray as xrimport shapely.geometry as sgeom
import shapefile
import math
from shapely.prepared import prep
shp_file = r'F:\data\XXXXXXXXX.shp' ####掩膜的shp文件
path_file = r'F:\XXXXXXXXX.nc' ####需要读取的数据
#########----用shp创建掩膜文件----#####
def polygon_to_mask(polygon, x, y):
'''生成落入多边形的点的掩膜数组.'''
x = np.atleast_1d(x)
y = np.atleast_1d(y)
if x.shape != y.shape:
raise ValueError('x和y的形状不匹配')
prepared = prep(polygon)
def recursion(x, y):
'''递归判断坐标为x和y的点集是否落入多边形中.'''
xmin, xmax = x.min(), x.max()
ymin, ymax = y.min(), y.max()
xflag = math.isclose(xmin, xmax)
yflag = math.isclose(ymin, ymax)
mask = np.zeros(x.shape, dtype=bool)
# 散点重合为单点的情况.
if xflag and yflag:
point = sgeom.Point(xmin, ymin)
if prepared.contains(point):
mask[:] = True
else:
mask[:] = False
return mask
xmid = (xmin + xmax) / 2
ymid = (ymin + ymax) / 2
# 散点落在水平和垂直直线上的情况.
if xflag or yflag:
line = sgeom.LineString([(xmin, ymin), (xmax, ymax)])
if prepared.contains(line):
mask[:] = True
elif prepared.intersects(line):
if xflag:
m1 = (y >= ymin) & (y <= ymid)
m2 = (y >= ymid) & (y <= ymax)
if yflag:
m1 = (x >= xmin) & (x <= xmid)
m2 = (x >= xmid) & (x <= xmax)
if m1.any(): mask[m1] = recursion(x[m1], y[m1])
if m2.any(): mask[m2] = recursion(x[m2], y[m2])
else:
mask[:] = False
return mask
# 散点可以张成矩形的情况.
box = sgeom.box(xmin, ymin, xmax, ymax)
if prepared.contains(box):
mask[:] = True
elif prepared.intersects(box):
m1 = (x >= xmid) & (x <= xmax) & (y >= ymid) & (y <= ymax)
m2 = (x >= xmin) & (x <= xmid) & (y >= ymid) & (y <= ymax)
m3 = (x >= xmin) & (x <= xmid) & (y >= ymin) & (y <= ymid)
m4 = (x >= xmid) & (x <= xmax) & (y >= ymin) & (y <= ymid)
if m1.any(): mask[m1] = recursion(x[m1], y[m1])
if m2.any(): mask[m2] = recursion(x[m2], y[m2])
if m3.any(): mask[m3] = recursion(x[m3], y[m3])
if m4.any(): mask[m4] = recursion(x[m4], y[m4])
else:
mask[:] = False
return mask
return recursion(x, y)
##########-----读取shp----######
with shapefile.Reader(shp_file) as reader:
china = sgeom.shape(reader.shape(0))
#########
data = xr.open_dataset(path_file) ###读取数据
pre_mean = data.pre ####读取降水数据
lon = pre_mean.lon ####读取经纬度
lat = pre_mean.lat #####读取经纬度
X,Y = np.meshgrid(lon,lat)
mask_check = polygon_to_mask(qinghai, X, Y) ####返回mask
masked_check = np.ma.masked_equal(mask_check, False) ####
mask_mean = pre_mean*masked_check ####掩膜
mean_pre = np.nanmean(mask_mean) ####求区域平均值
原贴地址: https://mp.weixin.qq.com/s/srmwRdlRCcqNXRI8j7f5ZA
|
|