5
\ begingroup美元

目前我处理一堆坐标(epsg: 4326 = >纬度/经度)及其对应的值(温度)。我们的目标是将这些坐标和它们的值写入一个简单的netcdf文件和显示在如QGIS(这样你将有一个为每个像素颜色的正方形/协调)

目前在分散数据格式,这就是为什么第一次插值。

插值后我试图写入数据(光栅格式)到一个netcdf文件,但这失败:

进口numpy从scipy.interpolate np进口griddata进口xarray xr进口熊猫一样pd进口rioxarray进口netCDF4 nc4 lat =(50.1, 50.2, 50.3, 50.4, 50.5, 62]朗= (8.1,8.2,8.3,8.4,8.5,12]temp =[1、2、3、4、5、6] #准备一个网格插值ξ= np.arange(6.0, 14.0, 0.001)易= np.arange(48.0, 64.0, 0.001),易= np。meshgrid (xi, yi) #你可以看到稍大,那么使用网格坐标#插入子= griddata((经度、纬度)、温度(xi, yi)方法=“线性”)#时间写这到netcdf文件ds = nc4.Dataset(“测试。数控”、“w”,格式= ' NETCDF3_CLASSIC”) dim_time = ds。createDimension('时间',0)dim_lat = ds。createDimension (lat, len (yi)) dim_lon = ds。createDimension(经度,len (xi)) #这是正确的还是我该如何设置CRS epsg: 4326 ?crs = ds。createVariable crs (“WGS84”、“c”)。spatial_ref = " "“GEOGCS (“WGS 84”,基准面(“WGS_1984球体(“WGS 84”, 6378137, 298.257223563,权威[“EPSG”、“7030”]],权威[“EPSG”、“6326”]], PRIMEM[“格林威治”,0,权威[“EPSG”、“8901”]],单位(“学位”,0.01745329251994328,权威[“EPSG”、“9122”]],权威[“EPSG”、“4326”]]””“时间= ds。createVariable(“时间”、“f4”,“时间”)纬度= ds。createVariable(“纬度”、“f4”、“纬度”)纬度。单位=‘度’经度= ds。createVariable(“朗”、“f4”、“朗”)经度。单位=‘度’价值= ds。createVariable(“温度”、“f4”,(“时间”、“纬度”、“朗”,))#充满价值观纬度[:]= lat # = >错误:ValueError:形状不匹配:对象不能播放一个形状经度[:]=经度值(0::)=子值。grid_mapping = ' WGS84 ' ds.close ()

当我试着写例如纬度变量又:

ValueError:形状不匹配:对象不能播放一个形状

我调试代码,但没能找到错误,专家吗?

干杯!

UPDATE # 1:

我调整你的源代码与坐标epsg: 3857格式(它是正确地绘制在QGIS matplotlib但无形的):

进口numpy从scipy.interpolate np进口griddata进口xarray xr进口熊猫一样pd进口rioxarray进口netCDF4 nc4 matplotlib进口。pyplot plt从美观。几何进口点导入geopandas ....加仑日# - - -输入数据lat =(50.1, 50.2, 50.3, 50.4, 50.5, 62]朗= (8.1,8.2,8.3,8.4,8.5,12]temp =[1、2、3、4、5、6] #放入熊猫Dataframe df = pd。DataFrame({“纬度”:纬度,经度:经度,“临时”:临时})#准备几何pointShp =[一点(x, y) x, y在zip (df。经度,df.latitude)] pointGpd =加仑日。GeoDataFrame (df、几何= pointShp crs = EPSG: 4326) # Reproject point3857 = pointGpd.to_crs (EPSG: 3857) point3857 [x] = point3857。应用(λx: x.geometry.centroid。x轴= 1)point3857 [y] = point3857。应用(λx: x.geometry.centroid。y轴= 1)df = point3857 [[‘x’,‘y’,‘临时’]]朗=列表(df (' x ']) lat =列表(df [y]) temp =列表(df(临时的))#进行源代码# - - -项目输入数据在规则的网格ξ= np.arange (min(朗),max(朗),1000)易= np.arange (min (lat)、马克斯(lat), 1000),易= np。meshgrid (xi, yi)子= np.zeros_like (xi, dtype = np.float32) * -999 #子= griddata((经度、纬度)、温度(xi, yi)方法=“线性”)我的范围(len(临时):idx = np。argmin (np。√(xi-lon[我])* * 2 + (yi-lat[我])* * 2)子(np)。unravel_index (idx xi.shape)] = temp[我]# 0换成nan值(我有看不见的像素代替黑色背景)np。(子,子= = 0,None) #——检查……= >看起来不错plt.figure (figsize =(15日7))plt.subplot plt (1、2、1)。散射(经度、纬度、临时、临时)plt.subplot plt (1、2、2)。pcolor(xi, yi, np.where(np.isnan(zi),0,zi)) plt.show() # --- Open NetCDF file to write on with nc4.Dataset('test.nc', 'w' , format='NETCDF3_CLASSIC') as ds: # --- Initialize the dimensions of the dataset dim_time = ds.createDimension('time', 0) dim_lat = ds.createDimension('lat', yi.shape[0]) dim_lon = ds.createDimension('lon', xi.shape[1]) # --- Create the corresponding variables for the dimensions time = ds.createVariable('time', np.float32, 'time') latitude = ds.createVariable('lat', np.float32, 'lat') latitude.units = ['degrees north'] latitude.axis = ['Y'] latitude.standard_name = ['latitude'] longitude = ds.createVariable('lon', np.float32, 'lon') longitude.units = ['degrees east'] longitude.axis = ['X'] longitude.standard_name = ['longitude'] # --- Fill with 1D (!) arrays of xi/yi, as the meshgrid returns 2D arrays... time[:] = 0 latitude[:] = yi[:,0] longitude[:] = xi[0,:] # --- Create a coordinate reference system crs = ds.createVariable('WGS84', 'c') crs.spatial_ref = """GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]""" # --- Ready the Temperature data field value = ds.createVariable('temperature', np.float32, ('time','lat','lon')) value.grid_mapping = 'WGS84' # the crs variable name value.grid_mapping_name = 'latitude_longitude' # --- Fill with values value[0,:,:] = zi

我需要做任何修改在netcdf netcdf变量?(如单位或轴?)

我能保持crs。spatial_ref /值。grid_mapping /值。grid_mapping_name吗?

干杯!

\ endgroup美元
2
  • 1
    \ begingroup美元 我已经修改我的回答占坐标参考系统的变化。可能停止改变你的问题很好多次,并简单地问一个新的问题。例如,如何创建一个示例的netCDF文件,其中包含数据“完全不规则数组”。这应该能够容纳您的数据而无需经历griddata等步骤,只有提供的数据,仅此而已。 \ endgroup美元
    - - - - - -埃里克
    2021年10月28日15:43
  • \ begingroup美元 嘿@Erik有名称或文学这个算法吗?缓冲/距离分析,euklid距离,euklid分配?因为它似乎是一个混合所有这些方法. .吗? \ endgroup美元
    - - - - - -创造性的地穴
    2021年11月23日在0:07

2答案2

7
\ begingroup美元

我改变了你的模型解一点;但这就像英格瓦卢卡斯在他的回答中写道:你重新定义在这个过程中,当你在以后定义netCDF值纬度你试图填补小一维数组和二维数组。这是你的错误的来源。

进口numpy从scipy.interpolate np进口griddata进口xarray xr进口熊猫一样pd进口rioxarray进口netCDF4 nc4 matplotlib进口。pyplot plt从美观。几何进口点进口geopandas从pyproj加仑日进口CRS CRS_3857 = CRS.from_epsg (3857) CRS_wkt = CRS_3857.to_wkt(相当= False)打印(CRS_wkt) # - - -输入数据....lat =(50.1, 50.2, 50.3, 50.4, 50.5, 62]朗= (8.1,8.2,8.3,8.4,8.5,12]temp =[1、2、3、4、5、6] #放入熊猫Dataframe df = pd。DataFrame({“纬度”:纬度,经度:经度,“临时”:临时})#准备几何pointShp =[一点(x, y) x, y在zip (df。经度,df.latitude)] pointGpd =加仑日。GeoDataFrame (df、几何= pointShp crs = EPSG: 4326) # Reproject point3857 = pointGpd.to_crs (EPSG: 3857) point3857 [x] = point3857。应用(λx: x.geometry.centroid。x轴= 1)point3857 [y] = point3857。应用(λx: x.geometry.centroid。y轴= 1)df = point3857 [[‘x’,‘y’,‘临时’]]朗=列表(df (' x ']) lat =列表(df [y]) temp =列表(df(临时的))#进行源代码# - - -项目输入数据在规则的网格ξ= np.linspace (min(朗),max(朗),500)易= np.linspace (min (lat)、马克斯(lat), 500),易= np。meshgrid (xi, yi)子= np.ones_like (xi, dtype = np.float32) * np。南#子= griddata((经度、纬度)、温度(xi, yi)方法=“线性”)我的范围(len(临时):idx = np。argmin (np。√(xi-lon[我])* * 2 + (yi-lat[我])* * 2)子(np)。unravel_index (idx xi.shape)] = temp[我]#——检查……= >看起来不错plt.figure (figsize =(15日7))plt.subplot plt (1、2、1)。散射(经度、纬度、临时、临时)plt.subplot plt (1、2、2)。pcolor(xi, yi, np.where(np.isnan(zi),0,zi)) plt.show() # --- Open NetCDF file to write on with nc4.Dataset('test.nc', 'w' , format='NETCDF3_CLASSIC') as ds: # --- Initialize the dimensions of the dataset dim_time = ds.createDimension('time', 0) dim_lat = ds.createDimension('lat', yi.shape[0]) dim_lon = ds.createDimension('lon', xi.shape[1]) # --- Create the corresponding variables for the dimensions time = ds.createVariable('time', np.float32, 'time') latitude = ds.createVariable('lat', np.float32, 'lat') latitude.units = ['degrees north'] latitude.axis = ['Y'] latitude.standard_name = ['latitude'] longitude = ds.createVariable('lon', np.float32, 'lon') longitude.units = ['degrees east'] longitude.axis = ['X'] longitude.standard_name = ['longitude'] # --- Fill with 1D (!) arrays of xi/yi, as the meshgrid returns 2D arrays... time[:] = 0 latitude[:] = yi[:,0] longitude[:] = xi[0,:] # --- Create a coordinate reference system crs = ds.createVariable('CRS', 'c') crs.spatial_ref = CRS_wkt # --- Ready the Temperature data field value = ds.createVariable('temperature', np.float32, ('time','lat','lon')) value.grid_mapping = 'CRS' # the crs variable name value.grid_mapping_name = 'latitude_longitude' # --- Fill with values value[0,:,:] = zi

时,产生一个地标图片加载到QGIS(我减少了你的步长值,使pcolor步骤多一点性能;但是你可以改变它回到您的代码)。

在这里输入图像描述

在这里输入图像描述

\ endgroup美元
7
  • 1
    \ begingroup美元 谢谢你的回答埃里克!我说英´s回答,你能参考吗?它可能只是一个转换问题. . \ endgroup美元
    - - - - - -创造性的地穴
    2021年10月28日在十12
  • 2
    \ begingroup美元 当您使用scipy.interpolate.griddata,你会得到一个线性插值的数据网格上;这就是问题所在……不是netCDF一侧。我不知道是否netCDF和QGIS支持非结构化(即。非正式纬度/经度)网格数据。但是听起来可能是你真正想要的东西。或者你可以,例如,仅仅用column1 . csv文件=经度,colum2 = lat column3 =价值,和它作为一个点集加载到QGIS吗?这不会是一个更好的解决方案吗? \ endgroup美元
    - - - - - -埃里克
    2021年10月28日11:01
  • 2
    \ begingroup美元 在光栅的约束文件,然后我建议设置子(:,)= 0遍历数据坐标和填补只有对那些,最小的在相应的坐标纬度坐标。假设矩形网格保存毕达哥拉斯的距离,idx = np.argmin (np。√(xi-lon[我])* * 2 + (yi-lat[我])* * 2))应该给你的位置设置在哪里子[idx] = temp[我],你应该循环 \ endgroup美元
    - - - - - -埃里克
    2021年10月28日11:16
  • 1
    \ begingroup美元 我修改了回答我上面所描述的。 \ endgroup美元
    - - - - - -埃里克
    2021年10月28日,霎时一切都
  • 1
    \ begingroup美元 嗨@Erik非常感谢你,我开始了解如何在这种环境下工作。我调整你的源代码和一个小编辑:我将纬度/经度坐标变成epsg: 3857格式。matplotlib输出看起来不错,但是当我把文件放在QGIS没有结果。你能检查我的更新源代码吗? \ endgroup美元
    - - - - - -创造性的地穴
    2021年10月28日12:23
6
\ begingroup美元

你有一个形状不匹配,你覆盖使用np.meshgrid,然后分配错了尺寸dim_latdim_lon最后试图填补纬度经度你的长度为6的初始值。

试着修改网格准备和插值

#准备一个网格插值ξ= np.arange(6.0, 14.0, 0.001)易= np.arange (48.0, 64.0, 0.001) xi_mesh yi_mesh = np。meshgrid (xi, yi) #插入子= griddata((经度、纬度)、温度(xi_mesh yi_mesh)方法=“线性”)

. .和写作的值

#充满纬度[:]=易经度值[:]=ξ值(0::)=子值。grid_mapping = ' WGS84 '
\ endgroup美元
4
  • \ begingroup美元 嘿,英,谢谢你的回答,我编辑源代码,没有更多的错误。当我将netcdf文件拖拽到QGIS不过是画一个多边形…但我只是想显示6个彩色方格坐标如[50.1,8.1,白(1)]、[50.2,8.2,浅灰色(2)),…黑色(6),52岁,12日),有什么方法可以实现这一目标? \ endgroup美元
    - - - - - -创造性的地穴
    2021年10月28日10:08
  • 2
    \ begingroup美元 @Creativecrypter你的评论是另一个问题,应该公布,但也许GIS栈交流可能更合适。江南电子竞技平台 \ endgroup美元
    - - - - - -让-玛丽•Prival
    2021年10月28日,在火灾
  • 2
    \ begingroup美元 @Creativecrypter gis堆栈交换链接江南电子竞技平台gis.stackexchange.com \ endgroup美元
    - - - - - -山姆院长
    2021年10月28日15:53
  • \ begingroup美元 好的我将工作代码库,如果失败我将去那里 \ endgroup美元
    - - - - - -创造性的地穴
    2021年10月28日18:03

你的答案

通过点击“发布你的答案”,你同意我们服务条款并承认您已阅读并理解我们的隐私政策的行为准则

不是你要找的答案?浏览其他问题标记问你自己的问题