
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
import * as $math from "../../core/util/Math";
import { geoCircle, geoCentroid, geoBounds, geoArea } from "d3-geo";
/**
* Returns a GeoJSON representation of a circle, suitable for use as `geometry` value
* in a [[MapPolygon]] in a [[MapPolygonSeries]].
*
* @param geoPoint Coordinates
* @param radius Circle radius in degrees
* @return Polygon geometry
*/
export function getGeoCircle(geoPoint, radius) {
return geoCircle().center([geoPoint.longitude, geoPoint.latitude]).radius(radius)();
}
/**
* Returns geo centroid of a geometry
*/
export function getGeoCentroid(geometry) {
const centroid = geoCentroid(geometry);
return { longitude: centroid[0], latitude: centroid[1] };
}
/**
* Returns geo area of a geometry
*/
export function getGeoArea(geometry) {
return geoArea(geometry);
}
/**
* Returns bounds of a geometry
*/
export function getGeoBounds(geometry) {
const bounds = geoBounds(geometry);
if (bounds) {
const geoBounds = { left: bounds[0][0], right: bounds[1][0], top: bounds[1][1], bottom: bounds[0][1] };
if (geoBounds.right < geoBounds.left) {
geoBounds.right = 180;
geoBounds.left = -180;
}
return geoBounds;
}
return { left: 0, right: 0, top: 0, bottom: 0 };
}
/**
* Returns a GeoJSON representation of a rectangle, suitable for use
* as `geometry` value in a [[MapPolygon]] in a [[MapPolygonSeries]].
*
* @param north North latitude
* @param east East longitude
* @param south South latitude
* @param west West longitude
* @return polygon geometry
*/
export function getGeoRectangle(north, east, south, west) {
let multiPolygon = [];
if (west <= -180) {
west = -179.9999;
}
if (south <= -90) {
south = -89.9999;
}
if (north >= 90) {
north = 89.9999;
}
if (east >= 180) {
east = 179.9999;
}
let stepLong = Math.min(90, (east - west) / Math.ceil((east - west) / 90));
let stepLat = (north - south) / Math.ceil((north - south) / 90);
for (let ln = west; ln < east; ln = ln + stepLong) {
let surface = [];
multiPolygon.push([surface]);
if (ln + stepLong > east) {
stepLong = east - ln;
}
for (let ll = ln; ll <= ln + stepLong; ll = ll + 5) {
surface.push([ll, north]);
}
for (let lt = north; lt >= south; lt = lt - stepLat) {
surface.push([ln + stepLong, lt]);
}
for (let ll = ln + stepLong; ll >= ln; ll = ll - 5) {
surface.push([ll, south]);
}
for (let lt = south; lt <= north; lt = lt + stepLat) {
surface.push([ln, lt]);
}
}
return { type: "MultiPolygon", coordinates: multiPolygon };
}
/**
* Update longitudes and latitudes that wrap around -180/180 and -90/90 values.
*
* @param geoPoint Input coordinates
* @return Updated coordinates
*/
export function normalizeGeoPoint(geoPoint) {
let longitude = wrapAngleTo180(geoPoint.longitude);
let latitude = Math.asin(Math.sin((geoPoint.latitude * $math.RADIANS))) * $math.DEGREES;
let latitude180 = wrapAngleTo180(geoPoint.latitude);
if (Math.abs(latitude180) > 90) {
longitude = wrapAngleTo180(longitude + 180);
}
geoPoint.longitude = longitude;
geoPoint.latitude = latitude;
return geoPoint;
}
/**
* @ignore
*/
export function wrapAngleTo180(angle) {
angle = angle % 360;
if (angle > 180) {
angle -= 360;
}
if (angle < -180) {
angle += 360;
}
return angle;
}
//# sourceMappingURL=MapUtils.js.map