Хранить данные netCDF в GeoDataFrame
Мне нужно выполнить некоторые геометрические операции с геометриями из другого источника в netCDF-файле. Поэтому я храню геометрию (shapely.geometry.Polygon
) из другого источника в geopandas.GeoDataFrame
,
Далее стоит прочитать netCDF
файл в GeoDataFrame
, Рецепт кажется ясным: прочитайте netCDF
с xarray
, сохранить его в pandas.DataFrame
выполнить 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
нет доступа на lat
а также lon
, У меня также есть проблемы, чтобы понять частично пустой столбец lat
, Так что я думаю, что shapely.geometry.Point((lon, lat))
должны быть выполнены на dnc
для каждой комбинации lon
а также lat
, Это правильно? Есть идеи, как его кодировать?
2 ответа
Как и @jhamman, упомянутый в комментариях, ваши латы и лоны являются индексами в вашей рамке панд. Итак, начиная с этого
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'])]
и теперь мы преобразуем наш DataFrame Pandas в 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)
Мне потребовалось еще больше времени, чтобы попробовать некоторые решения для замены памяти (8 ГБ). Наконец я попробовал 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
?