# Coordinate operations¶

apply(geometry, transformation, include_z=False)

Returns a copy of a geometry array with a function applied to its coordinates.

With the default of `include_z=False`, all returned geometries will be two-dimensional; the third dimension will be discarded, if present. When specifying `include_z=True`, the returned geometries preserve the dimensionality of the respective input geometries.

Parameters
geometryGeometry or array_like
transformationfunction

A function that transforms a (N, 2) or (N, 3) ndarray of float64 to another (N, 2) or (N, 3) ndarray of float64.

include_zbool, default False

If True, include the third dimension in the coordinates array that is passed to the `transformation` function. If a geometry has no third dimension, the z-coordinates passed to the function will be NaN.

Examples

```>>> apply(Geometry("POINT (0 0)"), lambda x: x + 1)
<pygeos.Geometry POINT (1 1)>
>>> apply(Geometry("LINESTRING (2 2, 4 4)"), lambda x: x * [2, 3])
<pygeos.Geometry LINESTRING (4 6, 8 12)>
>>> apply(None, lambda x: x) is None
True
>>> apply([Geometry("POINT (0 0)"), None], lambda x: x).tolist()
[<pygeos.Geometry POINT (0 0)>, None]
```

By default, the third dimension is ignored:

```>>> apply(Geometry("POINT Z (0 0 0)"), lambda x: x + 1)
<pygeos.Geometry POINT (1 1)>
>>> apply(Geometry("POINT Z (0 0 0)"), lambda x: x + 1, include_z=True)
<pygeos.Geometry POINT Z (1 1 1)>
```
count_coordinates(geometry)

Counts the number of coordinate pairs in a geometry array.

Parameters
geometryGeometry or array_like

Examples

```>>> count_coordinates(Geometry("POINT (0 0)"))
1
>>> count_coordinates(Geometry("LINESTRING (2 2, 4 4)"))
2
>>> count_coordinates(None)
0
>>> count_coordinates([Geometry("POINT (0 0)"), None])
1
```
get_coordinates(geometry, include_z=False, return_index=False)

Gets coordinates from a geometry array as an array of floats.

The shape of the returned array is (N, 2), with N being the number of coordinate pairs. With the default of `include_z=False`, three-dimensional data is ignored. When specifying `include_z=True`, the shape of the returned array is (N, 3).

Parameters
geometryGeometry or array_like
include_zbool, default False

If, True include the third dimension in the output. If a geometry has no third dimension, the z-coordinates will be NaN.

return_indexbool, default False

If True, also return the index of each returned geometry as a separate ndarray of integers. For multidimensional arrays, this indexes into the flattened array (in C contiguous order).

Examples

```>>> get_coordinates(Geometry("POINT (0 0)")).tolist()
[[0.0, 0.0]]
>>> get_coordinates(Geometry("LINESTRING (2 2, 4 4)")).tolist()
[[2.0, 2.0], [4.0, 4.0]]
>>> get_coordinates(None)
array([], shape=(0, 2), dtype=float64)
```

By default the third dimension is ignored:

```>>> get_coordinates(Geometry("POINT Z (0 0 0)")).tolist()
[[0.0, 0.0]]
>>> get_coordinates(Geometry("POINT Z (0 0 0)"), include_z=True).tolist()
[[0.0, 0.0, 0.0]]
```

When return_index=True, indexes are returned also:

```>>> geometries = [Geometry("LINESTRING (2 2, 4 4)"), Geometry("POINT (0 0)")]
>>> coordinates, index = get_coordinates(geometries, return_index=True)
>>> coordinates.tolist(), index.tolist()
([[2.0, 2.0], [4.0, 4.0], [0.0, 0.0]], [0, 0, 1])
```
set_coordinates(geometry, coordinates)

Adapts the coordinates of a geometry array in-place.

If the coordinates array has shape (N, 2), all returned geometries will be two-dimensional, and the third dimension will be discarded, if present. If the coordinates array has shape (N, 3), the returned geometries preserve the dimensionality of the input geometries.

Warning

The geometry array is modified in-place! If you do not want to modify the original array, you can do `set_coordinates(arr.copy(), newcoords)`.

Parameters
geometryGeometry or array_like
coordinates: array_like

`apply`

Returns a copy of a geometry array with a function applied to its coordinates.

Examples

```>>> set_coordinates(Geometry("POINT (0 0)"), [[1, 1]])
<pygeos.Geometry POINT (1 1)>
>>> set_coordinates([Geometry("POINT (0 0)"), Geometry("LINESTRING (0 0, 0 0)")], [[1, 2], [3, 4], [5, 6]]).tolist()
[<pygeos.Geometry POINT (1 2)>, <pygeos.Geometry LINESTRING (3 4, 5 6)>]
>>> set_coordinates([None, Geometry("POINT (0 0)")], [[1, 2]]).tolist()
[None, <pygeos.Geometry POINT (1 2)>]
```

Third dimension of input geometry is discarded if coordinates array does not include one:

```>>> set_coordinates(Geometry("POINT Z (0 0 0)"), [[1, 1]])
<pygeos.Geometry POINT (1 1)>
>>> set_coordinates(Geometry("POINT Z (0 0 0)"), [[1, 1, 1]])
<pygeos.Geometry POINT Z (1 1 1)>
```