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

你的答案

通过点击“发布你的答案”,你同意我们服务条款,隐私政策饼干的政策

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