Postgis mixin and functions for @moleculer/database
npm install moleculer-postgis@moleculer/database project


- About the Project
- Getting Started
- Usage
- Contributing
- License
The moleculer-postgis is designed to support Postgis functions for @moleculer/database mixin.
To get started, install moleculer-postgis package to your project.
``bash`
npm i moleculer-postgis
yarn add moleculer-postgis
`js
import PostgisMixin, { GeometryType } from 'moleculer-postgis';
module.exports = {
mixins: [
PostgisMixin({
srid: 3346,
}),
],
settings: {
fields: {
// example with geom and validating types
geom: {
type: 'any',
geom: {
types: [GeometryType.POINT, GeometryType.LINE_STRING],
},
},
area: {
type: 'number',
virtual: true,
geom: {
type: 'area',
},
},
},
},
};
`
Using mixin is simple. Import and define it as a function. To the function you can pass opts such as global srid.
`js`
import PostgisMixin from 'moleculer-postgis';
module.exports = {
mixins: [
PostgisMixin({
srid: 3346, // default 3346
geojson: { // optional - Documentation: https://postgis.net/docs/ST_AsGeoJSON.html
maxDecimalDigits: 0 // default
options: 0 // default
}
}),
],
};
`js
module.exports = {
settings: {
fields: {
geom: {
columnName: 'geomfield', // optional
geom: {
type: 'geom', // define type - defaults to "geom"
types: [], // defining types,
multi: true, // defines handling multi geometries
validate({ ctx, params, value, field }) {
// validation function (same as @moleculer/database)
return true;
},
},
},
},
defaultPopulates: ['geom'],
},
};
module.exports = {
settings: {
fields: {
geom: {
geom: true,
},
},
},
};
`
Options:
| Option | Default value | Type (available values) |
| ---------- | ------------- | --------------------------- |
| type | geom | String - area, geom |multi
| | false | Boolean |types
| | All types | Array or string |validate
| | - | Function or string |
Types - Point, LineString, Polygon, MultiLineString, MultiPoint, MultiPolygon
| Query | |
| ----------------------- | ----------------------------------- |
| areaQuery | More info |distanceQuery
| | More info |asGeoJsonQuery
| | More info |geometriesAsTextQuery
| | More info |geomFromText
| | More info |intersectsQuery
| | More info |
`js
import { areaQuery } from 'moleculer-postgis';
const field = 'geomfield';
const fieldAs = 'geom';
// optional
const srid = 3346;
// ROUND(ST_Area("geomfield")) as "geom"
// If srid is passed, ST_Transform is applied
areaQuery(geom, fieldAs, srid);
`
`js
import { distanceQuery } from 'moleculer-postgis';
const field1 = 'geomfield';
const field2 = 'geomfield2';
const resultAs = 'distance';
// optional
const srid = 3346;
// ROUND(ST_Distance("geomfield", "geomfield2")) as "distance"
// If srid is passed, ST_Transform is applied for each field
distanceQuery(field1, field2, resultAs, srid);
`
`js
import { asGeoJsonQuery } from 'moleculer-postgis';
const field = 'geomfield';
const resultAs = 'geom';
// optional
const srid = 3346;
const opts = {
digits: 0,
options: 0,
};
// ST_AsGeoJSON("geomfield")::json as "geom"
// If srid is passed, ST_Transform is applied for each field. Options are not applied if not passed
asGeoJsonQuery(field, resultAs, srid, opts);
`
`js
import { geometriesAsTextQuery } from 'moleculer-postgis';
const geometry = {
type: 'Point',
coordinates: [11, 22],
};
// ST_AsText(...)
// If passed multi geometries - it will use ST_Collect
geometriesAsTextQuery(geometry);
// Using crs with transofrms
const geometry = {
type: 'Point',
coordinates: [11, 22],
crs: { type: 'name', properties: { name: 'EPSG:4326' } },
};
const srid = 3346;
geometriesAsTextQuery(geometry, srid);
`
`js
import { geomFromText, geometriesAsTextQuery } from 'moleculer-postgis';
const geometry = {
type: 'Point',
coordinates: [11, 22],
};
const srid = 3346;
// ST_AsText(...)
const text = geometriesAsTextQuery(geometry);
// ST_GeomFromText(...)
// If srid is passed - ST_Transform is applied
geomFromText(text, srid);
`
`js
import { intersectsQuery } from 'moleculer-postgis';
// any type of geometry can be passed (feature collection, feature, array of feature collections, etc)
const geometry = {
type: 'Point',
coordinates: [11, 22],
};
const field = 'geomfield';
const srid = 3346;
// ST_intersects(...)
// If srid is passed - ST_Transform is applied
intersectsQuery(field, geometry, srid);
``
Contributions are welcome! If you find any issues or have suggestions for improvements, please open an issue or submit a
pull request. For more information, see the contribution guidelines.
This project is licensed under the MIT License.