Skip to content

Commit

Permalink
Merge pull request #15 from mapbox/latlng-properties
Browse files Browse the repository at this point in the history
Add latLngProperties option, default to removing parsed lat/lng from feature properties
  • Loading branch information
tmcw committed Sep 11, 2013
2 parents ea88517 + 81c6f9d commit aa46863
Show file tree
Hide file tree
Showing 11 changed files with 49 additions and 21 deletions.
23 changes: 14 additions & 9 deletions csv2geojson.js
@@ -1,5 +1,10 @@
(function(e){if("function"==typeof bootstrap)bootstrap("csv2geojson",e);else if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else if("undefined"!=typeof ses){if(!ses.ok())return;ses.makeCsv2geojson=e}else"undefined"!=typeof window?window.csv2geojson=e():global.csv2geojson=e()})(function(){var define,ses,bootstrap,module,exports;
return (function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({1:[function(require,module,exports){
return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
// nothing to see here... no file methods for the browser

},{}],"dsv":[function(require,module,exports){
module.exports=require('dvu7iV');
},{}],3:[function(require,module,exports){
var dsv = require('dsv'),
sexagesimal = require('sexagesimal');

Expand Down Expand Up @@ -113,6 +118,11 @@ function csv2geojson(x, options, callback) {
row: parsed[i]
});
} else {
if (!options.includeLatLon) {
delete parsed[i][lonfield];
delete parsed[i][latfield];
}

features.push({
type: 'Feature',
properties: parsed[i],
Expand Down Expand Up @@ -181,17 +191,12 @@ module.exports = {
toPolygon: toPolygon
};

},{"dsv":"kPifln","sexagesimal":2}],"dsv":[function(require,module,exports){
module.exports=require('kPifln');
},{}],"kPifln":[function(require,module,exports){
},{"dsv":"dvu7iV","sexagesimal":5}],"dvu7iV":[function(require,module,exports){
var fs = require("fs");

module.exports = new Function("dsv.version = \"0.0.2\";\n\ndsv.tsv = dsv(\"\\t\");\ndsv.csv = dsv(\",\");\n\nfunction dsv(delimiter) {\n var dsv = {},\n reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n]\"),\n delimiterCode = delimiter.charCodeAt(0);\n\n dsv.parse = function(text, f) {\n var o;\n return dsv.parseRows(text, function(row, i) {\n if (o) return o(row, i - 1);\n var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"]\";\n }).join(\",\") + \"}\");\n o = f ? function(row, i) { return f(a(row), i); } : a;\n });\n };\n\n dsv.parseRows = function(text, f) {\n var EOL = {}, // sentinel value for end-of-line\n EOF = {}, // sentinel value for end-of-file\n rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // the current line number\n t, // the current token\n eol; // is the current token followed by EOL?\n\n function token() {\n if (I >= N) return EOF; // special case: end of file\n if (eol) return eol = false, EOL; // special case: end of line\n\n // special case: quotes\n var j = I;\n if (text.charCodeAt(j) === 34) {\n var i = j;\n while (i++ < N) {\n if (text.charCodeAt(i) === 34) {\n if (text.charCodeAt(i + 1) !== 34) break;\n ++i;\n }\n }\n I = i + 2;\n var c = text.charCodeAt(i + 1);\n if (c === 13) {\n eol = true;\n if (text.charCodeAt(i + 2) === 10) ++I;\n } else if (c === 10) {\n eol = true;\n }\n return text.substring(j + 1, i).replace(/\"\"/g, \"\\\"\");\n }\n\n // common case: find next delimiter or newline\n while (I < N) {\n var c = text.charCodeAt(I++), k = 1;\n if (c === 10) eol = true; // \\n\n else if (c === 13) { eol = true; if (text.charCodeAt(I) === 10) ++I, ++k; } // \\r|\\r\\n\n else if (c !== delimiterCode) continue;\n return text.substring(j, I - k);\n }\n\n // special case: last token before EOF\n return text.substring(j);\n }\n\n while ((t = token()) !== EOF) {\n var a = [];\n while (t !== EOL && t !== EOF) {\n a.push(t);\n t = token();\n }\n if (f && !(a = f(a, n++))) continue;\n rows.push(a);\n }\n\n return rows;\n };\n\n dsv.format = function(rows) {\n if (Array.isArray(rows[0])) return dsv.formatRows(rows); // deprecated; use formatRows\n var fieldSet = {}, fields = [];\n\n // Compute unique fields in order of discovery.\n rows.forEach(function(row) {\n for (var field in row) {\n if (!(field in fieldSet)) {\n fields.push(fieldSet[field] = field);\n }\n }\n });\n\n return [fields.map(formatValue).join(delimiter)].concat(rows.map(function(row) {\n return fields.map(function(field) {\n return formatValue(row[field]);\n }).join(delimiter);\n })).join(\"\\n\");\n };\n\n dsv.formatRows = function(rows) {\n return rows.map(formatRow).join(\"\\n\");\n };\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(text) {\n return reFormat.test(text) ? \"\\\"\" + text.replace(/\\\"/g, \"\\\"\\\"\") + \"\\\"\" : text;\n }\n\n return dsv;\n}\n" + ";return dsv")();

},{"fs":3}],3:[function(require,module,exports){
// nothing to see here... no file methods for the browser

},{}],2:[function(require,module,exports){
},{"fs":1}],5:[function(require,module,exports){
module.exports = function(x, dims) {
if (!dims) dims = 'NSEW';
if (typeof x !== 'string') return null;
Expand All @@ -205,6 +210,6 @@ module.exports = function(x, dims) {
((m[4] && m[4] === 'S' || m[4] === 'W') ? -1 : 1);
};

},{}]},{},[1])(1)
},{}]},{},[3])(3)
});
;
5 changes: 5 additions & 0 deletions index.js
Expand Up @@ -111,6 +111,11 @@ function csv2geojson(x, options, callback) {
row: parsed[i]
});
} else {
if (!options.includeLatLon) {
delete parsed[i][lonfield];
delete parsed[i][latfield];
}

features.push({
type: 'Feature',
properties: parsed[i],
Expand Down
2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "csv2geojson",
"version": "3.4.1",
"version": "3.5.1",
"description": "convert CSV files to GeoJSON",
"main": "index.js",
"repository": {
Expand Down
9 changes: 8 additions & 1 deletion test/csv2geojson.js
Expand Up @@ -84,6 +84,13 @@ describe('csv2geojson', function() {
});
});

it('with includeLatLon option', function(done) {
csv2geojson.csv2geojson(textFile('includeLatLon.csv'), { includeLatLon: true }, function(err, data) {
expect(data).to.eql(jsonFile('includeLatLon.geojson'));
done();
});
});

describe('delimiters', function() {
it('|', function(done) {
csv2geojson.csv2geojson(textFile('simple.pipe.dsv'), { delimiter: '|' },
Expand Down Expand Up @@ -155,7 +162,7 @@ describe('csv2geojson', function() {
type: 'FeatureCollection',
features: [{
type: 'Feature',
properties: { name: '3', y: '1', x: '2' },
properties: { name: '3' },
geometry: {
type: 'Point',
coordinates: [2, 1]
Expand Down
2 changes: 1 addition & 1 deletion test/data/degrees.geojson
@@ -1 +1 @@
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"lat":"23°N","lon":"26°W","name":"Chester"},"geometry":{"type":"Point","coordinates":[-26,23]}}]}
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"name":"Chester"},"geometry":{"type":"Point","coordinates":[-26,23]}}]}
2 changes: 2 additions & 0 deletions test/data/includeLatLon.csv
@@ -0,0 +1,2 @@
lat,lng,name
1,2,3
15 changes: 15 additions & 0 deletions test/data/includeLatLon.geojson
@@ -0,0 +1,15 @@
{
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"properties": {
"lat": "1",
"lng": "2",
"name": "3"
},
"geometry": {
"type": "Point",
"coordinates": [2, 1]
}
}]
}
4 changes: 1 addition & 3 deletions test/data/lng.geojson
Expand Up @@ -3,9 +3,7 @@
"features": [{
"type": "Feature",
"properties": {
"name": "3",
"lat": "1",
"lng": "2"
"name": "3"
},
"geometry": {
"type": "Point",
Expand Down
2 changes: 1 addition & 1 deletion test/data/minutes.geojson
@@ -1 +1 @@
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"lat":"40° 11′","lon":"40° 11' 15\"","name":"Chester"},"geometry":{"type":"Point","coordinates":[40.1875,40.18333333333333]}}]}
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"name":"Chester"},"geometry":{"type":"Point","coordinates":[40.1875,40.18333333333333]}}]}
4 changes: 1 addition & 3 deletions test/data/simple.geojson
Expand Up @@ -3,9 +3,7 @@
"features": [{
"type": "Feature",
"properties": {
"name": "3",
"lat": "1",
"lon": "2"
"name": "3"
},
"geometry": {
"type": "Point",
Expand Down
2 changes: 0 additions & 2 deletions test/data/simple_space.geojson
Expand Up @@ -3,8 +3,6 @@
"features": [{
"type": "Feature",
"properties": {
" lat": "1",
" lon": "2",
" name": "3"
},
"geometry": {
Expand Down

0 comments on commit aa46863

Please sign in to comment.