Socket
Socket
Sign inDemoInstall

geojson

Package Overview
Dependencies
Maintainers
1
Versions
18
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

geojson - npm Package Compare versions

Comparing version 0.4.1 to 0.5.0

95

geojson.js
(function(GeoJSON) {
GeoJSON.version = '0.4.1';
GeoJSON.version = '0.5.0';
// Allow user to specify default parameters
GeoJSON.defaults = {};
GeoJSON.defaults = {
doThrows: {
invalidGeometry: false
}
};
function InvalidGeometryError() {
var args = 1 <= arguments.length ? [].slice.call(arguments, 0) : [];
var item = args.shift();
var params = args.shift();
Error.apply(this, args);
this.message = this.message || "Invalid Geometry: " + 'item: ' + JSON.stringify(item) + ', params: ' + JSON.stringify(params);
}
InvalidGeometryError.prototype = Error;
GeoJSON.errors = {
InvalidGeometryError: InvalidGeometryError
};
//exposing so this can be overriden maybe by geojson-validation or the like
GeoJSON.isGeometryValid = function(geometry){
if(!geometry || !Object.keys(geometry).length)
return false;
return !!geometry.type && !!geometry.coordinates && Array.isArray(geometry.coordinates) && !!geometry.coordinates.length;
};
// The one and only public function.
// Converts an array of objects into a GeoJSON feature collection
GeoJSON.parse = function(objects, params, callback) {
var geojson,

@@ -22,7 +49,8 @@ settings = applyDefaults(params, this.defaults),

objects.forEach(function(item){
geojson.features.push(getFeature(item, settings, propFunc));
geojson.features.push(getFeature({item:item, params: settings, propFunc:propFunc}));
});
addOptionals(geojson, settings);
} else {
geojson = getFeature(objects, settings, propFunc);
geojson = getFeature({item:objects, params: settings, propFunc:propFunc});
addOptionals(geojson, settings);
}

@@ -60,3 +88,6 @@

if(settings.crs && checkCRS(settings.crs)) {
geojson.crs = settings.crs;
if(settings.isPostgres)
geojson.geometry.crs = settings.crs;
else
geojson.crs = settings.crs;
}

@@ -129,3 +160,7 @@ if (settings.bbox) {

// to the GeoJSON features array
function getFeature(item, params, propFunc) {
function getFeature(args) {
var item = args.item,
params = args.params,
propFunc = args.propFunc;
var feature = { "type": "Feature" };

@@ -139,2 +174,6 @@

function isNested(val){
return (/^.+\..+$/.test(val));
}
// Assembles the `geometry` property

@@ -159,2 +198,22 @@ // for the feature output

/* Handle things like:
Polygon: {
northeast: ['lat', 'lng'],
southwest: ['lat', 'lng']
}
*/
else if(typeof val === 'object' && !Array.isArray(val)) {
/*jshint loopfunc: true */
var points = Object.keys(val).map(function(key){
var order = val[key];
var newItem = item[key];
return buildGeom(newItem, {geom:{ Point: order}});
});
geom.type = gtype;
/*jshint loopfunc: true */
geom.coordinates = [].concat(points.map(function(p){
return p.coordinates;
}));
}
// Geometry parameter specified as: {Point: ['lat', 'lng']}

@@ -165,4 +224,26 @@ else if(Array.isArray(val) && item.hasOwnProperty(val[0]) && item.hasOwnProperty(val[1])){

}
// Geometry parameter specified as: {Point: ['container.lat', 'container.lng']}
else if(Array.isArray(val) && isNested(val[0]) && isNested(val[1])){
var coordinates = [];
for (var i = 0; i < val.length; i++) { // i.e. 0 and 1
var paths = val[i].split('.');
var itemClone = item;
for (var j = 0; j < paths.length; j++) {
if (!itemClone.hasOwnProperty(paths[j])) {
return false;
}
itemClone = itemClone[paths[j]]; // Iterate deeper into the object
}
coordinates[i] = itemClone;
}
geom.type = gtype;
geom.coordinates = [Number(coordinates[1]), Number(coordinates[0])];
}
}
if(params.doThrows && params.doThrows.invalidGeometry && !GeoJSON.isGeometryValid(geom)){
throw new InvalidGeometryError(item, params);
}
return geom;

@@ -169,0 +250,0 @@ }

4

geojson.min.js

@@ -1,3 +0,3 @@

// geojson.js - v0.4.1
// geojson.js - v0.5.0
// (c) 2016 Casey Thomas, MIT License
!function(a){function b(a,b){var c=a||{};for(var d in b)b.hasOwnProperty(d)&&!c[d]&&(c[d]=b[d]);return c}function c(a,b){if(b.crs&&d(b.crs)&&(a.crs=b.crs),b.bbox&&(a.bbox=b.bbox),b.extraGlobal){a.properties={};for(var c in b.extraGlobal)a.properties[c]=b.extraGlobal[c]}}function d(a){if("name"===a.type){if(a.properties&&a.properties.name)return!0;throw new Error('Invalid CRS. Properties must contain "name" key')}if("link"===a.type){if(a.properties&&a.properties.href&&a.properties.type)return!0;throw new Error('Invalid CRS. Properties must contain "href" and "type" key')}throw new Error('Invald CRS. Type attribute must be "name" or "link"')}function e(a){a.geom={};for(var b in a)a.hasOwnProperty(b)&&-1!==k.indexOf(b)&&(a.geom[b]=a[b],delete a[b]);f(a.geom)}function f(a){for(var b in a)a.hasOwnProperty(b)&&("string"==typeof a[b]?l.push(a[b]):"object"==typeof a[b]&&(l.push(a[b][0]),l.push(a[b][1])));if(0===l.length)throw new Error("No geometry attributes specified")}function g(a,b,c){var d={type:"Feature"};return d.geometry=h(a,b),d.properties=c.call(a),d}function h(a,b){var c={};for(var d in b.geom){var e=b.geom[d];"string"==typeof e&&a.hasOwnProperty(e)?"GeoJSON"===d?c=a[e]:(c.type=d,c.coordinates=a[e]):Array.isArray(e)&&a.hasOwnProperty(e[0])&&a.hasOwnProperty(e[1])&&(c.type=d,c.coordinates=[Number(a[e[1]]),Number(a[e[0]])])}return c}function i(a){var b;return a.exclude||a.include?a.include?b=function(b){a.include.forEach(function(a){b[a]=this[a]},this)}:a.exclude&&(b=function(b){for(var c in this)this.hasOwnProperty(c)&&-1===l.indexOf(c)&&-1===a.exclude.indexOf(c)&&(b[c]=this[c])}):b=function(a){for(var b in this)this.hasOwnProperty(b)&&-1===l.indexOf(b)&&(a[b]=this[b])},function(){var c={};return b.call(this,c),a.extra&&j(c,a.extra),c}}function j(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}a.version="0.4.1",a.defaults={},a.parse=function(a,d,f){var h,j,k=b(d,this.defaults);return l.length=0,e(k),j=i(k),Array.isArray(a)?(h={type:"FeatureCollection",features:[]},a.forEach(function(a){h.features.push(g(a,k,j))}),c(h,k)):h=g(a,k,j),f&&"function"==typeof f?void f(h):h};var k=["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeoJSON"],l=[]}("object"==typeof module?module.exports:window.GeoJSON={});
!function(a){function b(){var a=1<=arguments.length?[].slice.call(arguments,0):[],b=a.shift(),c=a.shift();Error.apply(this,a),this.message=this.message||"Invalid Geometry: item: "+JSON.stringify(b)+", params: "+JSON.stringify(c)}function c(a,b){var c=a||{};for(var d in b)b.hasOwnProperty(d)&&!c[d]&&(c[d]=b[d]);return c}function d(a,b){if(b.crs&&e(b.crs)&&(b.isPostgres?a.geometry.crs=b.crs:a.crs=b.crs),b.bbox&&(a.bbox=b.bbox),b.extraGlobal){a.properties={};for(var c in b.extraGlobal)a.properties[c]=b.extraGlobal[c]}}function e(a){if("name"===a.type){if(a.properties&&a.properties.name)return!0;throw new Error('Invalid CRS. Properties must contain "name" key')}if("link"===a.type){if(a.properties&&a.properties.href&&a.properties.type)return!0;throw new Error('Invalid CRS. Properties must contain "href" and "type" key')}throw new Error('Invald CRS. Type attribute must be "name" or "link"')}function f(a){a.geom={};for(var b in a)a.hasOwnProperty(b)&&-1!==m.indexOf(b)&&(a.geom[b]=a[b],delete a[b]);g(a.geom)}function g(a){for(var b in a)a.hasOwnProperty(b)&&("string"==typeof a[b]?n.push(a[b]):"object"==typeof a[b]&&(n.push(a[b][0]),n.push(a[b][1])));if(0===n.length)throw new Error("No geometry attributes specified")}function h(a){var b=a.item,c=a.params,d=a.propFunc,e={type:"Feature"};return e.geometry=j(b,c),e.properties=d.call(b),e}function i(a){return/^.+\..+$/.test(a)}function j(c,d){var e={};for(var f in d.geom){var g=d.geom[f];if("string"==typeof g&&c.hasOwnProperty(g))"GeoJSON"===f?e=c[g]:(e.type=f,e.coordinates=c[g]);else if("object"!=typeof g||Array.isArray(g)){if(Array.isArray(g)&&c.hasOwnProperty(g[0])&&c.hasOwnProperty(g[1]))e.type=f,e.coordinates=[Number(c[g[1]]),Number(c[g[0]])];else if(Array.isArray(g)&&i(g[0])&&i(g[1])){for(var h=[],k=0;k<g.length;k++){for(var l=g[k].split("."),m=c,n=0;n<l.length;n++){if(!m.hasOwnProperty(l[n]))return!1;m=m[l[n]]}h[k]=m}e.type=f,e.coordinates=[Number(h[1]),Number(h[0])]}}else{var o=Object.keys(g).map(function(a){var b=g[a],d=c[a];return j(d,{geom:{Point:b}})});e.type=f,e.coordinates=[].concat(o.map(function(a){return a.coordinates}))}}if(d.doThrows&&d.doThrows.invalidGeometry&&!a.isGeometryValid(e))throw new b(c,d);return e}function k(a){var b;return a.exclude||a.include?a.include?b=function(b){a.include.forEach(function(a){b[a]=this[a]},this)}:a.exclude&&(b=function(b){for(var c in this)this.hasOwnProperty(c)&&-1===n.indexOf(c)&&-1===a.exclude.indexOf(c)&&(b[c]=this[c])}):b=function(a){for(var b in this)this.hasOwnProperty(b)&&-1===n.indexOf(b)&&(a[b]=this[b])},function(){var c={};return b.call(this,c),a.extra&&l(c,a.extra),c}}function l(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}a.version="0.5.0",a.defaults={doThrows:{invalidGeometry:!1}},b.prototype=Error,a.errors={InvalidGeometryError:b},a.isGeometryValid=function(a){return a&&Object.keys(a).length?!!a.type&&!!a.coordinates&&Array.isArray(a.coordinates)&&!!a.coordinates.length:!1},a.parse=function(a,b,e){var g,i,j=c(b,this.defaults);return n.length=0,f(j),i=k(j),Array.isArray(a)?(g={type:"FeatureCollection",features:[]},a.forEach(function(a){g.features.push(h({item:a,params:j,propFunc:i}))}),d(g,j)):(g=h({item:a,params:j,propFunc:i}),d(g,j)),e&&"function"==typeof e?void e(g):g};var m=["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeoJSON"],n=[]}("object"==typeof module?module.exports:window.GeoJSON={});

@@ -7,3 +7,3 @@ {

"keywords": "geojson",
"version": "0.4.1",
"version": "0.5.0",
"main": "./geojson",

@@ -14,3 +14,4 @@ "repository": {

},
"dependencies": {},
"dependencies": {
},
"devDependencies": {

@@ -17,0 +18,0 @@ "mocha": "*",

if (typeof window === 'undefined') {
var expect = require('expect.js');
var GeoJSON = require('../geojson');
var util = require('util');
}

@@ -21,3 +22,3 @@

expect(count).to.be(0);
expect(count).to.be(1);
});

@@ -410,3 +411,62 @@ });

});
it("throws via doThrows on InvalidGeometryError", function() {
var data = [{ lat: '39.343', lng: '-74.454'}];
expect(function(){
GeoJSON.parse(data, {doThrows: {invalidGeometry: true}, Point: 'lat'});
}).to.throwException(GeoJSON.InvalidGeometryError);
});
it("nested polygon", function() {
var data = {
northeast: { lat: 29.8399961, lng: -82.38140709999999 },
southwest: { lat: 29.7183041, lng: -82.555449 }
};
var output = GeoJSON.parse(data, {
doThrows: {invalidGeometry: true},
Polygon: {
northeast: ['lat', 'lng'],
southwest: ['lat', 'lng']
}
});
// console.log(util.inspect(output.geometry,4));
expect(output.geometry.type).to.be.equal('Polygon');
expect(output.geometry.coordinates.length).to.be.equal(2);
output.geometry.coordinates.forEach(function(coords){
expect(coords.length).to.be.equal(2);
});
expect(output.geometry.type).to.be.equal('Polygon');
expect(output.geometry.coordinates[0]).to.be.eql([-82.38140709999999, 29.8399961]);
expect(output.geometry.coordinates[1]).to.be.eql([-82.555449, 29.7183041]);
});
it("nested polygon, nested", function() {
var data = {
northeast: { crap:{lat: 29.8399961, lng: -82.38140709999999} },
southwest: { crap1:{lat: 29.7183041}, crap2: {lng: -82.555449} }
};
var output = GeoJSON.parse(data, {
doThrows: {invalidGeometry: true},
Polygon: {
northeast: ['crap.lat', 'crap.lng'],
southwest: ['crap1.lat', 'crap2.lng']
},
isPostgres: true,
crs: { 'type': 'name', 'properties': { 'name': 'urn:ogc:def:crs:OGC:1.3:CRS84' }}
});
// console.log(util.inspect(output.geometry,4));
expect(output.geometry.crs).to.be.ok();
expect(output.geometry.type).to.be.equal('Polygon');
expect(output.geometry.coordinates.length).to.be.equal(2);
output.geometry.coordinates.forEach(function(coords){
expect(coords.length).to.be.equal(2);
});
expect(output.geometry.type).to.be.equal('Polygon');
expect(output.geometry.coordinates[0]).to.be.eql([-82.38140709999999, 29.8399961]);
expect(output.geometry.coordinates[1]).to.be.eql([-82.555449, 29.7183041]);
});
});
});
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc