2016-10-28 1 views
0

J'ai correctement installé le fichier AGStoShapefile, qui est un script node.js qui convertit les services Geoservices ESRI en formats geojson et shapefile.erreur en cours d'exécution AGStoShapefile.js

Le dépôt GitHub est ici https://github.com/tannerjt/AGStoShapefile et le fichier .js spécifique que j'ai le problème avec est https://github.com/tannerjt/AGStoShapefile/blob/master/AGStoSHP.js

Par défaut, le script prend une entrée txt fichier avec les services et les sorties, les fichiers SHP .json . Cette services.txt se trouve dans le répertoire AGStoShapefile, et dans le terminal le script fonctionne parfaitement jusqu'à ce que la ligne 154, à quel point l'erreur suivante apparaît:

node AGStoSHP.js 
info: Number of features for service: 225 
info: Getting chunks of 100 features... 
info: query -> 0 out of 225 
info: query -> 100 out of 225 
info: query -> 200 out of 225 
info: Number of features for service: 8258 
info: Getting chunks of 100 features... 
info: query -> 0 out of 8258 
info: query -> 100 out of 8258 
info: query -> 200 out of 8258 
info: query -> 300 out of 8258 
info: query -> 400 out of 8258 
info: query -> 500 out of 8258 
info: query -> 600 out of 8258 
info: query -> 700 out of 8258 
info: query -> 800 out of 8258 
info: query -> 900 out of 8258 

continue ...

info: query -> 7100 out of 8258 
info: query -> 7200 out of 8258 
info: query -> 7300 out of 8258 
info: query -> 7400 out of 8258 
info: query -> 7500 out of 8258 
info: query -> 7600 out of 8258 
info: query -> 7700 out of 8258 
info: query -> 7800 out of 8258 
info: query -> 7900 out of 8258 
info: query -> 8000 out of 8258 
info: query -> 8100 out of 8258 
info: query -> 8200 out of 8258 
info: all requests settled 
info: creating WildFire json 
info: Creating Esri JSON 
info: Creating GeoJSON 
info: Creating Shapefile 
events.js:154 
     throw er; // Unhandled 'error' event 
    ^

Error: ENOENT: no such file or directory, open './output/WildFire.json' 
    at Error (native) 

Une idée de pourquoi les fichiers de sortie ne sont pas créés? Je suis assez nouveau pour Node.js

Voici le fichier AGStoSHP.js:

var ogr2ogr = require('ogr2ogr'); 
var esri2geo = require('esri2geo'); 
var q = require('q'); 
var request = q.nfbind(require('request')); 
var objectstream = require('objectstream'); 
var fs = require('fs'); 
var queryString = require('query-string'); 
var winston = require('winston'); 

// Setup logging with winston 
winston.level = 'debug'; 
// winston.add(winston.transports.File, {filename: './logfile.log'}); 

// ./mixin.js 
// merge user query params with default 
var mixin = require('./mixin'); 

var serviceFile = process.argv[2] || 'services.txt'; 
var outDir = process.argv[3] || './output/'; 
if(outDir[outDir.length - 1] !== '/') { 
    outDir += '/'; 
} 

// Make request to each service 
fs.readFile(serviceFile, function (err, data) { 
    if (err) { 
     winston.info(err); 
     throw err; 
    } 
    data.toString().split('\n').forEach(function (service) { 
     var service = service.split('|'); 
     if(service[0].split('').length == 0) return; 
     var baseUrl = getBaseUrl(service[0].trim()) + '/query'; 

     var reqQS = { 
      where: '1=1', 
      returnIdsOnly: true, 
      f: 'json' 
     }; 
     var userQS = getUrlVars(service[0].trim()); 
     // mix one obj with another 
     var qs = mixin(userQS, reqQS); 
     var qs = queryString.stringify(qs); 
     var url = decodeURIComponent(getBaseUrl(baseUrl) + '/query/?' + qs); 

     request({ 
      url : url, 
      method : 'GET', 
      json : true 
     }, function (err, response, body) { 
      var err = err || body.error; 
      if(err) { 
       winston.info(err); 
       throw err; 
      } 
      requestService(service[0].trim(), service[1].trim(), body.objectIds); 
     }); 
    }) 
}); 

// Resquest JSON from AGS 
function requestService(serviceUrl, serviceName, objectIds) { 
    objectIds.sort(); 
    winston.info('Number of features for service: ', objectIds.length); 
    winston.info('Getting chunks of 100 features...'); 
    var requests = []; 

    for(var i = 0; i < Math.ceil(objectIds.length/100); i++) { 
     var ids = []; 
     if (((i + 1) * 100) < objectIds.length) { 
      ids = objectIds.slice(i * 100, (i * 100) + 100); 
     } else { 
      ids = objectIds.slice(i * 100, objectIds[objectIds.length]); 
     } 

     if(ids[0] !== undefined) { 
      winston.info('query ->', (i * 100) , 'out of', objectIds.length); 
     } else { 
      winston.info('wait for requests to settle...'); 
      continue; 
     } 

     // we need these query params 
     var reqQS = { 
      objectIds : ids.join(','), 
      geometryType : 'esriGeometryEnvelope', 
      returnGeometry : true, 
      returnIdsOnly : false, 
      outFields : '*', 
      outSR : '4326', 
      f : 'json' 
     }; 
     // user provided query params 
     var userQS = getUrlVars(serviceUrl); 
     // mix one obj with another 
     var qs = mixin(userQS, reqQS); 
     var qs = queryString.stringify(qs); 
     var url = decodeURIComponent(getBaseUrl(serviceUrl) + '/query/?' + qs); 
     var r = request({ 
      url : url, 
      method : 'GET', 
      json : true 
     }); 

     requests.push(r); 
    }; 

    q.allSettled(requests).then(function (results) { 
     winston.info('all requests settled'); 
     var allFeatures; 
     for(var i = 0; i < results.length; i++) { 
      if(i == 0) { 
       allFeatures = results[i].value[0].body; 
      } else { 
       allFeatures.features = allFeatures.features.concat(results[i].value[0].body.features); 
      } 
     } 
     winston.info('creating', serviceName, 'json'); 
     var json = allFeatures; 

     //esri json 
     winston.info('Creating Esri JSON'); 
     var stream = fs.createWriteStream(outDir + serviceName + '.json'); 
     var objstream = objectstream.createSerializeStream(stream); 
     objstream.write(json); 
     objstream.end(); 

     //geojson 
     winston.info('Creating GeoJSON'); 
     var stream = fs.createWriteStream(outDir + serviceName + '.geojson'); 
     var objstream = objectstream.createSerializeStream(stream); 
     esri2geo(json, function (err, data) { 
      if(err) { 
       throw(err); 
       winston.info('Error converting esri json to geojson'); 
       return; 
      } 
      objstream.write(data); 
      objstream.end(); 
      winston.info('Creating Shapefile'); 
      //shapefile 
      var shapefile = ogr2ogr(data) 
       .format('ESRI Shapefile') 
       .options(['-nln', serviceName]) 
       .skipfailures(); 
      shapefile.stream().pipe(fs.createWriteStream(outDir + serviceName + '.zip')); 
     }); 

    }).catch(function (err) { 
     winston.info(err); 
     throw err; 
    }); 
} 


//http://stackoverflow.com/questions/4656843/jquery-get-querystring-from-url 
function getUrlVars(url) { 
    var vars = {}, hash; 
    var hashes = url.slice(url.indexOf('?') + 1).split('&'); 
    for(var i = 0; i < hashes.length; i++) 
    { 
     hash = hashes[i].split('='); 
     vars[hash[0].toString()] = hash[1]; 
    } 
    return vars; 
} 

// get base url for query 
function getBaseUrl(url) { 
    // remove any query params 
    var url = url.split("?")[0]; 
    if((/\/$/ig).test(url)) { 
     url = url.substring(0, url.length - 1); 
    } 
    return url; 
} 

Répondre

1

Je suis le responsable de ce dépôt GitHub. Le script suppose que le dossier de sortie est déjà créé. Vous pouvez essayer de créer un dossier appelé sortie, ou manuellement en spécifiant votre propre emplacement de sortie et le fichier texte des services d'entrée comme suit:

node AGStoSHP.js services.txt ./myotherfolder/