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.
-
Install the required packages using npm:
npm install pg
-
Install the
postgis
package:npm install postgis
To use the Postgis
class, first initialize it with a PostgreSQL client instance from the pg
package:
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();
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:
const tables = await postgis.list_tables({ filter: 'table_type = \'BASE TABLE\'' });
Lists all columns in a given table.
Parameters:
table
: The name of the table.
Returns: A list of columns in the table.
Example:
const columns = await postgis.list_columns('your_table');
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 to100
.
Returns: A list of rows from the query.
Example:
const features = await postgis.query_table('your_table', {
columns: 'name, geom',
filter: `"column_name" = 'value'`,
sort: 'name ASC',
limit: 50
});
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 to4326
.filter
(optional): A SQL WHERE clause filter.
Returns: An object representing the bounding box with coordinates.
Example:
const bbox = await postgis.bbox('your_table', {
geom_column: 'geom',
srid: 4326,
filter: `"some_column" = 'some_value'`
});
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 tofalse
.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:
const centroids = await postgis.centroid('your_table', {
force_on_surface: true,
geom_column: 'geom',
srid: 4326,
filter: `"column_name" = 'value'`
});
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:
const intersections = await postgis.intersect_feature('table1', 'table2', {
columns: 'name, geom',
distance: '10',
filter: `"some_column" = 'some_value'`,
sort: 'name ASC',
limit: 50
});
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:
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
});
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 to9
.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:
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'`
});
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:
const geobuf = await postgis.geobuf('your_table', {
bounds: 'xmin ymin, xmax ymax',
geom_column: 'geom',
columns: 'name, geom',
filter: `"some_column" = 'some_value'`
});
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:
const mvt = await postgis.mvt('your_table', 1, 2, 3, {
columns: 'name, geom',
id_column: 'id',
filter: `"some_column" = 'some_value'`
});
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 to10
.
Returns: A list of the nearest features.
Example:
const nearest = await postgis.nearest('your_table', '1,1,4326', {
columns: 'name, geom',
filter: `"some_column" = 'some_value'`,
limit: 5
});
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 to4326
.
Returns: The transformed point.
Example:
const transformed = await postgis.transform_point('1,1,4326', { srid: 3857 });
All methods throw an error if the query execution fails. Ensure proper error handling in your application to manage these errors.
try {
const result = await postgis.someMethod();
console.log(result);
} catch (err) {
console.error('Error:', err);
}
- 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.
If you create a pull request, tests better pass :)
npm install
npm test
This project is licensed under the MIT License. See the LICENSE file for details.