140 lines
4.7 KiB
JavaScript
140 lines
4.7 KiB
JavaScript
/**
|
|
* Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
|
|
*
|
|
* @param {Array<any>|Geometry|Feature<Point>} obj any value
|
|
* @returns {Array<number>} coordinates
|
|
*/
|
|
function getCoord(obj) {
|
|
if (!obj) throw new Error('No obj passed');
|
|
|
|
var coordinates = getCoords(obj);
|
|
|
|
// getCoord() must contain at least two numbers (Point)
|
|
if (coordinates.length > 1 &&
|
|
typeof coordinates[0] === 'number' &&
|
|
typeof coordinates[1] === 'number') {
|
|
return coordinates;
|
|
} else {
|
|
throw new Error('Coordinate is not a valid Point');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Unwrap coordinates from a Feature, Geometry Object or an Array of numbers
|
|
*
|
|
* @param {Array<any>|Geometry|Feature<any>} obj any value
|
|
* @returns {Array<any>} coordinates
|
|
*/
|
|
function getCoords(obj) {
|
|
if (!obj) throw new Error('No obj passed');
|
|
var coordinates;
|
|
|
|
// Array of numbers
|
|
if (obj.length) {
|
|
coordinates = obj;
|
|
|
|
// Geometry Object
|
|
} else if (obj.coordinates) {
|
|
coordinates = obj.coordinates;
|
|
|
|
// Feature
|
|
} else if (obj.geometry && obj.geometry.coordinates) {
|
|
coordinates = obj.geometry.coordinates;
|
|
}
|
|
// Checks if coordinates contains a number
|
|
if (coordinates) {
|
|
containsNumber(coordinates);
|
|
return coordinates;
|
|
}
|
|
throw new Error('No valid coordinates');
|
|
}
|
|
|
|
/**
|
|
* Checks if coordinates contains a number
|
|
*
|
|
* @private
|
|
* @param {Array<any>} coordinates GeoJSON Coordinates
|
|
* @returns {boolean} true if Array contains a number
|
|
*/
|
|
function containsNumber(coordinates) {
|
|
if (coordinates.length > 1 &&
|
|
typeof coordinates[0] === 'number' &&
|
|
typeof coordinates[1] === 'number') {
|
|
return true;
|
|
}
|
|
if (coordinates[0].length) {
|
|
return containsNumber(coordinates[0]);
|
|
}
|
|
throw new Error('coordinates must only contain numbers');
|
|
}
|
|
|
|
/**
|
|
* Enforce expectations about types of GeoJSON objects for Turf.
|
|
*
|
|
* @alias geojsonType
|
|
* @param {GeoJSON} value any GeoJSON object
|
|
* @param {string} type expected GeoJSON type
|
|
* @param {string} name name of calling function
|
|
* @throws {Error} if value is not the expected type.
|
|
*/
|
|
function geojsonType(value, type, name) {
|
|
if (!type || !name) throw new Error('type and name required');
|
|
|
|
if (!value || value.type !== type) {
|
|
throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + value.type);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enforce expectations about types of {@link Feature} inputs for Turf.
|
|
* Internally this uses {@link geojsonType} to judge geometry types.
|
|
*
|
|
* @alias featureOf
|
|
* @param {Feature} feature a feature with an expected geometry type
|
|
* @param {string} type expected GeoJSON type
|
|
* @param {string} name name of calling function
|
|
* @throws {Error} error if value is not the expected type.
|
|
*/
|
|
function featureOf(feature, type, name) {
|
|
if (!feature) throw new Error('No feature passed');
|
|
if (!name) throw new Error('.featureOf() requires a name');
|
|
if (!feature || feature.type !== 'Feature' || !feature.geometry) {
|
|
throw new Error('Invalid input to ' + name + ', Feature with geometry required');
|
|
}
|
|
if (!feature.geometry || feature.geometry.type !== type) {
|
|
throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + feature.geometry.type);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
|
|
* Internally this uses {@link geojsonType} to judge geometry types.
|
|
*
|
|
* @alias collectionOf
|
|
* @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
|
|
* @param {string} type expected GeoJSON type
|
|
* @param {string} name name of calling function
|
|
* @throws {Error} if value is not the expected type.
|
|
*/
|
|
function collectionOf(featureCollection, type, name) {
|
|
if (!featureCollection) throw new Error('No featureCollection passed');
|
|
if (!name) throw new Error('.collectionOf() requires a name');
|
|
if (!featureCollection || featureCollection.type !== 'FeatureCollection') {
|
|
throw new Error('Invalid input to ' + name + ', FeatureCollection required');
|
|
}
|
|
for (var i = 0; i < featureCollection.features.length; i++) {
|
|
var feature = featureCollection.features[i];
|
|
if (!feature || feature.type !== 'Feature' || !feature.geometry) {
|
|
throw new Error('Invalid input to ' + name + ', Feature with geometry required');
|
|
}
|
|
if (!feature.geometry || feature.geometry.type !== type) {
|
|
throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + feature.geometry.type);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports.geojsonType = geojsonType;
|
|
module.exports.collectionOf = collectionOf;
|
|
module.exports.featureOf = featureOf;
|
|
module.exports.getCoord = getCoord;
|
|
module.exports.getCoords = getCoords;
|