ginkgoch-koa-map-router
v1.0.2
Published
This is Koa map router provided by Ginkgoch. It contains predefined mapping APIs including spatial analysis, map state query as well as map rendering.
Downloads
5
Readme
Map Router for Koa
This is a Koa map router built by Ginkgoch. It includes predefined mapping RESTful APIs of maps you created.
Install
yarn add ginkgoch-koa-map-router
Usage
import path from 'path';
import Koa from "koa";
import { MapRouter } from 'ginkgoch-koa-map-router';
import { MapEngine, Srs, ShapefileFeatureSource, Projection, FeatureLayer, FillStyle } from "ginkgoch-map";
function getInitMap(name) {
const CRS_GOOGLE = 'EPSG:900913';
let mapEngine = new MapEngine(256, 256);
mapEngine.name = name;
mapEngine.srs = new Srs(CRS_GOOGLE);
let sourcePath = path.resolve(__dirname, '../data/cntry02.shp');
let source = new ShapefileFeatureSource(sourcePath);
source.projection = new Projection(CRS_GOOGLE, CRS_GOOGLE);
let layer = new FeatureLayer(source);
layer.styles.push(new FillStyle('#f0f0f0', '#636363', 1));
mapEngine.pushLayer(layer);
return mapEngine;
}
function serve() {
const port = 3000;
const app = new Koa();
const mapRouter = new MapRouter({ initMap: getInitMap }).getRouter();
app.use(mapRouter.routes()).use(mapRouter.allowedMethods());
app.listen(port, () => console.log(`Server listening on http://localhost:${port}`));
}
serve();
Predefined APIs
This is the map router for KOA and Ginkgoch Map Library.
- Get current map state
- Get map xyz tile image
- Get groups state
- Get a group by name
- Get all layers in a specified group
- Get a layer in a specified group
- Get all fields info in a specified layer
- Get features from a specific layer
- Query features from a specific layer
- Get all properties from a specific layer
- Get a property values from a specific layer
Get current map state
GET: /maps/{{map}}
Example 1: Get current map state
GET:
http://localhost:3000/maps/Default
Response:
{
"name": "Map",
"srs": {
"projection": "EPSG:900913",
"unit": "m"
},
"width": 256,
"height": 256,
"origin": "upperLeft",
"maximumScale": 10000000000,
"minimumScale": 0,
"scales": [
591659030.6768064,
...
],
"groups": [
{
"type": "layer-group",
"name": "Default",
"visible": true,
"layers": [
{
"type": "feature-layer",
"id": "layer-j64mybw4",
"name": "cntry02",
"source": {
"type": "shapefile-feature-source",
"name": "cntry02",
"projection": {
"from": {
"unit": "unknown"
},
"to": {
"unit": "unknown"
}
},
"flag": "rs",
"filePath": "./data/cntry02.shp"
},
"styles": [
{
"visible": true,
"id": "style-dmgb3m8w",
"type": "fill-style",
"name": "Fill Style",
"maximumScale": 10000000000,
"minimumScale": 0,
"lineWidth": 1,
"fillStyle": "#f0f0f0",
"strokeStyle": "#636363"
}
],
"minimumScale": 0,
"maximumScale": 10000000000,
"visible": true
}
]
}
]
}
Get map xyz tile image
GET: /maps/{{map}}/tiles/xyz/{{z}}/{{x}}/{{y}}
Example 1: Get map xyz tile image
GET:
http://localhost:3000/maps/Default/tiles/xyz/0/0/0
Response:
Get groups state
GET: /maps/{{map}}/groups
Example 1: Get groups state
GET:
http://localhost:3000/maps/Default/groups
Response:
[
{
"type": "layer-group",
"name": "Default",
"visible": true,
"layers": [
{
"type": "feature-layer",
"id": "layer-j64mybw4",
"name": "cntry02",
"source": {
"type": "shapefile-feature-source",
"name": "cntry02",
"projection": {
"from": {
"unit": "unknown"
},
"to": {
"unit": "unknown"
}
},
"flag": "rs",
"filePath": "./data/cntry02.shp"
},
"styles": [
{
"visible": true,
"id": "style-dmgb3m8w",
"type": "fill-style",
"name": "Fill Style",
"maximumScale": 10000000000,
"minimumScale": 0,
"lineWidth": 1,
"fillStyle": "#f0f0f0",
"strokeStyle": "#636363"
}
],
"minimumScale": 0,
"maximumScale": 10000000000,
"visible": true
}
]
}
]
Get a group by name
GET: /maps/{{map}}/groups/{{group}}
Example 1: Get a group by name
GET:
http://localhost:3000/maps/Default/groups/Default
Response:
{
"type": "layer-group",
"name": "Default",
"visible": true,
"layers": [
{
"type": "feature-layer",
"id": "layer-j64mybw4",
"name": "cntry02",
"source": {
"type": "shapefile-feature-source",
"name": "cntry02",
"projection": {
"from": {
"unit": "unknown"
},
"to": {
"unit": "unknown"
}
},
"flag": "rs",
"filePath": "./data/cntry02.shp"
},
"styles": [
{
"visible": true,
"id": "style-dmgb3m8w",
"type": "fill-style",
"name": "Fill Style",
"maximumScale": 10000000000,
"minimumScale": 0,
"lineWidth": 1,
"fillStyle": "#f0f0f0",
"strokeStyle": "#636363"
}
],
"minimumScale": 0,
"maximumScale": 10000000000,
"visible": true
}
]
}
Get all layers in a specified group
GET: /maps/{{map}}/groups/{{group}}/layers
Example 1: Get all layers in a specified group
GET:
http://localhost:3000/maps/Default/groups/Default/layers
Response:
[
{
"type": "feature-layer",
"id": "layer-j64mybw4",
"name": "cntry02",
"source": {
"type": "shapefile-feature-source",
"name": "cntry02",
"projection": {
"from": {
"unit": "unknown"
},
"to": {
"unit": "unknown"
}
},
"flag": "rs",
"filePath": "./data/cntry02.shp"
},
"styles": [
{
"visible": true,
"id": "style-dmgb3m8w",
"type": "fill-style",
"name": "Fill Style",
"maximumScale": 10000000000,
"minimumScale": 0,
"lineWidth": 1,
"fillStyle": "#f0f0f0",
"strokeStyle": "#636363"
}
],
"minimumScale": 0,
"maximumScale": 10000000000,
"visible": true
}
]
Get a layer in a specified group
GET: /maps/{{map}}/groups/{{group}}/layers/{{layer}}
Example 1: Get a layer named "cntry02" in a specified group named "Default"
GET:
http://localhost:3000/maps/Default/groups/Default/layers/cntry02
Response:
{
"type": "feature-layer",
"id": "layer-j64mybw4",
"name": "cntry02",
"source": {
"type": "shapefile-feature-source",
"name": "cntry02",
"projection": {
"from": {
"unit": "unknown"
},
"to": {
"unit": "unknown"
}
},
"flag": "rs",
"filePath": "./data/cntry02.shp"
},
"styles": [
{
"visible": true,
"id": "style-dmgb3m8w",
"type": "fill-style",
"name": "Fill Style",
"maximumScale": 10000000000,
"minimumScale": 0,
"lineWidth": 1,
"fillStyle": "#f0f0f0",
"strokeStyle": "#636363"
}
],
"minimumScale": 0,
"maximumScale": 10000000000,
"visible": true,
"envelope": {
"minx": -20037508.23146975,
"miny": -20037508.231469806,
"maxx": 20037508.23146975,
"maxy": 18418382.328923147
},
"count": 251,
"geomType": "Polygon"
}
Example 2: Get a layer in a specified group with specified fields
GET:
http://localhost:3000/maps/Default/groups/Default/layers/cntry02?fields=name,styles
Response:
{
"name": "cntry02",
"styles": [
{
"visible": true,
"id": "style-dmgb3m8w",
"type": "fill-style",
"name": "Fill Style",
"maximumScale": 10000000000,
"minimumScale": 0,
"lineWidth": 1,
"fillStyle": "#f0f0f0",
"strokeStyle": "#636363"
}
]
}
Get all fields info in a specified layer
GET: /maps/{{map}}/groups/{{group}}/layers/{{layer}}/fields
Example 1: Get all fields info in a specified layer with name and type in the returning output
GET:
http://localhost:3000/maps/Default/groups/{{group}}/layers/{{layer}}/fields?fields=name,type
Response:
[
{
"name": "FIPS_CNTRY",
"type": "character"
},
{
"name": "GMI_CNTRY",
"type": "character"
},
...
]
Example 2: Get all fields info in a specified layer
GET:
http://localhost:3000/maps/Default/groups/{{group}}/layers/{{layer}}/fields?
Response:
[
{
"name": "FIPS_CNTRY",
"type": "character",
"length": 2,
"extra": {
"decimal": 0
}
},
...
]
Get features from a specific layer
GET: /maps/{{map}}/groups/{{group}}/layers/{{layer}}/features
Example 1: Get features from a specific layer with supported filters
GET:
http://localhost:3000/maps/Default/groups/{{group}}/layers/{{layer}}/features?outCRS=WGS84&simplifyZoom=0&simplifyTolerance=2&from=2&limit=2
Response:
{
"id": 0,
"type": "FeatureCollection",
"features": [
{
"id": 3,
"type": "Feature",
"geometry": {
"type": "MultiPolygon",
"coordinates": [...]
},
"properties": {
"FIPS_CNTRY": "DA",
...
}
},
{
"id": 4,
"type": "Feature",
"geometry": {
"type": "MultiPolygon",
"coordinates": [...]
},
"properties": {
"FIPS_CNTRY": "LH",
...
}
}
]
}
Query features from a specific layer
POST: /maps/{{map}}/groups/{{group}}/layers/{{layer}}/query
Example 1: Query features from a specific layer
POST:
http://localhost:3000/maps/Default/groups/{{group}}/layers/{{layer}}/query?simplifyZoom=0
Response:
{
"id": 0,
"type": "FeatureCollection",
"features": [
{
"id": 47,
"type": "Feature",
"geometry": {
"type": "MultiPolygon",
"coordinates": [...]
},
"properties": {
"FIPS_CNTRY": "CH",
...
}
}
]
}
Get all properties from a specific layer
GET: /maps/{{map}}/groups/{{group}}/layers/{{layer}}/properties
Example 1: Get all properties from a specific layer with filters
GET:
http://localhost:3000/maps/Default/groups/Default/layers/cntry02/properties?limit=3&fields=CNTRY_NAME,LONG_NAME&from=4
Response:
[
{
"CNTRY_NAME": "Belarus",
"LONG_NAME": "Belarus"
},
{
"CNTRY_NAME": "Canada",
"LONG_NAME": "Canada"
},
{
"CNTRY_NAME": "Germany",
"LONG_NAME": "Germany"
}
]
Get a property values from a specific layer
GET: /maps/{{map}}/groups/{{group}}/layers/{{layer}}/properties/{{field}}
Example 1: Get all property values from a specified field name
GET:
http://localhost:3000/maps/Default/groups/Default/layers/cntry02/properties/CNTRY_NAME?limit=3&from=4
Response:
[
"Belarus",
"Canada",
"Germany"
]