projects/angular-cesium/src/lib/angular-cesium/services/coordinate-converter/coordinate-converter.service.ts
Given different types of coordinates, we provide you a service converting those types to the most common other types. We are using the geodesy implementation of UTM conversion. see: https://github.com/chrisveness/geodesy.
import { Component, OnInit } from '
Methods |
constructor(cesiumService?: CesiumService)
|
||||||
Parameters :
|
bearingTo | ||||||||||||
bearingTo(first: literal type, second: literal type)
|
||||||||||||
initial bearing between two points
Parameters :
Returns :
any
|
bearingToCartesian | |||||||||
bearingToCartesian(firstCartesian3: Cartesian3, secondCartesian3: Cartesian3)
|
|||||||||
initial bearing between two points
Parameters :
Returns :
any
bearing in degrees |
cartesian3ToCartographic | |||||||||
cartesian3ToCartographic(cartesian: Cartesian3, ellipsoid?: any)
|
|||||||||
Parameters :
Returns :
any
|
Static cartesian3ToLatLon | |||||||||
cartesian3ToLatLon(cartesian3: Cartesian3, ellipsoid?: any)
|
|||||||||
Parameters :
Returns :
literal type
|
degreesToCartographic |
degreesToCartographic(longitude: number, latitude: number, height?: number)
|
Returns :
any
|
degreesToUTM |
degreesToUTM(longitude: number, latitude: number)
|
Returns :
any
|
Private geodesyToCesiumObject | ||||||
geodesyToCesiumObject(geodesyRadians: LatLon)
|
||||||
Parameters :
Returns :
{ longitude: any; latitude: any; height: any; }
|
middlePointByScreen | |||||||||
middlePointByScreen(position0: Cartesian3, position1: Cartesian3)
|
|||||||||
Parameters :
Returns :
Cartesian3
|
midPointToCartesian3 | ||||||||||||
midPointToCartesian3(first: literal type, second: literal type)
|
||||||||||||
middle point between two points
Parameters :
Returns :
any
|
radiansToCartographic |
radiansToCartographic(longitude: number, latitude: number, height?: number)
|
Returns :
any
|
screenToCartesian3 | |||||||||
screenToCartesian3(screenPos: literal type, addMapCanvasBoundsToPos?: boolean)
|
|||||||||
Parameters :
Returns :
any
|
screenToCartographic | |||||||||
screenToCartographic(screenPos: literal type, ellipsoid?: any)
|
|||||||||
Parameters :
Returns :
any
|
UTMToDegrees | |||||||||||||||
UTMToDegrees(zone: number, hemisphereType: hemisphere, easting: number, northing: number)
|
|||||||||||||||
Parameters :
Returns :
{ longitude: any; latitude: any; height: any; }
|
import { Injectable, Optional } from '@angular/core';
import { CesiumService } from '../cesium/cesium.service';
import * as geodesy from 'geodesy';
import { hemisphere, LatLon, LatLonEllipsoidal, Utm } from 'geodesy';
import { Cartesian3 } from '../../models/cartesian3';
const LatLonVectors = geodesy['LatLonVectors']; // doesnt exists on typings
window['geodesy'] = geodesy;
/**
* Given different types of coordinates, we provide you a service converting those types to the most common other types.
* We are using the geodesy implementation of UTM conversion. see: https://github.com/chrisveness/geodesy.
*
* @example
* import { Component, OnInit } from '@angular/core';
* import { CoordinateConverter } from 'angular2-cesium';
*
* @Component({
* selector:'my-component',
* template:'<div>{{showCartographic}}</div>',
* providers:[CoordinateConverter]
* })
* export class MyComponent implements OnInit {
* showCartographic;
*
* constructor(private coordinateConverter:CoordinateConverter){
* }
*
* ngOnInit(){
* this.showCartographic = this.coordinateConverter.degreesToCartographic(5, 5, 5);
* }
* }
*
*/
@Injectable()
export class CoordinateConverter {
constructor(@Optional() private cesiumService?: CesiumService) {
}
static cartesian3ToLatLon(cartesian3: Cartesian3, ellipsoid?: any): {lon: number, lat: number; height: number} {
const cart = Cesium.Cartographic.fromCartesian(cartesian3, ellipsoid);
return {
lon: Cesium.Math.toDegrees(cart.longitude),
lat: Cesium.Math.toDegrees(cart.latitude),
height: cart.height
};
}
screenToCartesian3(screenPos: { x: number, y: number }, addMapCanvasBoundsToPos?: boolean) {
if (!this.cesiumService) {
throw new Error('ANGULAR2-CESIUM - Cesium service should be provided in order' +
' to do screen position calculations');
} else {
const screenPosition = { ...screenPos };
if (addMapCanvasBoundsToPos) {
const mapBounds = this.cesiumService.getViewer().canvas.getBoundingClientRect();
screenPosition.x += mapBounds.left;
screenPosition.y += mapBounds.top;
}
const camera = this.cesiumService.getViewer().camera;
return camera.pickEllipsoid(screenPosition);
}
}
screenToCartographic(screenPos: { x: number, y: number }, ellipsoid?: any) {
return this.cartesian3ToCartographic(this.screenToCartesian3(screenPos), ellipsoid);
}
cartesian3ToCartographic(cartesian: Cartesian3, ellipsoid?: any) {
return Cesium.Cartographic.fromCartesian(cartesian, ellipsoid);
}
degreesToCartographic(longitude: number, latitude: number, height?: number) {
return Cesium.Cartographic.fromDegrees(longitude, latitude, height);
}
radiansToCartographic(longitude: number, latitude: number, height?: number) {
return Cesium.Cartographic.fromRadians(longitude, latitude, height);
}
degreesToUTM(longitude: number, latitude: number) {
return new LatLonEllipsoidal(latitude, longitude).toUtm();
}
UTMToDegrees(zone: number, hemisphereType: hemisphere, easting: number, northing: number) {
return this.geodesyToCesiumObject(new Utm(zone, hemisphereType, easting, northing).toLatLonE());
}
private geodesyToCesiumObject(geodesyRadians: LatLon) {
return {
longitude: geodesyRadians.lon,
latitude: geodesyRadians.lat,
height: geodesyRadians['height'] ? geodesyRadians['height'] : 0
};
}
/**
* middle point between two points
* @param first (latitude,longitude) in radians
* @param second (latitude,longitude) in radians
*/
midPointToCartesian3(first: { latitude: number, longitude: number }, second: { latitude: number, longitude: number }) {
const toDeg = (rad: number) => Cesium.Math.toDegrees(rad);
const firstPoint = new LatLonVectors(toDeg(first.latitude), toDeg(first.longitude));
const secondPoint = new LatLonVectors(toDeg(second.latitude), toDeg(second.longitude));
const middlePoint: any = firstPoint.midpointTo(secondPoint);
return Cesium.Cartesian3.fromDegrees(middlePoint.lon, middlePoint.lat);
}
middlePointByScreen(position0: Cartesian3, position1: Cartesian3): Cartesian3 {
const scene = this.cesiumService.getScene();
const screenPosition1 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, position0);
const screenPosition2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, position1);
const middleScreenPoint =
new Cesium.Cartesian2((screenPosition2.x + screenPosition1.x) / 2.0, (screenPosition2.y + screenPosition1.y) / 2.0);
return scene.pickPosition(middleScreenPoint);
}
/**
* initial bearing between two points
*
* * @return bearing in degrees
* @param first - {latitude,longitude} in radians
* @param second - {latitude,longitude} in radians
*/
bearingTo(first: { latitude: number, longitude: number }, second: { latitude: number, longitude: number }) {
const toDeg = (rad: number) => Cesium.Math.toDegrees(rad);
const firstPoint = new LatLonVectors(toDeg(first.latitude), toDeg(first.longitude));
const secondPoint = new LatLonVectors(toDeg(second.latitude), toDeg(second.longitude));
const bearing = firstPoint.bearingTo(secondPoint);
return bearing;
}
/**
* initial bearing between two points
*
* @return bearing in degrees
*/
bearingToCartesian(firstCartesian3: Cartesian3, secondCartesian3: Cartesian3) {
const firstCart = Cesium.Cartographic.fromCartesian(firstCartesian3);
const secondCart = Cesium.Cartographic.fromCartesian(secondCartesian3);
return this.bearingTo(firstCart, secondCart);
}
}