0.3.2 • Published 3 months ago

moleculer-postgis v0.3.2

Weekly downloads
-
License
MIT
Repository
github
Last release
3 months ago

Save, validate and parse geometries on your @moleculer/database project

License GitHub issues GitHub stars

Table of Contents

About the Project

The moleculer-postgis is designed to support Postgis functions for @moleculer/database mixin.

Getting Started

To get started, install moleculer-postgis package to your project.

npm i moleculer-postgis
yarn add moleculer-postgis

Usage

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',
        },
      },
    },
  },
};

Documentation

Mixin

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
      }
    }),
  ],
};

Fields

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:

OptionDefault valueType (available values)
typegeomString - area, geom
multifalseBoolean
typesAll typesArray<string> or string
validate-Function or string

Types - Point, LineString, Polygon, MultiLineString, MultiPoint, MultiPolygon

Queries

Query
areaQueryMore info
distanceQueryMore info
asGeoJsonQueryMore info
geometriesAsTextQueryMore info
geomFromTextMore info
intersectsQueryMore info

areaQuery

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);

distanceQuery

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);

asGeoJsonQuery

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);

geometriesAsTextQuery

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);

geomFromText

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);

intersectsQuery

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);

Contributing

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.

License

This project is licensed under the MIT License.

0.3.0

3 months ago

0.3.2

3 months ago

0.3.1

3 months ago

0.2.1

7 months ago

0.2.0

7 months ago

0.2.7

7 months ago

0.2.6

7 months ago

0.2.3

7 months ago

0.2.2

7 months ago

0.2.4

7 months ago

0.1.0

8 months ago

0.0.5

8 months ago

0.0.4

8 months ago

0.0.3

8 months ago

0.0.2

8 months ago

0.0.1

8 months ago