# Geometry

The Go SDK provides typed geometry types for all SurrealDB geometry values including points, lines, polygons, and collections.

The SDK provides typed geometry structs that map to SurrealDB's GeoJSON-based geometry types. Each type handles CBOR encoding with the appropriate tag number.

**Package:** `github.com/surrealdb/surrealdb.go/pkg/models`

**Source:** [pkg/models/geometry.go](https://github.com/surrealdb/surrealdb.go/blob/main/pkg/models/geometry.go)

---

## Types

### `GeometryPoint` {#geometrypoint}

A geographic point with longitude and latitude coordinates.

```go
type GeometryPoint struct {
    Longitude float64
    Latitude  float64
}
```

CBOR tag: 88

#### Methods

- `.GetCoordinates()` - returns `[2]float64{Longitude, Latitude}`

#### Examples

```go
point := models.GeometryPoint{Longitude: -0.118, Latitude: 51.509}
```

### `GeometryLine` {#geometryline}

A line consisting of two or more points.

```go
type GeometryLine []GeometryPoint
```

CBOR tag: 89

### `GeometryPolygon` {#geometrypolygon}

A polygon consisting of one or more closed line rings.

```go
type GeometryPolygon []GeometryLine
```

CBOR tag: 90

### `GeometryMultiPoint` {#geometrymultipoint}

A collection of points.

```go
type GeometryMultiPoint []GeometryPoint
```

CBOR tag: 91

### `GeometryMultiLine` {#geometrymultiline}

A collection of lines.

```go
type GeometryMultiLine []GeometryLine
```

CBOR tag: 92

### `GeometryMultiPolygon` {#geometrymultipolygon}

A collection of polygons.

```go
type GeometryMultiPolygon []GeometryPolygon
```

CBOR tag: 93

### `GeometryCollection` {#geometrycollection}

A heterogeneous collection of geometry objects.

```go
type GeometryCollection []any
```

CBOR tag: 94

---

## Usage

```go
import "github.com/surrealdb/surrealdb.go/pkg/models"

type Location struct {
    ID       *models.RecordID      `json:"id,omitempty"`
    Name     string                `json:"name"`
    Position models.GeometryPoint  `json:"position"`
    Boundary models.GeometryPolygon `json:"boundary"`
}

line := models.GeometryLine{
    {Longitude: -0.118, Latitude: 51.509},
    {Longitude: -0.076, Latitude: 51.508},
}

polygon := models.GeometryPolygon{
    models.GeometryLine{
        {Longitude: -0.12, Latitude: 51.50},
        {Longitude: -0.08, Latitude: 51.50},
        {Longitude: -0.08, Latitude: 51.52},
        {Longitude: -0.12, Latitude: 51.52},
        {Longitude: -0.12, Latitude: 51.50},
    },
}
```

---

## See also

- [RecordID](/docs/reference/golang/api/values/record-id.md) for the record identifier type
- [Value types](/docs/reference/golang/concepts/value-types.md) for the full type mapping
- [Data manipulation](/docs/reference/golang/concepts/data-manipulation.md) for using geometry values in CRUD operations
- [SurrealQL geometry types](/docs/reference/query-language/language-primitives/data-types/geometries.md) for the underlying data model
