将netCDF数据存储在GeoDataFram中

2024-10-06 14:27:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要对netCDF文件中来自其他源的几何图形执行一些几何操作。因此,我将来自另一个源的几何体(shapely.geometry.Polygon)存储在geopandas.GeoDataFrame中。在

下一步是将netCDF文件读入GeoDataFrame。方法似乎很清楚:用xarray读取netCDF,将其存储到pandas.DataFrame,对提取的lat/lon数据执行shapely.geometry.Point操作,并将其转换为GeoDataFrame。在

之后,我将用几何运算符做一些统计。在


当我用xarraysee here)读取netCDF文件时

import xarray as xr
dnc = xr.open_dataset(ff)  
df = dnc.to_dataframe()

我明白了

^{pr2}$

以及

>>> df.head()
                  hgt   
lat   lon                  
-32.0 -73.000000    0  
      -72.999168    0  
      -72.998337    0  
      -72.997498    4  
      -72.996666    0

df中,lat和{}上没有访问权限。我也有一些问题来理解部分空列lat。所以我认为对于lon和{}的每个组合,shapely.geometry.Point((lon, lat))必须在{}上执行。对吗?你知道怎么编码吗?在


Tags: 文件方法dfnetcdfpointxarraygeopandaslon
2条回答

就像评论中提到的@jhamman,你的lat和lon是pandas框架中的索引。所以从这个开始

import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
from io import StringIO

s = StringIO('''             
    lat,lon,hgt                  
    -32.0,-73.000000,0  
    -32.0,-72.999168,0  
    -32.0,-72.998337,0  
    -32.0,-72.997498,4  
    -32.0,-72.996666,0
    ''')

    df = pd.read_csv(s)
    df = df.set_index(['lat', 'lon'])

我们将首先重置帧的索引

df = df.reset_index()

然后我们将创建我们的几何体。i、 e.shapely点了一个列表比较

geom = [Point(x,y) for x, y in zip(df['lon'], df['lat'])]

现在我们将熊猫数据帧转换为GeoPandas GeoDataFrame

^{pr2}$

我花了更长的时间来尝试一些交换内存(8GB)的解决方案。最后我尝试了dask,但我的方法仍然不正确:

for f in nc_files:
ff = os.path.join(nc_path, f)
try:
    dnc = xr.open_dataset(ff, chunks={'lat': 400, 'lon': 400})
    df = dnc.to_dataframe()
    df = df.reset_index()
    geom = [Point(x,y) for x, y in zip(df['lon'], df['lat'])]
    gdf = gpd.GeoDataFrame(df, geometry=geom)
    print(gdf.head())
except Exception as e:
    print(e)

如上所述,这些文件很大:

^{pr2}$

有没有其他方法可以直接从netCDF-File创建geometry.Point?在

相关问题 更多 >