The moleculer-postgis
is designed to support Postgis functions for @moleculer/database
mixin.
To get started, install moleculer-postgis
package to your project.
npm i moleculer-postgis
yarn add moleculer-postgis
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
.
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
}
}),
],
};
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<string> 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 |
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);
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);
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);
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);
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);
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.