Хранить данные 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?

Другие вопросы по тегам