---
title: Filter geo-temporal data by region
description: Use the geo.filterRows function to filter geo-temporal data by box-shaped, circular, or polygonal geographic regions.
url: https://docs.influxdata.com/influxdb/v2/query-data/flux/geo/filter-by-region/
estimated_tokens: 3446
product: InfluxDB OSS v2
version: v2
---

# Filter geo-temporal data by region

This page documents an earlier version of InfluxDB OSS. [InfluxDB 3 Core](/influxdb3/core/) is the latest stable version.

#### API token hashing is enabled by default in InfluxDB OSS 2.9.0

Stronger token security: tokens are stored as hashes on disk, so a copy of the database file doesn’t expose usable tokens. Existing tokens are hashed on first startup and the original strings can’t be recovered afterward — **capture any plaintext tokens you still need before you upgrade**.

For more information, see [Token hashing](/influxdb/v2/admin/tokens/#token-hashing).

Use the [`geo.filterRows` function](/flux/v0/stdlib/experimental/geo/filterrows/) to filter geo-temporal data by geographic region:

1. [Define a geographic region](#define-a-geographic-region)
2. [Use strict or non-strict filtering](#strict-and-non-strict-filtering)

The following example uses the [sample bird migration data](/influxdb/v2/query-data/flux/geo/#sample-data) and queries data points **within 200km of Cairo, Egypt**:

```js
import "experimental/geo"

sampleGeoData
    |> geo.filterRows(region: {lat: 30.04, lon: 31.23, radius: 200.0}, strict: true)
```

## Define a geographic region

Many functions in the Geo package filter data based on geographic region. Define a geographic region using one of the the following shapes:

-   [box](#box)
-   [circle](#circle)
-   [polygon](#polygon)

### box

Define a box-shaped region by specifying a record containing the following properties:

-   **minLat:** minimum latitude in decimal degrees (WGS 84) *(Float)*
-   **maxLat:** maximum latitude in decimal degrees (WGS 84) *(Float)*
-   **minLon:** minimum longitude in decimal degrees (WGS 84) *(Float)*
-   **maxLon:** maximum longitude in decimal degrees (WGS 84) *(Float)*

##### Example box-shaped region

```js
{
    minLat: 40.51757813,
    maxLat: 40.86914063,
    minLon: -73.65234375,
    maxLon: -72.94921875,
}
```

### circle

Define a circular region by specifying a record containing the following properties:

-   **lat**: latitude of the circle center in decimal degrees (WGS 84) *(Float)*
-   **lon**: longitude of the circle center in decimal degrees (WGS 84) *(Float)*
-   **radius**: radius of the circle in kilometers (km) *(Float)*

##### Example circular region

```js
{
    lat: 40.69335938,
    lon: -73.30078125,
    radius: 20.0,
}
```

### polygon

Define a polygonal region with a record containing the latitude and longitude for each point in the polygon:

-   **points**: points that define the custom polygon *(Array of records)*
    
    Define each point with a record containing the following properties:
    
    ```
    - **lat**: latitude in decimal degrees (WGS 84) _(Float)_
    - **lon**: longitude in decimal degrees (WGS 84) _(Float)_
    
    ```
    

##### Example polygonal region

```js
{
    points: [
        {lat: 40.671659, lon: -73.936631},
        {lat: 40.706543, lon: -73.749177},
        {lat: 40.791333, lon: -73.880327},
    ]
}
```

## Strict and non-strict filtering

In most cases, the specified geographic region does not perfectly align with S2 grid cells.

-   **Non-strict filtering** returns points that may be outside of the specified region but inside S2 grid cells partially covered by the region.
-   **Strict filtering** returns only points inside the specified region.

*Strict filtering is less performant, but more accurate than non-strict filtering.*

S2 grid cell  
Filter region  
Returned point

**Strict filtering**

**Non-strict filtering**

#### Related

-   [geo package](/flux/v0/stdlib/experimental/geo/)
-   [geo.filterRows() function](/flux/v0/stdlib/experimental/geo/filterrows/)
