Merge pull request #98 from amercader/master

Make easier to plot GeoJSON geometries, eg from CSV files
This commit is contained in:
Adrià Mercader
2012-04-23 10:34:41 -07:00
5 changed files with 50 additions and 16 deletions

View File

@@ -141,6 +141,13 @@
<input type="text" name="separator" value="," class="spam1"/>
</div>
</div>
<div class="control-group">
<label class="control-label">Text delimiter</label>
<div class="controls">
<input type="text" name="delimiter" value='"' />
</div>
</div>
<div class="control-group">
<label class="control-label">Encoding</label>
<div class="controls">

View File

@@ -128,6 +128,7 @@ var ExplorerApp = Backbone.View.extend({
var file = $file.files[0];
var options = {
separator : $form.find('input[name="separator"]').val(),
delimiter : $form.find('input[name="delimiter"]').val(),
encoding : $form.find('input[name="encoding"]').val()
};
recline.Backend.loadFromCSVFile(file, function(dataset) {

View File

@@ -58,6 +58,8 @@ this.recline.Backend = this.recline.Backend || {};
var options = options || {};
var trm = options.trim;
var separator = options.separator || ',';
var delimiter = options.delimiter || '"';
var cur = '', // The character we are currently processing.
inQuote = false,
@@ -105,8 +107,8 @@ this.recline.Backend = this.recline.Backend || {};
field = '';
fieldQuoted = false;
} else {
// If it's not a ", add it to the field buffer
if (cur !== '"') {
// If it's not a delimiter, add it to the field buffer
if (cur !== delimiter) {
field += cur;
} else {
if (!inQuote) {
@@ -114,9 +116,9 @@ this.recline.Backend = this.recline.Backend || {};
inQuote = true;
fieldQuoted = true;
} else {
// Next char is ", this is an escaped "
if (s.charAt(i + 1) === '"') {
field += '"';
// Next char is delimiter, this is an escaped delimiter
if (s.charAt(i + 1) === delimiter) {
field += delimiter;
// Skip the next char
i += 1;
} else {

View File

@@ -344,8 +344,14 @@ my.Map = Backbone.View.extend({
_getGeometryFromDocument: function(doc){
if (this.geomReady){
if (this.state.get('geomField')){
var value = doc.get(this.state.get('geomField'));
if (typeof(value) === 'string'){
// We have a GeoJSON string representation
return $.parseJSON(value);
} else {
// We assume that the contents of the field are a valid GeoJSON object
return doc.attributes[this.state.get('geomField')];
return value;
}
} else if (this.state.get('lonField') && this.state.get('latField')){
// We'll create a GeoJSON like point object from the two lat/lon fields
var lon = doc.get(this.state.get('lonField'));
@@ -353,10 +359,7 @@ my.Map = Backbone.View.extend({
if (lon && lat) {
return {
type: 'Point',
coordinates: [
doc.attributes[this.state.get('lonField')],
doc.attributes[this.state.get('latField')]
]
coordinates: [lon,lat]
};
}
}
@@ -440,7 +443,12 @@ my.Map = Backbone.View.extend({
this.features.getBounds = function(){
var bounds = new L.LatLngBounds();
this._iterateLayers(function (layer) {
bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds());
if (layer instanceof L.Marker){
bounds.extend(layer.getLatLng());
} else {
bounds.extend(layer.getBounds().getNorthEast());
bounds.extend(layer.getBounds().getSouthWest());
}
}, this);
return (typeof bounds.getNorthEast() !== 'undefined') ? bounds : null;
}

View File

@@ -44,4 +44,20 @@ test("parseCSVsemicolon", function() {
});
test("parseCSVdelimiter", function() {
var csv = "'Jones, Jay',10\n" +
"'Xyz \"ABC\" O''Brien',11:35\n" +
"'Other; AN',12:35\n";
var array = recline.Backend.parseCSV(csv, {delimiter:"'"});
var exp = [
["Jones, Jay", 10],
["Xyz \"ABC\" O'Brien", "11:35" ],
["Other; AN", "12:35" ]
];
deepEqual(exp, array);
});
})(this.jQuery);