---
title: Work with geo-temporal data
description: Use the Flux Geo package to filter geo-temporal data and group by geographic location or track.
url: https://docs.influxdata.com/influxdb/v1/flux/guides/geo/
estimated_tokens: 2587
product: InfluxDB OSS v1
version: v1
---

# Work with geo-temporal data

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

Use the [Flux Geo package](/flux/v0/stdlib/experimental/geo) to filter geo-temporal data and group by geographic location or track.

The Geo package is experimental and subject to change at any time. By using it, you agree to the [risks of experimental functions](/flux/v0/stdlib/experimental/#experimental-functions-are-subject-to-change).

**To work with geo-temporal data:**

1. Import the `experimental/geo` package.
    
    ```js
    import "experimental/geo"
    ```
    
2. Load geo-temporal data. *See below for [sample geo-temporal data](#sample-data).*
    
3. Do one or more of the following:
    
    -   [Shape data to work with the Geo package](#shape-data-to-work-with-the-geo-package)
    -   [Filter data by region](#filter-geo-temporal-data-by-region) (using strict or non-strict filters)
    -   [Group data by area or by track](#group-geo-temporal-data)

### [Shape data to work with the Geo package](/influxdb/v1/flux/guides/geo/shape-geo-data/)

Functions in the Flux Geo package require **lat** and **lon** fields and an **s2\_cell\_id** tag. Rename latitude and longitude fields and generate S2 cell ID tokens.

```js
import "experimental/geo"

sampleGeoData
  |> geo.shapeData(latField: "latitude", lonField: "longitude", level: 10)
```

### [Filter geo-temporal data by region](/influxdb/v1/flux/guides/geo/filter-by-region/)

Use the `geo.filterRows` function to filter geo-temporal data by box-shaped, circular, or polygonal geographic regions.

```js
import "experimental/geo"

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

### [Group geo-temporal data](/influxdb/v1/flux/guides/geo/group-geo-data/)

Use the `geo.groupByArea()` to group geo-temporal data by area and `geo.asTracks()` to group data into tracks or routes.

```js
import "experimental/geo"

sampleGeoData
  |> geo.groupByArea(newColumn: "geoArea", level: 5)
  |> geo.asTracks(groupBy: ["id"],orderBy: ["_time"])
```

## Sample data

Many of the examples in this section use a `sampleGeoData` variable that represents a sample set of geo-temporal data. The [Bird Migration Sample Data](https://github.com/influxdata/influxdb2-sample-data/tree/master/bird-migration-data) available on GitHub provides sample geo-temporal data that meets the [requirements of the Flux Geo package](/flux/v0/stdlib/experimental/geo/#geo-schema-requirements).

### Load annotated CSV sample data

Use the [experimental `csv.from()` function](/flux/v0/stdlib/experimental/csv/from/) to load the sample bird migration annotated CSV data from GitHub:

```js
import `experimental/csv`

sampleGeoData = csv.from(
  url: "https://github.com/influxdata/influxdb2-sample-data/blob/master/bird-migration-data/bird-migration.csv"
)
```

`csv.from(url: ...)` downloads sample data each time you execute the query **(~1.3 MB)**. If bandwidth is a concern, use [`to()`](/flux/v0/stdlib/influxdata/influxdb/to/) to write the data to a bucket, and then query the bucket with [`from()`](/flux/v0/stdlib/influxdata/influxdb/from/).

### Write sample data to InfluxDB with line protocol

Use `curl` and the `influx write` command to write bird migration line protocol to InfluxDB. Replace `db/rp` with your destination bucket:

```sh
curl https://raw.githubusercontent.com/influxdata/influxdb2-sample-data/master/bird-migration-data/bird-migration.line --output ./tmp-data
influx write -b db/rp @./tmp-data
rm -f ./tmp-data
```

Use Flux to query the bird migration data and assign it to the `sampleGeoData` variable:

```js
sampleGeoData = from(bucket: "db/rp")
  |> range(start: 2019-01-01T00:00:00Z, stop: 2019-12-31T23:59:59Z)
  |> filter(fn: (r) => r._measurement == "migration")
```
