如何查询所有记录(> 1000)并导出到csv?


13

我在arcgis论坛上发布了,但是没有得到任何答案。谁能告诉我如何解决这个问题?

假设您有10月1日至12月31日的车辆追踪记录,其中包含风速信息。所有数据都保存在地理数据库(sde-sqlserver)中,并保存在ArcGIS Server 10.1中作为要素图层。时间滑块以风速显示汽车的位置。

当用户更改时间范围(例如10月2日-10月4日)时,第一个查询任务(用于计数)将计算该范围内的要素数量。即使两天(例如1750),通常也有1000多个结果(不过,我不想更改此限制)。

我使用了另一个查询任务(executeforIds)来保留所有记录,但减少模量(1/10)的数量,该数量仍然足以为风速的总体趋势绘制漂亮的图表。但是,我还想提供一个选项来下载csv中的整个数据集(在这种情况下为1750行)

在这里,我使用findtask来检索时间范围内的属性数据集。

try {
    //console.log(app.objIDs);
    var attribs;
    csvdata = "";

    var find = new esri.tasks.FindTask("http://xyz.com/arcgis/rest/services/Realtime/Car_Wind_WM/MapServer");
    var params = new esri.tasks.FindParameters();
    params.layerIds = [0];
    params.searchFields = ["OBJECTID"];

    for (var i = 0; i < app.objIDs.length; i++) {
        params.searchText = app.objIDs[i];
        find.execute(params, function (results) {
            attribs = results[0].feature.attributes;
            csvdata += attribs.Date_Central + ',' + attribs.Longitude + "," + attribs.Latitude + "," + attribs.windspeed + "\n";
            console.log(csvdata); //1
        }, function (error) {
            alert("Error");
        });
    }
} catch (error) {
    alert("Change the time range first");
}
console.log(csvdata); //2
setTimeout(function () {
    formatData(app.csvdata);
}, (3 * 1000));

尽管所有csvdata(在console.log1中)都在console中显示数据,但在console.log2中csvdata是未定义的。问题似乎是find.execute完成的时机,所以我添加了setTimeout。

这似乎可行,但是当我增加时间范围时,显然不会。

是否有将所有记录(1000-200,000)保留在特定时间范围内并导出到csv的方法?

Answers:


6

一种选择是让系统将记录返回给您。即使只返回1000的数据,它也会为您提供所有1750行的记录号。

当您获得记录列表(不确定它们是否已排序)时,请取出前1000条记录,然后将第一个和最后一个OBJECTID添加到其中

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

根据需要重复多次。


6

我建议使用QueryTask并设置returnIdsOnly = true

请注意,虽然功能集响应中包含的功能数量有限制,但ID数组响应中返回的对象ID数量没有限制。客户端可以通过指定returnIdsOnly = true并随后请求对象ID的子集功能集来利用它来获取所有符合查询条件的对象ID。

可以在Javascript api的QueryTask中找到

Silverlight API的Query也支持它。

如果使用的是本机SQL Server空间数据类型,而不使用版本控制,则可以考虑仅使用模板作为起点编写Microsoft REST服务。


没意识到这一点-太好了!在第一行中,您的意思是returnIdsOnly = true对吗?
awesomo

糟糕,是的,我现在更改了答案。
柯克·库肯达尔

谢谢柯克。我知道Sliverlight API中的“ returnIdsOnly = true”,但是正如您提到的,我在Javascript API中找不到。我将检查MS REST。
user14693 2013年

5
  1. 如果要处理点和耦合属性,则可以将服务记录限制提高到10k或更多,尤其是在不生成图形的情况下。

  2. 您可以执行异步地理处理任务,并在服务器上的输出文件夹中生成之后拾取数据。

  3. 如果在查询中抛出order by子句和时间。您也许可以读取最后一条记录中的时间,并获得比该时间更大的下一组记录。继续努力直到到达时间范围的尽头。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.