Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 运行AGStoShapefile.js时出错_Javascript_Node.js_Arcgis Js Api_Arcgis Server - Fatal编程技术网

Javascript 运行AGStoShapefile.js时出错

Javascript 运行AGStoShapefile.js时出错,javascript,node.js,arcgis-js-api,arcgis-server,Javascript,Node.js,Arcgis Js Api,Arcgis Server,我已经成功安装了AGStoShapefile,这是一个node.js脚本,可以将ESRI Geoservices转换为geojson和shapefile格式 github存储库就在这里 我遇到问题的具体的.js文件是 默认情况下,脚本接受一个包含服务和输出.shp、.json文件的输入txt文件。此services.txt位于AGStoShapefile目录中,在终端中,脚本运行正常,直到第154行,此时出现以下错误: node AGStoSHP.js info: Number of featu

我已经成功安装了AGStoShapefile,这是一个node.js脚本,可以将ESRI Geoservices转换为geojson和shapefile格式

github存储库就在这里 我遇到问题的具体的.js文件是

默认情况下,脚本接受一个包含服务和输出.shp、.json文件的输入txt文件。此services.txt位于AGStoShapefile目录中,在终端中,脚本运行正常,直到第154行,此时出现以下错误:

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
它继续

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)
知道为什么没有创建输出文件吗?我是node.js的新手

以下是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;
}
var ogr2ogr=require('ogr2ogr');
var esri2geo=需要('esri2geo');
var q=要求('q');
var request=q.nfbind(require('request'));
var objectstream=require('objectstream');
var fs=需要('fs');
var queryString=require('query-string');
var winston=require('winston');
//使用winston设置日志记录
winston.level='debug';
//add(winston.transports.File,{filename:'./logfile.log'});
///mixin.js
//将用户查询参数与默认值合并
var mixin=require('./mixin');
var serviceFile=process.argv[2]||“services.txt”;
var outDir=process.argv[3]| |'./output/;
if(outDir[outDir.length-1]!=='/')){
outDir+='/';
}
//向每项服务提出请求
fs.readFile(serviceFile,函数(err,data){
如果(错误){
温斯顿信息(错误);
犯错误;
}
data.toString().split('\n').forEach(函数(服务){
var service=service.split(“|”);
if(服务[0]。拆分(“”).length==0)返回;
var baseUrl=getBaseUrl(服务[0].trim())+'/query';
变量需求={
式中:'1=1',
仅此而已:是的,
f:‘json’
};
var userQS=getUrlVars(服务[0].trim());
//将一个obj与另一个obj混合
var qs=mixin(用户qs,需求qs);
var qs=queryString.stringify(qs);
var url=decodeURIComponent(getBaseUrl(baseUrl)+'/query/?'+qs);
请求({
url:url,
方法:“GET”,
json:true
},功能(错误、响应、正文){
var err=err | | body.error;
如果(错误){
温斯顿信息(错误);
犯错误;
}
requestService(服务[0].trim(),服务[1].trim(),body.objectId);
});
})
});
//来自AGS的Resquest JSON
函数requestService(serviceUrl、serviceName、ObjectId){
objectIds.sort();
info('服务的功能数量:',objectid.length);
info('获得100个功能块…');
var请求=[];
for(var i=0;i',(i*100),'out of',objectIds.length);
}否则{
info('等待请求解决…');
继续;
}
//我们需要这些查询参数
变量需求={
objectId:id.join(','),
geometryType:“esriGeometryEnvelope”,
这是真的,
returnIdsOnly:false,
外场:“*”,
outSR:'4326',
f:‘json’
};
//用户提供的查询参数
var userQS=getUrlVars(serviceUrl);
//将一个obj与另一个obj混合
var qs=mixin(用户qs,需求qs);
var qs=queryString.stringify(qs);
var url=decodeURIComponent(getBaseUrl(serviceUrl)+'/query/?'+qs);
var r=请求({
url:url,
方法:“GET”,
json:true
});
请求推送(r);
};
q、 所有已解决(请求)。然后(功能(结果){
winston.info(“所有请求已解决”);
var所有特征;
对于(var i=0;inode AGStoSHP.js services.txt ./myotherfolder/