packages/@fbcmobile-ui/Utils/MapUtils.js (74 lines of code) (raw):
/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow strict-local
 * @format
 */
'use strict';
import {Linking} from 'react-native';
export const DEGREES_TO_RADIANS = Math.PI / 180;
export const TWICE_EARTH_RADIUS = 6371000 * 2;
export type Coords = {
  latitude: ?number,
  longitude: ?number,
  locationAccuracy?: ?number,
  accuracy?: ?number,
  altitude?: ?number,
  altitudeAccuracy?: ?number,
  speed?: ?number,
  heading?: ?number,
};
export function getGoogleNavigationUrlToLatLng(
  latitude: number,
  longitude: number,
) {
  return `google.navigation:q=${latitude}+${longitude}`;
}
export function getGeoUrlByLatLng(latitude: number, longitude: number) {
  return `geo:${latitude},${longitude}`;
}
export function getDistanceBetweenLocations(
  point1: ?Coords,
  point2: ?Coords,
): ?number {
  return _getHaversineDistanceBetweenLocations(point1, point2);
}
// Haversine formula based on http://en.wikipedia.org/wiki/Haversine_formula
export function _getHaversineDistanceBetweenLocations(
  point1: ?Coords,
  point2: ?Coords,
): ?number {
  if (
    point1 == null ||
    point2 == null ||
    point1.latitude == null ||
    point1.longitude == null ||
    point2.latitude == null ||
    point2.longitude == null
  ) {
    return null;
  }
  // Lat/Lng are given as degrees, so we convert to radians.
  const lat1 = point1.latitude * DEGREES_TO_RADIANS;
  const long1 = point1.longitude * DEGREES_TO_RADIANS;
  const lat2 = point2.latitude * DEGREES_TO_RADIANS;
  const long2 = point2.longitude * DEGREES_TO_RADIANS;
  const latDiff = lat1 - lat2;
  const lngDiff = long1 - long2;
  const h =
    _haversine(latDiff) + Math.cos(lat1) * Math.cos(lat2) * _haversine(lngDiff);
  const distance = TWICE_EARTH_RADIUS * Math.asin(Math.sqrt(h));
  return distance;
}
/**
 * Calculates the haversine function
 * http://en.wikipedia.org/wiki/Haversine_formula
 */
export function _haversine(d: number): number {
  const h = Math.sin(d / 2);
  return h * h;
}
export const convertKmtoMiles = (kilometer: number) => {
  return kilometer / 1.609344;
};
export const navigateToCoords = (latitude: number, longitude: number) => {
  const googleNavigationUrl = getGoogleNavigationUrlToLatLng(
    latitude,
    longitude,
  );
  if (Linking.canOpenURL(googleNavigationUrl)) {
    Linking.openURL(googleNavigationUrl);
  } else {
    Linking.openURL(getGeoUrlByLatLng(latitude, longitude));
  }
};