postgis
Version:
A Node.js class for interacting with PostGIS-enabled PostgreSQL databases.
413 lines (312 loc) • 11.1 kB
Markdown
# 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.