Spatial join list lat, lon e multipolygon Python

Sep 02 2020

Ho un dataframe con colonne lat, lon in WGS84.

Ho anche uno strato multipoligono (GeoJSON, posso anche convertirlo in un SHP) con i confini di tutti i paesi, dove il nome del paese è nella tabella degli attributi.

Vorrei aggiungere al dataframe una colonna dove per ogni lat, lon avrò il nome del paese.

Quale sarebbe il modo efficiente per farlo (supponendo di avere 2000 coppie lat-lon)?

AGGIORNARE:

Grazie a @BERA ho creato questa funzione:

import geopandas as gpd
from shapely.geometry import Point

df_countries = gpd.read_file(r"C:\countries.geojson")


def get_countries(df, lat_col, lon_col,df_countries):
    df_latlon = df[[lat_col,lon_col]].copy()
    df_latlon['Coordinates'] = list(zip(df_latlon[lon_col], df_latlon[lat_col]))
    df_latlon['Coordinates'] = df_latlon['Coordinates'].apply(Point)
    df_latlon = gpd.GeoDataFrame(df_latlon, geometry='Coordinates')
    df_latlon = df_latlon.set_crs(epsg=4326)
    df_latlon = gpd.sjoin(df_latlon, df_countries[['CNTRY_NAME','geometry']], how='left')
    return df_latlon

Risposte

2 BERA Sep 02 2020 at 13:08

Join spaziale:

import geopandas as gpd

dfpoints = gpd.read_file(r"C:\folder\bs_riks.shp")
dfpolys = gpd.read_file(r"C:\folder\ak_riks.shp")

df = gpd.sjoin(dfpoints, dfpolys, how='left')
#or: df = gpd.sjoin(dfpoints, dfpolys[['CNTRY_NAME','geometry']], how='left') #If you dont want all attributes from the polygons

Se hai un panda df delle coordinate, crea geopande in questo modo: Creazione di un GeoDataFrame da un DataFrame con coordinate