2

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

接下来是将netCDF文件读入GeoDataFrame. 方法似乎很清楚:读取netCDFwith xarray,将其存储到 apandas.DataFrame中,对提取的 lat/lon 数据执行shapely.geometry.Point操作并将其转换为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上没有访问权限。我也很难理解部分为空的列。所以我认为必须对和的每个组合执行。那正确吗?任何想法如何编码?latlonlatshapely.geometry.Point((lon, lat))dnclonlat

4

2 回答 2

3

就像评论中提到的@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()

然后我们将创建我们的几何体。即带有列表组合的匀称点

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)
于 2017-09-21T00:05:53.360 回答
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?

于 2017-10-30T21:24:16.907 回答