All Projects → koopjs → Featureserver

koopjs / Featureserver

Licence: other
An open source Geoservices Implementation

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Featureserver

Koop
🔮 Transform, query, and download geospatial data on the web.
Stars: ✭ 505 (+665.15%)
Mutual labels:  gis, geojson, arcgis, server
Agstoshapefile
Convert ArcGIS Server Dynamic Map Service to GeoJSON and Shapefile
Stars: ✭ 172 (+160.61%)
Mutual labels:  gis, geojson, arcgis
GeoJSON.jl
Utilities for working with GeoJSON data in Julia
Stars: ✭ 46 (-30.3%)
Mutual labels:  geojson, gis
Orb
Types and utilities for working with 2d geometry in Golang
Stars: ✭ 378 (+472.73%)
Mutual labels:  gis, geojson
Go Geom
Package geom implements efficient geometry types for geospatial applications.
Stars: ✭ 456 (+590.91%)
Mutual labels:  gis, geojson
terraformer-arcgis-parser
No description or website provided.
Stars: ✭ 30 (-54.55%)
Mutual labels:  arcgis, geojson
polylabel cmd
A command-line utility for generating optimum polygon label coordinates from GeoJSON
Stars: ✭ 12 (-81.82%)
Mutual labels:  geojson, gis
GeoConvert
Converting between Geojson and GIS file formats
Stars: ✭ 32 (-51.52%)
Mutual labels:  geojson, gis
Turf
A modular geospatial engine written in JavaScript
Stars: ✭ 6,659 (+9989.39%)
Mutual labels:  gis, geojson
Hadoop For Geoevent
ArcGIS GeoEvent Server sample Hadoop connector for storing GeoEvents in HDFS.
Stars: ✭ 5 (-92.42%)
Mutual labels:  arcgis, server
Django Rest Framework Gis
Geographic add-ons for Django REST Framework. Maintained by the OpenWISP Project.
Stars: ✭ 830 (+1157.58%)
Mutual labels:  gis, geojson
WLib
Personally compiled C#.NET + ArcObject/ArcEngine common code base, most of which are packaged as static methods or extension methods, including detailed comments
Stars: ✭ 22 (-66.67%)
Mutual labels:  arcgis, gis
nl
geojson and topojson for common dutch areas
Stars: ✭ 30 (-54.55%)
Mutual labels:  geojson, gis
registrant
Python package used for generating HTML reports about the contents of Esri geodatabases.
Stars: ✭ 44 (-33.33%)
Mutual labels:  arcgis, gis
pygeoif
Basic implementation of the __geo_interface__
Stars: ✭ 44 (-33.33%)
Mutual labels:  geojson, gis
pyprt
Python bindings for the "Procedural Runtime" (PRT) of CityEngine by Esri.
Stars: ✭ 36 (-45.45%)
Mutual labels:  arcgis, gis
Geotools
Official GeoTools repository
Stars: ✭ 1,109 (+1580.3%)
Mutual labels:  gis, geojson
turf-go
A Go language port of Turf.js
Stars: ✭ 41 (-37.88%)
Mutual labels:  geojson, gis
django-graphql-geojson
GeoJSON support for Graphene Django
Stars: ✭ 61 (-7.58%)
Mutual labels:  geojson, gis
Terraformer
A geographic toolkit for dealing with geometry, geography, formats, and building geo databases
Stars: ✭ 643 (+874.24%)
Mutual labels:  geojson, arcgis

FeatureServer

An open source implementation of the GeoServices specification

npm travis Greenkeeper badge

Usage

This is meant to be used as a plugin to Express

Example server

const express = require('express')
const app = express() // set up a basic express server
const FeatureServer = require('featureserver')
const cache = require('cache')

// We only need one handler because FeatureServer.route is going to do all the work
const handler = (req, res) => {
  cache.get(/* some geojson */, (err, data) => {
    if (err) res.status(500).json({error: err.message})
    else FeatureServer.route(req, res, data)
  })
}

// Sets up all of the handled routes to support `GET` and `POST`
const routes = ['/FeatureServer', '/FeatureServer/layers', '/FeatureServer/:layer', '/FeatureServer/:layer/:method']

routes.forEach(route => {
  app.route(route)
  .get(handler)
  .post(handler)
})

API

FeatureServer.route

Pass in an incoming request object, an outgoing response object, a geojson object, and options and this function will route and return a geoservices compliant response

  • Supports: '/FeatureServer', '/FeatureServer/layers', '/FeatureServer/:layer', '/FeatureServer/:layer/:method'
    • Note: only query, info, and generateRenderer are supported methods at this time.
FeatureServer.route(req, res, data, options)
  • data is either a geojson object extended with some additional properties or an object with a layers property which an array of extended geojson objects. These properties are optional and can be used to provide more specific metadata or to shortcut the built in filtering mechanism.

e.g.

{
  type: 'FeatureCollection' // Static
  features: Array, // GeoJSON features
  statistics: Object, // pass statistics to an outStatistics request to or else they will be calculated from geojson features passed in
  metadata: {
    id: number, // The unique layer id.  If supplied for one layer, you should supply for all layers to avoid multiple layers having the same id.
    name: String, // The name of the layer
    description: String, // The description of the layer
    extent: Array, // valid extent array e.g. [[180,90],[-180,-90]]
    displayField: String, // The display field to be used by a client
    geometryType: String // REQUIRED if no features are returned with this object Point || MultiPoint || LineString || MultiLineString || Polygon || MultiPolygon
    idField: String, // unique identifier field,
    maxRecordCount: Number, // the maximum number of features a provider can return at once
    limitExceeded: Boolean, // whether or not the server has limited the features returned
    timeInfo: Object, // describes the time extent and capabilities of the layer,
    transform: Object, // describes a quantization transformation
    renderer: Object, // provider can over-ride default symbology of FeatureServer output with a renderer object. See https://developers.arcgis.com/web-map-specification/objects/simpleRenderer, for object specification.
    defaultVisibility: boolean, // The default visibility of this layer
    minScale: number, // The minScale value for this layer
    maxScale: number, // The maxScale value for this layer
    fields: [
     { // Subkeys are optional
       name: String,
       type: String, // 'Date' || 'Double' || 'Integer' || 'String'
       alias: String, // how should clients display this field name,
     }
    ]
  },
  capabilities: {
    quantization: Boolean // True if the provider supports quantization
  },
  filtersApplied: {
    all: Boolean // true if all post processing should be skipped
    geometry: Boolean, // true if a geometric filter has already been applied to the data
    where: Boolean, // true if a sql-like where filter has already been applied to the data
    offset: Boolean // true if the result offset has already been applied to the data,
    limit: Boolean // true if the result count has already been limited,
    projection: Boolean // true if the result data has already been projected
  }
  count: Number // pass count if the number of features in a query has been pre-calculated
}

or

{
  layers: [
    {
      type: 'FeatureCollection'
      ...
    },
    {
      type: 'FeatureCollection'
      ...
    }
]
  • options is an object that dictates method actions. See FeatureServer.query and FeatureServer.generateRenderer for more details.

FeatureServer.query

Pass in geojson and options (a valid geoservices query object), and the function will perform the query and return a valid geoservices query object. The in addition to input statistics: {}, following is an example of all query options that can be passed into the query route: '/FeatureServer/:layer/query'

e.g.

const options = {
  where: `1=1`,
  objectIds: '1,2,3',
  geometry: {
    xmin: -110, ymin: 30, xmax: -106, ymax: 50,
    spatialReference: { wkid: 4326 },
  },
  geometryType: 'esriGeometryEnvelope',
  spatialRel: 'esriSpatialRelContains',
  outFields: '*',
  returnGeometry: true,
  outSR: 102100, // output spatial reference
  returnIdsOnly: true,
  returnCountOnly: true,
  orderByFields: 'Full/Part_COUNT DESC',
  groupByFieldsForStatistics: 'Full/Part',
  outStatistics: {
  	statisticType: 'count',
  	onStatisticField: '<field>',
  	outStatisticFieldName: 'name'
  },
  returnDistinctValues: true,
  resultOffset: 0,
  resultRecordCount: 0,
  f: 'pjson'
}

FeatureServer.query(geojson, options)

FeatureServer.serverInfo

Generate version 10.51 Geoservices server info

const server = {
  description: String // Describes the collection of layers below,
  maxRecordCount: Number // the maximum number of features a provider can return at once,
  hasStaticData: Boolean // whether or not the server contains any data that is not changing
  layers: [{ // A collection of all the layers managed by the server
    type: 'FeatureCollection',
    metadata: {
      id: number, // The unique layer id.  If supplied for one layer, you should supply for all layers to avoid multiple layers having the same id.
      name: String, // The name of the layer
      description: String, // The description of the layer
      extent: Array, // valid extent array e.g. [[180,90],[-180,-90]]
      displayField: String, // The display field to be used by a client
      idField: String, // unique identifier field,
      geometryType: String, // REQUIRED if no features are returned with this object Point || MultiPoint || LineString || MultiLineString || Polygon || MultiPolygon
      maxRecordCount: Number, // the maximum number of features a provider can return at once
      limitExceeded: Boolean, // whether or not the server has limited the features returned
      timeInfo: Object, // describes the time extent and capabilities of the layer
      renderer: Object, // provider can over-ride default symbology of FeatureServer output with a renderer object. See https://developers.arcgis.com/web-map-specification/objects/simpleRenderer, for object specification.
      defaultVisibility: boolean, // The default visibility of this layer
      minScale: number, // The minScale value for this layer
      maxScale: number // The maxScale value for this layer
    }
    features: [// If all the metadata provided above is provided features are optional.
      {
        type: 'Feature',
        geometry: {
          type: 'Point',
          coordinates: [125.6, 10.1]
        },
        properties: {
          name: 'Dinagat Islands'
        }
      }]
    }
  }]
}

FeatureServer.serverInfo(server)

FeatureServer.layerInfo

Generate version 10.51 Geoservices information about a single layer

FeatureServer.layerInfo(geojson, options)

Note that the layer info is modified with properties metadata and capabilites found at the top-level of the GeoJSON object.

GeoJSON property Layer info result
metadata.id overrides default
metadata.name overrides default
metadata.description overrides default
metadata.geometryType overrides value determined from data
metadata.extent overrides value determined from data
metadata.timeInfo overrides default
metadata.maxRecordCount overrides default (2000)
metadata.displayField overrides default (OBJECTID)
metadata.objectIdField overrides default (OBJECTID)
metadata.hasStaticData overrides default (false)
metadata.renderer overrides default
metadata.defaultVisibility overrides default
metadata.minScale overrides default
metadta.maxScale overrides default
capabilities.extract when set to true, Extract added to capabilites (e.g., capabilities: "Query,Extract")
capabilities.quantization when set to true, supportsCoordinatesQuantization: true

FeatureServer.layers

Generate version 10.51 Geoservices information about one or many layers

Can pass a single geojson object or an array of geojson objects

FeatureServer.layers(geojson, options)

FeatureServer.generateRenderer

Pass in geojson and options, and the function will return a valid generateRenderer object. Two classificationDef classification types are supported, classBreaksDef and uniqueValueDef.

classBreaksDef is used to classify numeric data based on a number of breaks and a statistical method. Features can also be normalized before being classified. uniqueValueDef is used to classify data based on a unique field(s). If classification breaks are not supplied through in statistics, they will be generated using classificationDef options. The output is a generateRenderer object.

classBreaksDef

In addition to class breaks as input statistics: [], the following is an example of all classBreaksDef options that can be passed into the generateRenderer route: '/FeatureServer/:layer/generateRenderer'

e.g.

const options = {
 *'classificationDef': {
   *'type': 'classBreaksDef',
   *'classificationField': '<field1>',
   *'classificationMethod': 'esriClassifyEqualInterval' | 'esriClassifyNaturalBreaks' | 'esriClassifyQuantile' | 'esriClassifyStandardDeviation',
   *'breakCount': 9,
    'normalizationType': 'esriNormalizeByField' | 'esriNormalizeByLog' | 'esriNormalizeByPercentOfTotal',
    'normalizationField': '<field2>' // mandatory if 'normalizationType' === 'esriNormalizeByField'
    'baseSymbol': {
      'type': 'esriSMS',
      'style': 'esriSMSCircle',
      'width': 2
    },
    'colorRamp': {
      'type': 'algorithmic',
      'fromColor': [115,76,0,255],
      'toColor': [255,25,86,255],
      'algorithm': 'esriHSVAlgorithm'
    }
  },
  'where': '<field2> > 39'
}

FeatureServer.generateRender(geojson, options)

*required

Output:

{
  type: 'classBreaks',
  field: '<field1>',
  classificationMethod: 'esriClassifyEqualInterval',
  minValue: 0,
  classBreakInfos: [
    {
      classMinValue: 0,
      classMaxValue: 5,
      label: '0-5',
      description: '',
      symbol: {
        type: 'esriSMS',
        style: 'esriSMSCircle',
        width: 2,
        color: [115, 76, 0]
      }
    },
    {
      classMinValue: 6,
      classMaxValue: 11,
      label: '6-11',
      description: '',
      symbol: {
        type: 'esriSMS',
        style: 'esriSMSCircle',
        width: 2,
        color: [156, 67, 0]
      }
    },
    ...
  ]
}
uniqueValueDef

The following is an example of all uniqueValueDef options that can be passed into the generateRenderer route: '/FeatureServer/:layer/generateRenderer'

e.g.

const options = {
 *'classificationDef': {
   *'type': 'uniqueValueDef',
   *'uniqueValueFields': ['Genus', '<field2>', '<field3>'],
   *'fieldDelimiter': ', '
    'baseSymbol': {
      'type': 'esriSMS',
      'style': 'esriSMSCircle',
      'width': 2
    },
    'colorRamp': {
      'type': 'algorithmic',
      'fromColor': [115,76,0,255],
      'toColor': [255,25,86,255],
      'algorithm': 'esriHSVAlgorithm'
    }
  },
  'where': 'latitude > 39'
}

FeatureServer.generateRender(geojson, options)

*required

Output:

{
  type: 'uniqueValue',
  field1: 'Genus',
  field2: '',
  field3: '',
  fieldDelimiter: ', ',
  defaultSymbol: {},
  defaultLabel: '',
  uniqueValueInfos: [
    {
      value: 'MAGNOLIA',
      count: 5908,
      label: 'MAGNOLIA',
      description: '',
      symbol: {
        type: 'esriSMS',
        style: 'esriSMSCircle',
        width: 2,
        color: [115, 76, 0]
  	   }
    },
    {
      value: 'QUERCUS',
      count: 12105,
      label: 'QUERCUS',
      description: '',
      symbol: {
        type: 'esriSMS',
        style: 'esriSMSCircle',
        width: 2,
        color: [116, 76, 0]
  	  }
   },
   ...
  ]

FeatureServer.authenticate

Pass in an outgoing response object and an authentication success object and this function will route and return a formatted authentication success response.

FeatureServer.authenticate(res, auth, ssl = false)
  • auth is the result of a successful authentication attempt that returns a token and expiration time
  • ssl is a boolean flag indicating if token should always be passed back via HTTPS. Defaults to false

e.g.,

const auth = {
  "token":"elS39KU4bMmZQgMXDuswgA14vavIp4mfpiqcWSr0qM6q4dFguTnnHddWqbpK5Mc3HsCN8XghlwawUUYApOOcxKNyg_9WqTofChJXxxD058_rL1HZkM5PDhUOh9YYQn1K",
  "expires":1524508236322
}

FeatureServer.authenticate(res, auth)

{
  "token":"elS39KU4bMmZQgMXDuswgA14vavIp4mfpiqcWSr0qM6q4dFguTnnHddWqbpK5Mc3HsCN8XghlwawUUYApOOcxKNyg_9WqTofChJXxxD058_rL1HZkM5PDhUOh9YYQn1K",
  "expires":1524508236322,
  ssl: false
}

FeatureServer.error.authorize

Pass in an outgoing response object and this function will route and return a formattted authorization error.

FeatureServer.error.authorize(res)

{
  "error": {
    "code": 499,
    "message": "Token Required",
    "details": []
  }
}

FeatureServer.error.authenticate

Pass in an outgoing response object and this function will route and return a formatted authentication error.

FeatureServer.error.authenticate(res)

{
  "error": {
    "code": 400,
    "message": "Unable to generate token.",
    "details": ["Invalid username or password."]
  }
}
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].