Comparing version 0.4.1 to 0.5.0
(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 @@ } |
@@ -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]); | ||
}); | ||
}); | ||
}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
43302
681