Snippets

Piotr Szrajber Smart M.App - Prepare BI Data (external utility for Node.js)

Created by Piotr Szrajber last modified
/*
* Prepare Smart M.App BI Data
* 2017-06-02 Piotr Szrajber <piotr.szrajber@hexagongeospatial.com>
*
* Requirements: Node.js, "shapefile" dependency
* (> npm i --save shapefile) 
*
* Installation: 
* save this file as prepare_bi_data.js
* 
* Usage:
* > node prepare_bi_data.js <your_folder_with_shapefile> <output_name_without_extension>
*
* Note: this version supports only one shapefile & dbf in the folder. Their names must match
*
* Example:
* > node prepare_bi_data.js ./shapefiles/ Segments_optimized
*
* Output:
* two files Segments_optimized.geojson and Segments_optimized.csv
*/

// BEGIN Edit to match your data

var columns = "ID2,NetworkLev,A_CATEGORY,V_CATEGORY,Network_st,PSID".split(",");

var processors = {
	NetworkLev: function(v) {
		return {Primary:0, Secondary:1}[v];
	},
	A_CATEGORY: function (v) {
		return {OK:0,WARNING:1,ALARM:2}[v];
	},
	V_CATEGORY: function (v) {
		return {OK:0,WARNING:1,ALARM:2}[v];
	},
	Network_st: function (v) {
		return {OK:0,WARNING:1,ALARM:2,"Not Measured":3}[v];
	},
	V_REL: function (v) {
		return +v.replace(/[^\d]/,"");
	}
};

// END Edit to match your data


var shapefile = require("shapefile");
var fs = require("fs");
var path = process.argv[2];
var outputName = process.argv[3] || "output";
var key_property = "ID2"; //TODO: hardcoded

// https://bitbucket.org/snippets/pszrajbe/6nn9d/geojson-to-csv
function geojson2csv(x, header, processors) {
    var header = header || Object.keys(x.features[0].properties);
    return [header].concat(x.features.map(function(feature) {
        return header.map(function(col) {
			var value = feature.properties[col];
			if (processors && processors[col]) {
				value = processors[col](value);
			}
            return value;
        }).join(",");
    })).join("\n");
}

fs.readdir(path, (err, files) => {
	var shp = files.find(file => /.shp$/i.test(file));
	var dbf = files.find(file => /.dbf$/i.test(file) && shp.replace(/.shp$/i,"").toLowerCase() == file.replace(/.dbf$/i,"").toLowerCase());
	console.log(shp, dbf);
	shapefile.read(path + shp, path + dbf).then(json => {
		var csv = geojson2csv(json, columns, processors);
		fs.writeFile(`${outputName}.csv`, csv);

		json.features = json.features.map(function (feature) {
			return {
				type: "Feature",
				geometry: feature.geometry,
				properties: {
					ID2: feature.properties[key_property]
				}
			};
		});
		fs.writeFile(`${outputName}.geojson`, JSON.stringify(json));
	});
});

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.