将netCDF数据存储在GeoDataFrame中

时间:2017-09-20 22:07:55

标签: python python-xarray geopandas netcdf4 shapely.geometry

我需要在netCDF文件中使用来自其他源的几何执行一些几何操作。因此,我将来自其他来源的几何(sai.js)存储在shapely.geometry.Polygon

接下来是将geopandas.GeoDataFrame文件读入netCDF。配方似乎很清楚:使用GeoDataFrame阅读netCDF,将其存储到xarray,对提取的lat / lon数据执行pandas.DataFrame操作并将其转换为{ {1}}。

之后,我将使用几何运算符进行一些统计。

当我使用shapely.geometry.Pointsee here

阅读GeoDataFrame文件时
netCDF

我得到了

xarray

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

>>>> dnc <xarray.Dataset> Dimensions: (lat: 16801, lon: 19201) Coordinates: * lat (lat) float32 -32.0 -31.9992 -31.9983 -31.9975 -31.9967 ... * lon (lon) float32 -73.0 -72.9992 -72.9983 -72.9975 -72.9967 ... Data variables: hgt (lat, lon) int16 0 0 0 4 0 5 0 9 9 8 0 0 0 0 0 0 0 0 0 0 0 0 0 ... >>> dnc.hgt.size 322596001 >>> dnc.lat.size 16801 >>> dnc.lon.size 19201 >>> df.head() hgt lat lon -32.0 -73.000000 0 -72.999168 0 -72.998337 0 -72.997498 4 -72.996666 0 df无法访问lat。我也有问题要理解部分空列lon。因此,对于latshapely.geometry.Point((lon, lat))的每个组合,我认为必须在dnc上执行lon。是对的吗?有任何想法如何编码吗?

2 个答案:

答案 0 :(得分:0)

与评论中提到的@jhamman一样,你的lats和lons是你的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()

然后我们将创建几何体。即具有列表comp的形状点

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

现在我们将Pandas DataFrame转换为GeoPandas GeoDataFrame

gdf = gpd.GeoDataFrame(df, geometry=geom)
print(gdf.head())
    lat        lon  hgt                                          geometry
0 -32.0 -73.000000                      0                 POINT (-73 -32)
1 -32.0 -72.999168                      0  POINT (-72.99916800000001 -32)
2 -32.0 -72.998337                      0  POINT (-72.99833700000001 -32)
3 -32.0 -72.997498                      4  POINT (-72.99749799999999 -32)
4 -32.0 -72.996666                      0          POINT (-72.996666 -32)

答案 1 :(得分:0)

我花了更长的时间为我的交换内存(8 GB)尝试了一些解决方案。最后我尝试了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)

如上所述,文件很大:

>>> dnc.hgt.size
322596001
>>> dnc.lat.size
16801
>>> dnc.lon.size
19201

是否有另一种方法可以直接从geometry.Point创建netCDF-File