You look for a library able to compute geographical data (distance, ellipsoids, polygones, bounds, track lengths...), the solution is TsGeo... :)

tsgeo is an adaptation of phpgeo by Marcus Jaschen.

This project is developed in order to have a simple solution to do geographical operation for TypeScript projects, language used in recent mobile projects (Angular, Ionic, ...)

This project is available under MIT lisense at https://github.com/clemdesign/typescript-tsgeo.

Installation

Please refer to Github guide.

Possibilities

TsGeo provides several geometry classes:

  • Coordinate
  • Line
  • Polyline
  • Polygon

A Coordinate represents a geographic location, i. e. it contains a latitude and a longitude - together with an so called Ellipsoid.

A Line consists of two coordinates, while polylines and polygons are built from two or more coordinates.

Distance between 2 coordinates

TsGeo offers 2 possibilities to compute distance between 2 coordinates:

// Vincenty’s Formula
import {Coordinate} from "tsgeo/Coordinate";
import {Vincenty}   from "tsgeo/Distance/Vincenty";

/* Add the following in a method of TS class */

let coordinate1 = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit
let coordinate2 = new Coordinate(20.709722, -156.253333); // Haleakala Summit

console.log(coordinate1.getDistance(coordinate2, new Vincenty())); // returns 128130.850 (meters; ≈128 kilometers)
// Haversine Formula
import {Coordinate} from "tsgeo/Coordinate";
import {Haversine}   from "tsgeo/Distance/Haversine";

/* Add the following in a method of TS class */

let coordinate1 = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit
let coordinate2 = new Coordinate(20.709722, -156.253333); // Haleakala Summit

console.log(coordinate1.getDistance(coordinate2, new Haversine())); // returns 128384.515 (meters; ≈128 kilometers)

Line length

Operation on ellipsoid line is possible with tsgeo. The Line class provides a method to calculate its own length.

// Vincenty’s Formula
import {Coordinate} from "tsgeo/Coordinate";
import {Vincenty}   from "tsgeo/Distance/Vincenty";

/* Add the following in a method of TS class */

let line = new Line(
    new Coordinate(52.5, 13.5),
    new Coordinate(52.6, 13.4)
);

console.log(line.getLength(new Vincenty())); // returns 13013.849

Bearing

Bearing is not yet implemented.

Polyline

A polyline consists of an ordered list of locations (coordinates). The following operations are possible:

  • Polyline length: length of all segments point to point.
  • Segments operation: Array of Line with possibility to do operation on the object.
  • Coordinate: List all latitudes and/or longitudes.
// >>> Define a polyline
//----------------------
import {Coordinate} from "tsgeo/Coordinate";
import {Polyline}   from "tsgeo/Polyline";

/* Add the following in a method of TS class */

let track = new Polyline();

track.addPoint(new Coordinate(52.5, 13.5));
track.addPoint(new Coordinate(54.5, 12.5));
track.addPoint(new Coordinate(55.5, 14.5));

// >>> Get length of each segments
//--------------------------------
let index = 1;
for (const segment of track.getSegments()) {
  console.log('Segment ' + index + ' length: ' +
              (segment.getLength(new Vincenty()) / 1000).toString() +
              ' kilometers');
  index++;
}
/* Display:
Segment 1 length: 275.154731 kilometers
Segment 2 length: 143.797789 kilometers
*/

// >>> Get length of each segments, where points are reversed
//-----------------------------------------------------------
let index = 1;
let reverseTrack = track.getReverse();
for (const segment of reverseTrack.getSegments()) {
  console.log('Segment ' + index + ' length: ' +
              (segment.getLength(new Vincenty()) / 1000).toString() +
              ' kilometers');
  index++;
}
/* Display:
Segment 1 length: 143.797789 kilometers
Segment 2 length: 275.154731 kilometers
*/

// >>> Get polyline length
//------------------------
console.log('Polyline length: ' +
              (track.getLength(new Vincenty()) / 1000).toString() +
              ' kilometers');
/* Display:
Length: 418.95252 kilometers
*/

Polygon

A polygon consists of an ordered list of locations (coordinates) like Polyline but its start and end points are connected.

// >>> Define a polygon
//----------------------
import {Coordinate} from "tsgeo/Coordinate";
import {Polygon}   from "tsgeo/Polygon";

/* Add the following in a method of TS class */

let polygon = new Polygon();

polygon.addPoint(new Coordinate(52.5, 13.5));
polygon.addPoint(new Coordinate(54.5, 12.5));
polygon.addPoint(new Coordinate(55.5, 14.5));

// >>> Get length of each segments
//--------------------------------
let index = 1;
for (const segment of polygon.getSegments()) {
  console.log('Segment ' + index + ' length: ' +
              (segment.getLength(new Vincenty()) / 1000).toString() +
              ' kilometers');
  index++;
}
/* Display:
Segment 1 length: 275.154731 kilometers
Segment 2 length: 143.797789 kilometers
Segment 3 length: 340.283134 kilometers
*/

// >>> Get length of each segments, where points are reversed
//-----------------------------------------------------------
let index = 1;
let reversePolygon = polygon.getReverse();
for (const segment of reversePolygon.getSegments()) {
  console.log('Segment ' + index + ' length: ' +
              (segment.getLength(new Vincenty()) / 1000).toString() +
              ' kilometers');
  index++;
}
/* Display:
Segment 1 length: 143.797789 kilometers
Segment 2 length: 275.154731 kilometers
Segment 3 length: 340.283134 kilometers
*/

// >>> Get Area and Perimeter
//------------------------
console.log(Polygon Area = ' + (polygon.getArea() / 1000000) + ' km², <br>' +
            'Perimeter = ' + (polygon.getPerimeter(new Vincenty()) / 1000) + ' m);
/* Display:
Polygon Area = 17773.260742317438 km², 
Perimeter = 742.16571 m
*/

Format and Output

TsGeo allow to format the output in different styles:

  • Decimal Degrees
  • Decimal Minutes
  • DMS
  • GeoJSON

Decimal Degrees

import {Coordinate}       from "tsgeo/Coordinate";
import {DecimalDegrees}   from "tsgeo/Formatter/Coordinate/DecimalDegrees";

/* Add the following in a method of TS class */

let coordinate = new Coordinate(19.820664, -155.468066);

console.log(coordinate.format(new DecimalDegrees()))         // Display "19.82066 -155.46807"
console.log(coordinate.format(new DecimalDegrees(', ', 3)))  // Display "19.821 -155.468"

Decimal Minutes

import {Coordinate}       from "tsgeo/Coordinate";
import {DecimalMinutes}   from "tsgeo/Formatter/Coordinate/DecimalMinutes";

/* Add the following in a method of TS class */

let coordinate = new Coordinate(43.62310, -70.20787);
let formatter  = new DecimalMinutes();

console.log(coordinate.format(formatter))         // Display "43° 37.386′ -070° 12.472′"

formatter.setSeparator(', ')
      .useCardinalLetters(true)
      .setUnits(DecimalMinutes.UNITS_ASCII);

console.log(coordinate.format(formatter))         // Display "43° 37.386' N, 070° 12.472' W"

DMS

import {Coordinate}  from "tsgeo/Coordinate";
import {DMS}         from "tsgeo/Formatter/Coordinate/DMS";

/* Add the following in a method of TS class */

let coordinate = new Coordinate(18.911306, -155.678268);
let formatter  = new DMS();

console.log(coordinate.format(formatter))         // Display "18° 54′ 41″ -155° 40′ 42″"

formatter.setSeparator(', ')
      .useCardinalLetters(true)
      .setUnits(DecimalMinutes.UNITS_ASCII);

console.log(coordinate.format(formatter))         // Display "18° 54' 41" N, 155° 40' 42" W"

GeoJSON

import {Coordinate}    from "tsgeo/Coordinate";
import {GeoJSON}       from "tsgeo/Formatter/Coordinate/GeoJSON";

/* Add the following in a method of TS class */

let coordinate = new Coordinate(18.911306, -155.678268);

console.log(coordinate.format(new GeoJSON()))         // Display "{"type":"Point","coordinates":[-155.678268,18.911306]}"

For more information about TsGeo, because this library is an adaption of phpgeo, you can adapt the official documentation of phpgeo.

Conclusion

You have possibility to improve this library and add missing needs easily. :D

Don't hesitate to make remarks and suggestion for this library, and contribute... ;)

Tht's all for this article, see you in the next... xD

Article précédent Article suivant


Ajouter un commentaire