Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/jsuyog2/postgis

This Node.js class provides methods for interacting with a PostgreSQL/PostGIS database. It abstracts common spatial operations and queries, allowing you to easily perform spatial operations on your PostGIS-enabled PostgreSQL database.
https://github.com/jsuyog2/postgis

database geobuf geojson geojson-data geospatial geospatial-data mvt nodejs postgis postgres postgresql spatial-data

Last synced: 3 months ago
JSON representation

This Node.js class provides methods for interacting with a PostgreSQL/PostGIS database. It abstracts common spatial operations and queries, allowing you to easily perform spatial operations on your PostGIS-enabled PostgreSQL database.

Awesome Lists containing this project

README

        

# PostGIS for Node.js

This Node.js class provides methods for interacting with a PostgreSQL/PostGIS database. It abstracts common spatial operations and queries, allowing you to easily perform spatial operations on your PostGIS-enabled PostgreSQL database.

## Table of Contents

- [Installation](#installation)
- [Usage](#usage)
- [API Reference](#api-reference)
- [list_tables](#list_tables)
- [list_columns](#list_columns)
- [query_table](#query_table)
- [bbox](#bbox)
- [centroid](#centroid)
- [intersect_feature](#intersect_feature)
- [intersect_point](#intersect_point)
- [geojson](#geojson)
- [geobuf](#geobuf)
- [mvt](#mvt)
- [nearest](#nearest)
- [transform_point](#transform_point)
- [Error Handling](#error-handling)
- [License](#license)

## Installation

1. Install the required packages using npm:

```bash
npm install pg
```

2. Install the `postgis` package:

```bash
npm install postgis
```

## Usage

To use the `Postgis` class, first initialize it with a PostgreSQL client instance from the `pg` package:

```javascript
const { Client } = require('pg');
const Postgis = require('postgis');

const client = new Client({
connectionString: 'your_connection_string'
});

client.connect();

const postgis = new Postgis(client);

// Example usage
async function run() {
try {
const tables = await postgis.list_tables({ filter: 'table_type = \'BASE TABLE\'' });
console.log('Tables:', tables);

const columns = await postgis.list_columns('your_table');
console.log('Columns:', columns);

const features = await postgis.query_table('your_table', {
columns: 'name, geom',
filter: `"column_name" = 'value'`,
sort: 'name ASC',
limit: 50
});
console.log('Features:', features);
} catch (err) {
console.error('Error:', err);
} finally {
await client.end();
}
}

run();
```

## API Reference

### `list_tables(options)`

Lists all tables in the database. Optionally, you can filter by schema or other parameters.

**Parameters:**
- `options` (optional): JSON object with the following properties:
- `filter` (optional): A SQL WHERE clause filter.

**Returns:**
A list of tables with their metadata.

**Example:**

```javascript
const tables = await postgis.list_tables({ filter: 'table_type = \'BASE TABLE\'' });
```

### `list_columns(table)`

Lists all columns in a given table.

**Parameters:**
- `table`: The name of the table.

**Returns:**
A list of columns in the table.

**Example:**

```javascript
const columns = await postgis.list_columns('your_table');
```

### `query_table(table, options)`

Queries a table with optional parameters for columns, filtering, grouping, sorting, and limiting the results.

**Parameters:**
- `table`: The name of the table.
- `options` (optional): JSON object with the following properties:
- `columns` (optional): Columns to retrieve, defaults to `'*'`.
- `filter` (optional): A SQL WHERE clause filter.
- `group` (optional): Columns to group by.
- `sort` (optional): Sorting order.
- `limit` (optional): Limit the number of results, defaults to `100`.

**Returns:**
A list of rows from the query.

**Example:**

```javascript
const features = await postgis.query_table('your_table', {
columns: 'name, geom',
filter: `"column_name" = 'value'`,
sort: 'name ASC',
limit: 50
});
```

### `bbox(table, options)`

Calculates the bounding box (extent) for a given table based on a specified geometry column.

**Parameters:**
- `table`: The name of the table.
- `options` (optional): JSON object with the following properties:
- `geom_column` (optional): The geometry column, defaults to `'geom'`.
- `srid` (optional): The SRID for the bounding box, defaults to `4326`.
- `filter` (optional): A SQL WHERE clause filter.

**Returns:**
An object representing the bounding box with coordinates.

**Example:**

```javascript
const bbox = await postgis.bbox('your_table', {
geom_column: 'geom',
srid: 4326,
filter: `"some_column" = 'some_value'`
});
```

### `centroid(table, options)`

Calculates the centroid of geometries in a given table.

**Parameters:**
- `table`: The name of the table.
- `options` (optional): JSON object with the following properties:
- `force_on_surface` (optional): Whether to force the centroid to be on the surface, defaults to `false`.
- `geom_column` (optional): The geometry column, defaults to `'geom'`.
- `srid` (optional): The SRID, defaults to `'4326'`.
- `filter` (optional): A SQL WHERE clause filter.

**Returns:**
A list of centroids.

**Example:**

```javascript
const centroids = await postgis.centroid('your_table', {
force_on_surface: true,
geom_column: 'geom',
srid: 4326,
filter: `"column_name" = 'value'`
});
```

### `intersect_feature(table_from, table_to, options)`

Finds intersections between features in two tables.

**Parameters:**
- `table_from`: The first table.
- `table_to`: The second table.
- `options` (optional): JSON object with the following properties:
- `columns` (optional): Columns to retrieve, defaults to `'*'`.
- `distance` (optional): Distance for the intersection, defaults to `'0'`.
- `geom_column_from` (optional): The geometry column for the first table, defaults to `'geom'`.
- `geom_column_to` (optional): The geometry column for the second table, defaults to `'geom'`.
- `filter` (optional): A SQL WHERE clause filter.
- `sort` (optional): Sorting order.
- `limit` (optional): Limit the number of results.

**Returns:**
A list of intersecting features.

**Example:**

```javascript
const intersections = await postgis.intersect_feature('table1', 'table2', {
columns: 'name, geom',
distance: '10',
filter: `"some_column" = 'some_value'`,
sort: 'name ASC',
limit: 50
});
```

### `intersect_point(table, point, options)`

Finds features in a table that intersect with a given point.

**Parameters:**
- `table`: The name of the table.
- `point`: The point to intersect with.
- `options` (optional): JSON object with the following properties:
- `columns` (optional): Columns to retrieve, defaults to `'*'`.
- `distance` (optional): Distance for the intersection, defaults to `'0'`.
- `geom_column` (optional): The geometry column, defaults to `'geom'`.
- `filter` (optional): A SQL WHERE clause filter.
- `sort` (optional): Sorting order.
- `limit` (optional): Limit the number of results.

**Returns:**
A list of features intersecting with the point.

**Example:**

```javascript
const features = await postgis.intersect_point('your_table', '1,1,4326', {
columns: 'name, geom',
distance: '5',
filter: `"some_column" = 'some_value'`,
sort: 'name ASC',
limit: 10
});
```

### `geojson(table, options)`

Converts features from a table to GeoJSON format.

**Parameters:**
- `table`: The name of the table.
- `options` (optional): JSON object with the following properties:
- `bounds` (optional): Bounding box for the results.
- `id_column` (optional): Column to use as the feature ID.
- `precision` (optional): Precision for coordinates, defaults to `9`.
- `geom_column` (optional): The geometry column, defaults to `'geom'`.
- `columns` (optional): Columns to retrieve.
- `filter` (optional): A SQL WHERE clause filter.

**Returns:**
A GeoJSON `FeatureCollection`.

**Example:**

```javascript
const geojson = await postgis.geojson('your_table', {
bounds: 'xmin ymin, xmax ymax',
id_column: 'id',
precision: 6,
geom_column: 'geom',
columns: 'name, geom',
filter: `"some_column" = 'some_value'`
});
```

### `geobuf(table, options)`

Converts features from a table to Geobuf format.

**Parameters:**
- `table`: The name of the table.
- `options` (optional): JSON object with the following properties:
- `bounds` (optional): Bounding box for the results.
- `geom_column` (optional): The geometry column, defaults to `'geom'`.
- `columns` (optional): Columns to retrieve.
- `filter` (optional): A SQL WHERE clause filter.

**Returns:**
A Geobuf binary encoded string.

**Example:**

```javascript
const geobuf = await postgis.geobuf('your_table', {
bounds: 'xmin ymin, xmax ymax',
geom_column: 'geom',
columns: 'name, geom',
filter: `"some_column" = 'some_value'`
});
```

### `mvt(table, x, y, z, options)`

Generates a Mapbox Vector Tile (MVT) for a given tile coordinate.

**Parameters:**
- `table`: The name of the table.
- `x`: The x-coordinate of the tile.
- `y`: The y-coordinate of the tile.
- `z`: The zoom level.
- `options` (optional): JSON object with the following properties:
- `columns` (optional): Columns to retrieve.
- `id_column` (optional): Column to use as the feature ID.
- `geom_column` (optional): The geometry column, defaults to `'geom'`.
- `filter` (optional): A SQL WHERE clause filter.

**Returns:**
A Mapbox Vector Tile.

**Example:**

```javascript
const mvt = await postgis.mvt('your_table', 1, 2, 3, {
columns: 'name, geom',
id_column: 'id',
filter: `"some_column" = 'some_value'`
});
```

### `nearest(table, point, options)`

Finds the nearest features to a given point.

**Parameters:**
- `table`: The name of the table.
- `point`: The point to find the nearest features to.
- `options` (optional): JSON object with the following properties:
- `columns` (optional): Columns to retrieve, defaults to `'*'`.
- `geom_column` (optional): The geometry column, defaults to `'geom'`.
- `filter` (optional): A SQL WHERE clause filter.
- `limit` (optional): Limit the number of results, defaults to `10`.

**Returns:**
A list of the nearest features.

**Example:**

```javascript
const nearest = await postgis.nearest('your_table', '1,1,4326', {
columns: 'name, geom',
filter: `"some_column" = 'some_value'`,
limit: 5
});
```

### `transform_point(point, options)`

Transforms a point from one SRID to another.

**Parameters:**
- `point`: The point to transform.
- `options` (optional): JSON object with the following properties:
- `srid` (optional): The target SRID, defaults to `4326`.

**Returns:**
The transformed point.

**Example:**

```javascript
const transformed = await postgis.transform_point('1,1,4326', { srid: 3857 });
```

## Error Handling

All methods throw an error if the query execution fails. Ensure proper error handling in your application to manage these errors.

```javascript
try {
const result = await postgis.someMethod();
console.log(result);
} catch (err) {
console.error('Error:', err);
}
```

## Version Compatibility

- **PostgreSQL:** Compatible with PostgreSQL 12 and higher.
- **PostGIS:** Compatible with PostGIS 3.0 and higher.
- **Node.js:** Compatible with Node.js 14.x and higher.
- **pg (node-postgres):** Version 8.x and higher.

## Testing

If you create a pull request, tests better pass :)

```bash
npm install
npm test
```

## License

This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.