我需要在netCDF文件中使用来自其他源的几何执行一些几何操作。因此,我将来自其他来源的几何(sai.js
)存储在shapely.geometry.Polygon
。
接下来是将geopandas.GeoDataFrame
文件读入netCDF
。配方似乎很清楚:使用GeoDataFrame
阅读netCDF
,将其存储到xarray
,对提取的lat / lon数据执行pandas.DataFrame
操作并将其转换为{ {1}}。
之后,我将使用几何运算符进行一些统计。
当我使用shapely.geometry.Point
(see 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
。因此,对于lat
和shapely.geometry.Point((lon, lat))
的每个组合,我认为必须在dnc
上执行lon
。是对的吗?有任何想法如何编码吗?
答案 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
?