How to extract coordinates falling in a bbox from a geopandas data frame?

Question:

I have a geopandas dataframe with coordinates and long with data frame I have a bbox. Now I want to apply the bbox on the data frame and extract the coordinates that’s falling in that bbox. I tried using gpd.clip to extract but it is returning an empty data frame. What is the best way to extract the coordinates that are falling inside a bbox?

from shapely.geometry import box
import geopandas as gpd
from shapely.geometry import Point

print(df)
    
         lat           lon         geometry
    0   30.302228   -87.475474  POINT (-87.4754735 30.3022278)
    1   30.302249   -87.475305  POINT (-87.4753053 30.3022495)
    2   30.302268   -87.475203  POINT (-87.4752034 30.3022676)
    3   30.302284   -87.475118  POINT (-87.4751181 30.3022838)
    4   30.299260   -87.473474  POINT (-87.473474 30.2992603)
    5   30.299501   -87.473526  POINT (-87.473526 30.299501)
    6   30.299285   -87.481937  POINT (-87.4819365 30.299285)
    7   31.176753   -86.579765  POINT (-86.5797648 31.1767528)
    8   31.176670   -86.579352  POINT (-86.5793519 31.1766701)
    9   31.176644   -86.579243  POINT (-86.5792434 31.1766441)
    10  31.176596   -86.579159  POINT (-86.5791589 31.1765959)
    11  31.176503   -86.579115  POINT (-86.5791153 31.1765032)
    12  31.173518   -86.578724  POINT (-86.578724 31.173518)
    13  31.170868   -86.578374  POINT (-86.578374 31.170868)
    14  31.170122   -86.578270  POINT (-86.57827 31.170122)
    15  31.161356   -86.577077  POINT (-86.577077 31.161356)
    16  31.160598   -86.576931  POINT (-86.576931 31.160598)
    17  31.160147   -86.576831  POINT (-86.576831 31.160147)
    18  31.109081   -85.516056  POINT (-85.516056 31.109081)
    19  31.109327   -85.515871  POINT (-85.515871 31.109327)
    20  31.161638   -85.736218  POINT (-85.736218 31.161638)
    21  31.169062   -85.741498  POINT (-85.7414983 31.1690619)
    22  31.109349   -85.056092  POINT (-85.0560924 31.1093492)
    23  27.713963   -82.679369  POINT (-82.6793689 27.7139633)
    24  27.714265   -82.679379  POINT (-82.6793793 27.7142646)
    25  30.299501   -81.619310  POINT (-81.61931 30.299501)

bbox = box(*[30.902576115004003,-85.72642861167968,31.072530650777363,-85.57774194396336])
geometry = [Point(xy) for xy in zip(nodes.lon, nodes.lat)]
gdf = gpd.GeoDataFrame(nodes, crs="EPSG:4326", geometry=geometry)
df_clipped = gpd.clip(gdf, mask=bbox)
print(df_clipped)
lon lat geometry

    
Asked By: data en

||

Answers:

I would recommend to try with .cx() method as described here https://gis.stackexchange.com/questions/266730/filter-by-bounding-box-in-geopandas

Alternatively, there is always a crazy option to make a spatial join of you bbox and the points.

Answered By: Luno

gpd.clip will work fine. The issue is that like all shapely objects, the order of arguments for shapely.geometry.box is x then y, in this case, xmin, ymin, xmax, ymax. You’ve used latitude, longitude order, but these should be reversed. So your bounding box should be:

bbox = box(
    -85.72642861167968,
    30.902576115004003,
    -85.57774194396336,
    31.072530650777363,
)

Answered By: Michael Delgado