GeoPandas - данные с разбросом по сетке и перепроектирование

Мне нужно сопоставить разбросанные данные в кадре данных GeoPandas с регулярной сеткой (например, 1 градус) и получить средние значения отдельных ячеек сетки, а затем построить эти данные с различными проекциями.

Первое, чего мне удалось достичь, используя gpd_lite_toolbox.

Этот результат я могу изобразить на простой карте широты и долготы, однако попытка преобразовать его в любую другую проекцию не удалась.

Вот небольшой пример с искусственными данными, показывающими мою проблему:

import gpd_lite_toolbox as glt
import geopandas as gpd
import matplotlib.pyplot as plt
import pandas as pd
from shapely import wkt

# creating the artificial df
df = pd.DataFrame(
{'data': [20, 15, 17.5, 11.25, 16],
 'Coordinates': ['POINT(-58.66 -34.58)', 'POINT(-47.91 -15.78)',
                 'POINT(-70.66 -33.45)', 'POINT(-74.08 4.60)',
                 'POINT(-66.86 10.48)']})

# converting the df to a gdf with projection
df['Coordinates'] = df['Coordinates'].apply(wkt.loads)
crs = {'init': 'epsg:4326'}
gdf = gpd.GeoDataFrame(df, crs=crs, geometry='Coordinates')

# gridding the data using the gridify_data function from the toolbox and setting grids without data to nan
g1 = glt.gridify_data(gdf, 1, 'data', cut=False)
g1 = g1.where(g1['data'] > 1)

# simple plot of the gridded data
fig, ax = plt.subplots(ncols=1, figsize=(20, 10))
g1.plot(ax=ax, column='data', cmap='jet')

# trying to convert to (any) other projection
g2 = g1.to_crs({'init': 'epsg:3395'})

# I get the following error
---------------------------------------------------------------------------

AttributeError: 'float' object has no attribute 'is_empty'

Я также был бы рад использовать другую функцию сетки, если это решит проблему.


person red_tiger    schedule 10.05.2019    source источник
comment
Попробуйте вместо этого: g2 = g1.to_crs("+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs").   -  person swatchai    schedule 10.05.2019
comment
@swatchai благодарит за предложение, но, к сожалению, это не решает проблему, я все равно получаю ту же ошибку.   -  person red_tiger    schedule 10.05.2019


Ответы (1)


Ваше g1 слишком много NaN значения.

g1 = g1.where(g1['data'] > 1)
print(g1)

                                               geometry   data
0                                                   NaN    NaN
1                                                   NaN    NaN
2                                                   NaN    NaN
3                                                   NaN    NaN
4                                                   NaN    NaN
5     POLYGON ((-74.08 5.48, -73.08 5.48, -73.08 4.4...  11.25
...

Вы должны использовать g1[g1['data'] > 1] вместо g1.where(g1['data'] > 1).

g1 = g1[g1['data'] > 1]
print(g1)

                                               geometry   data
5     POLYGON ((-74.08 5.48, -73.08 5.48, -73.08 4.4...  11.25
181   POLYGON ((-71.08 -32.52, -70.08 -32.52, -70.08...  17.50
322   POLYGON ((-67.08 10.48, -66.08 10.48, -66.08 9...  16.00
735   POLYGON ((-59.08 -34.52, -58.08 -34.52, -58.08...  20.00
1222  POLYGON ((-48.08 -15.52, -47.08 -15.52, -47.08...  15.00

g2 = g1.to_crs({'init': 'epsg:3395'})
print(g2)
                                               geometry   data
5     POLYGON ((-8246547.877965705 606885.3761893312...  11.25
181   POLYGON ((-7912589.405585884 -3808795.10464339...  17.50
322   POLYGON ((-7467311.442412791 1165421.424891677...  16.00
735   POLYGON ((-6576755.516066602 -4074627.00861716...  20.00
1222  POLYGON ((-5352241.117340593 -1737775.44359649...  15.00
person giser_yugang    schedule 10.05.2019