项目作者: totorototo

项目描述 :
geo position helper library
高级语言: TypeScript
项目地址: git://github.com/totorototo/positic.git
创建时间: 2020-06-10T09:40:11Z
项目社区:https://github.com/totorototo/positic

开源协议:MIT License

下载


positic

Build Status

manipulate positions from GeoJSON.

install

  1. $ npm install --save positic

or

  1. $ yarn add positic

Usage

Javascript

  1. // CommonsJs
  2. const createTrack = require('positic').createTrack;
  3. // ES Modules
  4. import { createTrack } from 'positic';

TypeScript

  1. import { Track, createTrack } from 'positic';
  2. const track: Track = createTrack([5.77367, 45.07122, 279.608]);

api

createTrack: (positions: Positions[]) => Track

Given any valid position array, return an object that manipulate positions and calculate data.

type definitions

  • based types
  1. type Longitude = number;
  2. type Latitude = number;
  3. type Altitude = number;
  4. type Loss = number;
  5. type Gain = number;
  6. type Distance = number;
  1. type Position = [Longitude, Latitude, Altitude?];
  1. type Elevation = {
  2. positive: number;
  3. negative: number;
  4. };
  1. type Area = {
  2. minLongitude: number;
  3. maxLongitude: number;
  4. minLatitude: number;
  5. maxLatitude: number;
  6. };
  1. type Statistics = [Distance, Gain, Loss];
  • Track
  1. type Track = {
  2. getPositionsAt: (...distances: number[]) => Position[];
  3. getPositionsIndicesAt: (...distances: number[]) => number[];
  4. getPositionIndex: (position: Position) => number;
  5. slice: (start?: number, end?: number) => Path;
  6. getLength: () => number;
  7. getElevation: (smoothingFactor?: number) => Elevation;
  8. getBoundingBox: () => Area;
  9. findClosestPosition: (currentLocation: Position) => Position;
  10. getProgressionStatistics: (currentPathIndex: number) => Statistics;
  11. };

Track usage

  1. import { createTrack } = from "positic";
  2. const positions = [
  3. [5.77367, 45.07122, 279.608],
  4. [5.77367, 45.07122, 279.608],
  5. [5.77407, 45.07117, 279.926],
  6. [5.77467, 45.07108, 280.112],
  7. [5.77487, 45.07091, 280.871],
  8. [5.77501, 45.07069, 281.516],
  9. [5.77515, 45.07045, 282.205],
  10. [5.77573, 45.07057, 280.301],
  11. ...,
  12. [6.30269, 45.54447, 320],
  13. [6.30273, 45.54463, 320],
  14. [6.30281, 45.5447, 320],
  15. [6.30275, 45.54486, 320],
  16. [6.30267, 45.54509, 320],
  17. [6.30259, 45.54522, 320],
  18. [6.30245, 45.54534, 320],
  19. [6.30233, 45.54542, 320]
  20. ];
  21. const track = createTrack(positions);

or

  1. const track = createTrack(GeoJSON.features[0].geometry.coordinates);
  • calculate track length
  1. const distance = track.getLength();
  2. // distance = 144670 (in meters);
  • calculate track elevation
  1. const elevation = track.getElevation();
  2. // elevation = {positive:1243.33, negative:1209.34} (in meters)
  • calculate track bounding box
  1. const area = track.getBoundingBox();
  2. // area = {
  3. // "maxLatitude": 45.55014,
  4. // "maxLongitude": 6.30281,
  5. // "minLatitude": 45.06822,
  6. // "minLongitude": 5.77311,
  7. // }
  • get positions at 10km and 20km marks
  1. const marks = [10000, 20000];
  2. const positions = get.getPositionsAt(...marks);
  3. // positions = [
  4. // [5.77501, 45.07069, 281.516],
  5. // [6.30259, 45.54522, 320],
  6. //]
  • find the closest track position to a given position
  1. const PARIS = [2.3488, 48.8534];
  2. const closestPosition = track.findClosestPosition(PARIS);
  3. // closestPosition = [6.30259, 45.54522, 320]
  • get progression statistics
  1. const currentIndex = 1200;
  2. const statistics = track.getProgressionStatistics(currentIndex);
  3. // statistics = [120.23, 6787.34, 5683.22] (distance in meters, positive elevation in meters, negative elevation in meters)

generic helper functions

  • calculate distance between two positions
  1. import { calculateDistance } from 'positic';
  2. const origin = [37.618423, 55.751244];
  3. const destination = [2.3488, 48.8534];
  4. const distance = calculateDistance(origin, destination);
  5. // distance = 2486688.9750256147 (in meters)
  • calculate bearing between two positions
  1. import { calculateBearing } from 'positic';
  2. const origin = [-3.94915, 51.2194];
  3. const destination = [-3.95935, 51.2392];
  4. const bearing = calculateBearing(origin, destination);
  5. // bearing = 342.1247653798634 (in deg)
  • check if position is in a given area
  1. import { isInArea } from 'positic';
  2. const current = [-3.94915, 51.2194];
  3. const area = {
  4. maxLatitude: 49.07122,
  5. minLatitude: 40.07122,
  6. minLongitude: 1.77367,
  7. maxLongitude: 9.77367
  8. };
  9. const isIn = isInArea(current, area);
  10. // isIn = true / false
  • check if position is in a given radius
  1. import { isRadius } from 'positic';
  2. const current = [-3.94915, 51.2194];
  3. const center = [6.23828, 45.50127, 888.336];
  4. const radius = 70;
  5. const isIn = location.isInRadius(current, center, radius);
  6. // isIn = true / false

TypeScript

positic includes TypeScript definitions.

License

MIT