美文网首页
AGS JS开发-地图服务中点数据的导出

AGS JS开发-地图服务中点数据的导出

作者: 辛立 | 来源:发表于2017-03-26 09:17 被阅读0次

    地图服务中点数据的导出


    1.为什么要导出地图服务中的数据

    有这个想法的起因是前端时间在做一个demo的时候,用到了一份ArcGIS Online的要素服务。做完之后觉得这份数据挺不错的,想着以后可以用到其他地方,但考虑到总联网不太方便,那个时候就想着有没有简便的方法可以把人家服务的数据离线下来。现在重新整理了下思路,找了一个更简洁的方法来实现。

    2.导出实现思路

    导出的主要思路是调用地图服务的query查询功能,将查询结果输出到控制台来实现。但需要注意的是,ArcGIS Server发布服务的时候,默认设置的最大返回记录数是1000,什么意思?意思是query查询只会返回1000条结果。这不是我导出的本意,我要的是全部数据,所以我们首先要解决这个1000的限制问题。详细的实现步骤如下:

    1. 创建网格
      这里为了解决1000条限制的问题,采用的是分块的思路,即将地图划分成规则的网格,保证网格中包含的地图服务的数据量不会超过限制。关于如何保证不超限的问题,请看后面解释。
    2. 按每个格子执行query查询
      划分好格子之后,下一步就是按格子范围来执行query查询了。为了解决前面说的保证不超限问题,将query查询结果总数打印出来就知道了,总数如果超过了地图服务设置的限制数,重新调整网格大小就行了。不知道如何查询地图服务设置的限制数的请脑补ArcGIS在线帮助。
    3. 将查询结果按逗号隔开输出到控制台
      将query查询结果逐条输出,每条结果对应的就是数据表中的一行记录,当然还需要将x、y坐标也输出。属性值与属性值间用逗号隔开,是方便将结果保存为CSV文件。
    4. 将CSV文件转换成空间格式
      有了CSV文件就好说了,ArcMap能将其转成空间格式,Portal还能直接发服务。

    3.导出功能实现

    (1)创建网格

    //生成规则的网格
    function createGrids(minx,miny,maxx,maxy,cellCount){
        var stepX = (maxx - minx)/cellCount;
        var stepY = (maxy - miny)/cellCount;
    
        var extents = [];
        for(var i=0;i<cellCount;i++){
            var newMinx = minx + i*stepX;
            var newMaxx = minx + (i+1)*stepX;
            for(var j=0;j<cellCount;j++){
                var newMiny = miny + j*stepY;
                var newMaxy = miny + (j+1)*stepY;
    
                var extent = new Extent(newMinx,newMiny,newMaxx,newMaxy);
                extents.push(extent);
            }
        }
    
        return extents;
    }
    

    (2)执行query查询

    function queryBtnHandler(){
        var queryUrl = dom.byId("mapserviceUrl").value;
    
        allFeatures = [];
        numCounts = [];
        map.graphics.clear();
    
        //创建网格
        var gridNum = parseInt(dom.byId("gridNum").value);
        var extents = createGrids(map.extent.xmin,map.extent.ymin,map.extent.xmax,map.extent.ymax,gridNum);
        var sls = new SimpleLineSymbol("solid", [128,128,128], 1.5);
        var sfs = new SimpleFillSymbol("solid", sls, null);
        //每个网格执行一个query查询
        for(var i=0;i<extents.length;i++){
            var gp = new Graphic(extents[i],sfs);
            map.graphics.add(gp);
    
            var query = new Query();
            query.outFields = ["*"];
            query.where = "1=1";
            query.returnGeometry = true;
            query.geometry = extents[i];
    
            var queryTask = new QueryTask(queryUrl);
            queryTask.execute(query, function (featureSet) {
                console.log("query查询条数:"+featureSet.features.length);
                numCounts.push(featureSet.features.length);
    
                for(var j=0;j<featureSet.features.length;j++){
                    var feature = featureSet.features[j];
                    allFeatures.push(feature);
                }
             });
        }
    }
    

    (3)输出结果

    function exportAllFeaturesBtnHandler(){
        var sum=0;
        for(var k=0;k<numCounts.length;k++){
            sum += numCounts[k];
        }
        console.log("query返回的总个数:"+sum);
        console.log("返回的feature是总数:"+allFeatures.length);
    
        if(allFeatures.length>0){
            //输出key值
            var keyNames = "x,y,";
            for(var keyName in allFeatures[0].attributes){
                keyNames += keyName+",";
            }
            console.log(keyNames.substr(0,keyNames.length-1));
        }
    
        //输出所有的要素信息
        for(var j=0;j<allFeatures.length;j++){
            var ptStrs = allFeatures[j].geometry.x+","+allFeatures[j].geometry.y+",";
            for(var key in allFeatures[j].attributes){
                ptStrs += allFeatures[j].attributes[key]+",";
            }
    
             console.log(ptStrs.substr(0,ptStrs.length-1));
        }
    }
    

    4.小结

    1. 由于query是异步执行的,所以需要为每个格子查询创建单独的Query和QueryTask,才不会导致相互干扰。
    2. 也正由于query是异步执行的,所有查询功能是按类似多线程在运行。

    5.源码

    地图服务中点数据的导出

    相关文章

      网友评论

          本文标题:AGS JS开发-地图服务中点数据的导出

          本文链接:https://www.haomeiwen.com/subject/ubkrgttx.html